APP v0 API reference

Generated from openapi.yaml (2026-10-10). Every route is POST {gateway}/a2a/v0/{route} with JSON, signed with your key: Authorization: Bearer <key>, X-Timestamp (unix seconds, 5-minute window), X-Signature = hex(HMAC-SHA256(key, timestamp + "." + rawBody)); Idempotency-Key on order. Responses carry X-Request-Id. Keys, sandbox users and webhooks: portal. SDKs: JavaScript, Python.

Okidooki NightNowTrustMakeItFunSchemas

Okidooki Night

Venues (table reservations, free entry at partner venues) and events (tickets) across cities. Settlement in the Okidooki app.

Gatewayhttps://europe-west1-okidooki-nightlife.cloudfunctions.net/a2aGateway
Agent cardhttps://europe-west1-okidooki-nightlife.cloudfunctions.net/a2aGateway/card
Google A2A card / JSON-RPChttps://okidooki.app/.well-known/agent.json · https://okidooki.app/a2a
MCP serverhttps://okidooki.app/mcp
Keysok_a2a_live_… / ok_a2a_test_… from the portal
HealthGET https://europe-west1-okidooki-nightlife.cloudfunctions.net/a2aGateway/a2a/v0/health · status page

Routes on this network (33): /card · discover · quote · order · orders · status · cancel · link/status · connect/start · connect/status · venues/menu · venues/live · drinks/cheapest · offerings · menu/quote · guestlist/join · guestlist/leave · promotions · promotions/claim · checkin · djs · djs/book · djs/bookings · djs/cancel · tickets · reservations · reservations/cancel · reviews · friends/nearby · profile · gifts/send · link/confirm · link/revoke

GET /card

Agent card (Okidooki, MakeItFun). NowTrust serves it at /a2a/v0/card and a Google A2A card at /.well-known/agent.json.

No body.

Response 200

Card → Card

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/discover

What the network sells (sellers), or one seller in depth (sellerId). MakeItFun also lists occasion templates (occasions:true).

Request body
fieldtypedescription
sellerIdstring
productTypestringMakeItFun: tshirt, hoodie, cap, mug, poster, bag, phone_case, sticker, bottle, blanket, patch, tank, polo, tote, pillow, mousepad
stylesbooleanMakeItFun: all curated looks (Design Curator) with cached preview pictures
suggestobjectMakeItFun: top looks for a product type / occasion / vibe / city / event
fieldtypedescription
productTypestring
occasionstring
vibestring
citystring
eventobject
countinteger
querystring
categoryIdinteger
countrystring (default CH)
occasionsboolean
slotsobject
cityNamestringOkidooki: city (or near / cityId)
nearobject
fieldtypedescription
latnumber
lngnumber
kindstringNowTrust: guard
partySizeintegerNowTrust: guests to protect (1-5000); sizes the team
intentstringNowTrust: birthday | party | corporate | event | wedding | club | vip | escort | home | shop (maps to a security type)
securityTypestring: event_security | bodyguard | nightclub_security | private_property | escort_securityNowTrust: explicit type (wins over intent)
nowbooleanNowTrust: available right now
limitinteger
Response 200

Sellers

fieldtypedescription
sellersSeller[]

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/quote

Firm price (30 minutes) for a seller/variant/design and the linked user's situation (address, mandate).

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
sellerIdstringNowTrust: guard:<id> or company:<id> from discover; MakeItFun: product:<id>; Okidooki: venue:<id> / event:<id>
designIdstringMakeItFun: from preview
variantIdinteger
quantityinteger
teamobject[]MakeItFun: one unit per member with name/number printed; size = that member's own size (same colour), priced per size
teamPlacementstring
shippingMethodstring
durationHoursnumberNowTrust: booking length
whenstringNowTrust: start (ISO 8601, not in the past, within the booking horizon)
locationobjectNowTrust: where the guard is needed
fieldtypedescription
latnumber
lngnumber
addressstring
intentstringNowTrust: see discover
securityTypestring: event_security | bodyguard | nightclub_security | private_property | escort_security
Response 200

Quote → Quote

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/order

Place the order for a quote. The user confirms/pays in the seller's app (confirmUrl); poll status.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
quoteId requiredstring
notestring
Response 200

Order → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/orders

Latest orders of the user placed with this key.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
limitinteger
Response 200

Orders

fieldtypedescription
ordersOrder[]

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/status

Order status (payment, production, tracking).

Request body
fieldtypedescription
orderId requiredstring
userRefUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
Response 200

Order → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/cancel

Cancel (free before payment / production; refund rules per network).

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
orderId requiredstring
Response 200

Order → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/connect/start

Okidooki gateway. Universal "Connect with Okidooki" for your user on several networks at once (one page, one mandate).

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
networksstring: okidooki | nowtrust | makeitfun[]
displayNamestring
mandateMandateLimits the user set for THIS agent (okidooki.app/webapp/connect). Amounts in centimes; null = no limit.
fieldtypedescription
perOrderMaxinteger | null
monthlyMaxinteger | null
capabilitiesarray | nullnull = everything the network offers
validUntilstring | null
autoApprovebooleanNowTrust: bookings within the limits settle without a tap
spentThisMonthinteger
remainingThisMonthinteger | null
expiredboolean
Response 200

Connect (status pending; url for the user) → Connect

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/connect/status

Okidooki gateway. Outcome of a connect (poll every 10 s); after approved use link/status on each network.

Request body
fieldtypedescription
connectIdstring
userRefUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
Response 200

Connect → Connect

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/venues/menu

Drink or food menu of a venue with prices and item ids

Request body
Response 200

{ venue, count, items: [{ id, name, price, currency, category }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/venues/live

Live city pulse: venues ranked by people checked in now, tonight's events, live promotions, friends out

Request body
Response 200

{ venues: [{ id, name, checkedInNow, trend, ... }], events, promotions, friendsOut }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/drinks/cheapest

Cheapest drinks across the city's venues

Request body
Response 200

{ count, drinks: [{ venueId, venue, name, price, currency }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/offerings

What can be bought at a venue (menu items) or an event (ticket tiers)

Request body
Response 200

{ items: [{ id, name, price, currency }] } or { tiers: [{ ticketTypeId, name, price, available }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/menu/quote

Price a drinks/food basket for the linked user; payment happens in the app on the venue page (confirmUrl)

Request body
Response 200

{ lines, totalCents, currency, needs_user_confirmation: true, confirmUrl, appUrl }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/guestlist/join

Put the linked user on an event's guest list (mandate capability guestlist)

Request body
Response 200

{ ok, status, entryId?, waitlisted? } or userLinks when the event needs in-app action

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/guestlist/leave

Remove the linked user from an event's guest list

Request body
Response 200

{ ok }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/promotions

Live and upcoming free-of-charge offers (FOC) in the city

Request body
Response 200

{ count, promotions: [{ id, title, venue, reward, startsAt, endsAt, remaining }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/promotions/claim

Claim a promotion for the linked user; the venue approves, the QR shows in the app (capability promotions)

Request body
Response 200

{ ok, claimId, message }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/checkin

Check the linked user in at a venue (capability checkin)

Request body
Response 200

{ ok, venue }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/djs

Bookable DJs and artists with ids

Request body
Response 200

{ count, djs: [{ id, stageName, genres, city, rate }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/djs/book

DJ booking request for the linked user; the DJ answers with a price in the app (capability book_dj)

Request body
Response 200

{ bookingId, status: requested, dj, date, time, userLinks }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/djs/bookings

The linked user's DJ booking requests

Request body
Response 200

{ count, bookings: [{ bookingId, djId, djStageName, date, time, status, price? }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/djs/cancel

Cancel a DJ booking request

Request body
Response 200

{ bookingId, status: cancelled }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/tickets

The linked user's purchased tickets

Request body
Response 200

{ count, tickets: [{ id, eventId, eventName, tier, status, qr? }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/reservations

The linked user's upcoming table reservations

Request body
Response 200

{ count, reservations: [{ id, venueId, venue, date, time, partySize, status }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/reservations/cancel

Cancel one of the linked user's table reservations

Request body
Response 200

{ ok }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/reviews

Reviews and average rating of a venue (Okidooki: venueId) or a guard / company (NowTrust: sellerId)

Request body
Response 200

{ venueId, count, averageRating, reviews: [{ rating, text, author, createdAt }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/friends/nearby

Which of the linked user's friends are out right now and how far (capability social)

Request body
Response 200

{ count, outNow, friends: [{ uid, displayName, distanceKm?, venue? }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/profile

The linked user's profile with their consent (capability profile)

Request body
Response 200

{ uid, displayName, username, cityId, cityName, avatarUrl, partyStatus, partyMode, roles, friendsCount }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/gifts/send

Start a gift to another Okidooki user; chosen and paid in the app (capability social)

Request body
Response 200

{ needs_user_confirmation: true, userLinks: [{ kind: gift, url, webUrl }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

NowTrust

Licensed private security in Switzerland: guard and company bookings, SOS dispatch, spending mandates. Settlement: card on file / mandate (Stripe).

Gatewayhttps://nowtrust.app
Agent cardhttps://nowtrust.app/a2a/v0/card
Google A2A card / JSON-RPChttps://nowtrust.app/.well-known/agent.json · https://nowtrust.app/a2a/v0/rpc
MCP serverhttps://nowtrust.app/mcp
Keysnt_live_… / nt_test_… from the portal
HealthGET https://nowtrust.app/a2a/v0/health · status page

Routes on this network (23): discover · quote · order · orders · status · cancel · link/start · link/status · reviews · receipt · sos · sos/status · sos/cancel · sellers · availability · reviews/create · bookings · bookings/status · messages · messages/send · incidents · series/quote · series/order

POST /a2a/v0/discover

What the network sells (sellers), or one seller in depth (sellerId). MakeItFun also lists occasion templates (occasions:true).

Request body
fieldtypedescription
sellerIdstring
productTypestringMakeItFun: tshirt, hoodie, cap, mug, poster, bag, phone_case, sticker, bottle, blanket, patch, tank, polo, tote, pillow, mousepad
stylesbooleanMakeItFun: all curated looks (Design Curator) with cached preview pictures
suggestobjectMakeItFun: top looks for a product type / occasion / vibe / city / event
fieldtypedescription
productTypestring
occasionstring
vibestring
citystring
eventobject
countinteger
querystring
categoryIdinteger
countrystring (default CH)
occasionsboolean
slotsobject
cityNamestringOkidooki: city (or near / cityId)
nearobject
fieldtypedescription
latnumber
lngnumber
kindstringNowTrust: guard
partySizeintegerNowTrust: guests to protect (1-5000); sizes the team
intentstringNowTrust: birthday | party | corporate | event | wedding | club | vip | escort | home | shop (maps to a security type)
securityTypestring: event_security | bodyguard | nightclub_security | private_property | escort_securityNowTrust: explicit type (wins over intent)
nowbooleanNowTrust: available right now
limitinteger
Response 200

Sellers

fieldtypedescription
sellersSeller[]

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/quote

Firm price (30 minutes) for a seller/variant/design and the linked user's situation (address, mandate).

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
sellerIdstringNowTrust: guard:<id> or company:<id> from discover; MakeItFun: product:<id>; Okidooki: venue:<id> / event:<id>
designIdstringMakeItFun: from preview
variantIdinteger
quantityinteger
teamobject[]MakeItFun: one unit per member with name/number printed; size = that member's own size (same colour), priced per size
teamPlacementstring
shippingMethodstring
durationHoursnumberNowTrust: booking length
whenstringNowTrust: start (ISO 8601, not in the past, within the booking horizon)
locationobjectNowTrust: where the guard is needed
fieldtypedescription
latnumber
lngnumber
addressstring
intentstringNowTrust: see discover
securityTypestring: event_security | bodyguard | nightclub_security | private_property | escort_security
Response 200

Quote → Quote

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/order

Place the order for a quote. The user confirms/pays in the seller's app (confirmUrl); poll status.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
quoteId requiredstring
notestring
Response 200

Order → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/orders

Latest orders of the user placed with this key.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
limitinteger
Response 200

Orders

fieldtypedescription
ordersOrder[]

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/status

Order status (payment, production, tracking).

Request body
fieldtypedescription
orderId requiredstring
userRefUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
Response 200

Order → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/cancel

Cancel (free before payment / production; refund rules per network).

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
orderId requiredstring
Response 200

Order → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/reviews

Reviews and average rating of a venue (Okidooki: venueId) or a guard / company (NowTrust: sellerId)

Request body
Response 200

{ venueId, count, averageRating, reviews: [{ rating, text, author, createdAt }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/receipt

Stripe receipt of a paid order (NowTrust: orderId or bookingId; MakeItFun: orderId, sandbox orders say sandbox: true)

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
orderIdstring
Response 200

{ orderId, status, paymentStatus, amount, currency, receiptUrl, paidAt, refunded, amountRefunded, invoiceUrl }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/sos

NowTrust. Raise an SOS for the linked user (dispatch of licensed guards); mandate and card rules apply.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
locationobject
fieldtypedescription
latnumber
lngnumber
addressstring
emergencyTypestring
descriptionstring
Response 200

Emergency

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/sos/status

NowTrust. Status of an SOS.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
emergencyId requiredstring
Response 200

Emergency

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/sos/cancel

NowTrust. Cancel an SOS (fee rules apply once a guard is en route).

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
emergencyId requiredstring
Response 200

Emergency

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/sellers

Profile of a guard (guard:<id>) or company (company:<id>)

Request body
fieldtypedescription
sellerId requiredstring
Response 200

{ sellerId, kind, name, rating, reviewCount, totalJobs, hourlyRate, currency, specializations, languages, bio, city, serviceRadiusKm, availableNow, licensed, company } or { kind: company, guards, rating, hourlyRateFrom, specializations }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/availability

Day-by-day availability of a guard (busy slots from confirmed jobs), up to 30 days

Request body
fieldtypedescription
sellerId requiredstringguard:<id>
fromstringYYYY-MM-DD (default today)
daysinteger (default 7)
Response 200

{ sellerId, from, to, timezone, days: [{ date, busy: [{ startTime, endTime }], free }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/reviews/create

Review a completed booking of the linked user (one review per booking; mandate capability review)

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
bookingId requiredstring
rating requiredinteger
commentstring
Response 200

{ reviewId, bookingId, rating, status: published }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/bookings

All bookings of the linked user (in-app and by any agent) plus agent orders awaiting approval

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
limitinteger (default 20)
Response 200

{ count, bookings: [{ bookingId, status, paymentStatus, securityType, date, startTime, endTime, durationHours, address, totalCHF, guard, guardArrivedAt, completedAt, incidentReport }], ordersAwaitingApproval: [{ orderId, when, totalCHF, from }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/bookings/status

One booking in detail (guard, arrival, completion, incident report, review state, guard phone while active)

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
bookingId requiredstring
Response 200

Booking view + { reviewed, guardPhone }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/messages

Chat history between the linked user and the guard of a booking

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
bookingId requiredstring
limitinteger (default 50)
Response 200

{ bookingId, guard, count, messages: [{ messageId, from: user|guard, text, read, at }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/messages/send

Send a chat message to the guard of an active booking (capability message)

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
bookingId requiredstring
message requiredstring
Response 200

{ messageId, bookingId, status: sent }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/incidents

Incident reports written by guards on the linked user's bookings and SOS calls

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
daysinteger (default 90)
Response 200

{ days, count, reports: [{ kind: booking|sos, id, date, at, report, guardId }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/series/quote

Quote a multi-day or recurring series for one seller: up to 12 firm quotes (occurrences, or when + durationHours + repeat)

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
sellerId requiredstring
whenstringISO 8601 start of the first occurrence
durationHoursinteger
repeatobject
fieldtypedescription
everystring: day | week
countinteger
occurrencesobject[]
locationobject
fieldtypedescription
latnumber
lngnumber
addressstring
Response 200

{ sellerId, occurrences, quoted, unavailable: [{ when, reason }], quotes: [{ quoteId, when, durationHours, total, expiresAt }], total, currency, mandate, cardOnFile }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/series/order

Book every quote of a series (Idempotency-Key recommended); each booking settles within the mandate or waits for approval in NowTrust

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
quoteIds requiredstring[]
Response 200

{ seriesId, orders: [Order], failed: [{ quoteId, code, reason }], booked, awaitingApproval, confirmUrl }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

MakeItFun

Print-on-demand merch (Printful): AI / text / image designs, Design Curator looks, previews, firm quotes with shipping, orders paid by the user in the app, crew orders with per-person sizes.

Gatewayhttps://europe-west1-make-it-fun-app.cloudfunctions.net/a2aGateway
Agent cardhttps://europe-west1-make-it-fun-app.cloudfunctions.net/a2aGateway/card
Google A2A card / JSON-RPChttps://make-it-fun-app.web.app/.well-known/agent.json · https://make-it-fun-app.web.app/a2a
MCP serverhttps://make-it-fun-app.web.app/mcp
Keysmif_a2a_live_… / mif_a2a_test_… from the portal
HealthGET https://europe-west1-make-it-fun-app.cloudfunctions.net/a2aGateway/a2a/v0/health · status page

Routes on this network (23): /card · discover · quote · order · orders · status · cancel · link/start · link/status · link/revoke · preview · preview/status · designs · styles/feedback · sandbox/pay · categories · products · sizes · shipping · upload · mockups · mockups/status · receipt

GET /card

Agent card (Okidooki, MakeItFun). NowTrust serves it at /a2a/v0/card and a Google A2A card at /.well-known/agent.json.

No body.

Response 200

Card → Card

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/discover

What the network sells (sellers), or one seller in depth (sellerId). MakeItFun also lists occasion templates (occasions:true).

Request body
fieldtypedescription
sellerIdstring
productTypestringMakeItFun: tshirt, hoodie, cap, mug, poster, bag, phone_case, sticker, bottle, blanket, patch, tank, polo, tote, pillow, mousepad
stylesbooleanMakeItFun: all curated looks (Design Curator) with cached preview pictures
suggestobjectMakeItFun: top looks for a product type / occasion / vibe / city / event
fieldtypedescription
productTypestring
occasionstring
vibestring
citystring
eventobject
countinteger
querystring
categoryIdinteger
countrystring (default CH)
occasionsboolean
slotsobject
cityNamestringOkidooki: city (or near / cityId)
nearobject
fieldtypedescription
latnumber
lngnumber
kindstringNowTrust: guard
partySizeintegerNowTrust: guests to protect (1-5000); sizes the team
intentstringNowTrust: birthday | party | corporate | event | wedding | club | vip | escort | home | shop (maps to a security type)
securityTypestring: event_security | bodyguard | nightclub_security | private_property | escort_securityNowTrust: explicit type (wins over intent)
nowbooleanNowTrust: available right now
limitinteger
Response 200

Sellers

fieldtypedescription
sellersSeller[]

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/quote

Firm price (30 minutes) for a seller/variant/design and the linked user's situation (address, mandate).

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
sellerIdstringNowTrust: guard:<id> or company:<id> from discover; MakeItFun: product:<id>; Okidooki: venue:<id> / event:<id>
designIdstringMakeItFun: from preview
variantIdinteger
quantityinteger
teamobject[]MakeItFun: one unit per member with name/number printed; size = that member's own size (same colour), priced per size
teamPlacementstring
shippingMethodstring
durationHoursnumberNowTrust: booking length
whenstringNowTrust: start (ISO 8601, not in the past, within the booking horizon)
locationobjectNowTrust: where the guard is needed
fieldtypedescription
latnumber
lngnumber
addressstring
intentstringNowTrust: see discover
securityTypestring: event_security | bodyguard | nightclub_security | private_property | escort_security
Response 200

Quote → Quote

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/order

Place the order for a quote. The user confirms/pays in the seller's app (confirmUrl); poll status.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
quoteId requiredstring
notestring
Response 200

Order → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/orders

Latest orders of the user placed with this key.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
limitinteger
Response 200

Orders

fieldtypedescription
ordersOrder[]

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/status

Order status (payment, production, tracking).

Request body
fieldtypedescription
orderId requiredstring
userRefUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
Response 200

Order → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/cancel

Cancel (free before payment / production; refund rules per network).

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
orderId requiredstring
Response 200

Order → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/preview

MakeItFun. Render a design on a product (AI prompt, image URL, exact text or a saved design); returns a job to poll. One running preview per user.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
sellerId requiredstring
variantId requiredinteger
placementstringOne of the placements discover(sellerId) lists; omit for the product default.
positionModestring: centered | stretched | logo_top_left | logo_top_right | logo_bottom_left | logo_bottom_right
baseDesignIdstringAdd this placement to an earlier design of the same variant.
design requiredobject
fieldtypedescription
kindstring: prompt | imageUrl | text | savedDesignId | style
styleIdstringkind style: from discover { suggest } / { styles: true }
slotsobjectkind style: values for the look's slots (name, place, year, team...)
promptstring
imageUrlstring
editPromptstring
textstring
fontstring: bebas | anton | archivo | bangers | luckiest | righteous | pacifico | lobster | marker | poppins
colorstring
outlineColorstring
arcnumber
designIdstring
Response 200

Job or result → PreviewResult

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/preview/status

MakeItFun. Result of a preview job (jobId optional: latest job of the user).

Request body
fieldtypedescription
jobIdstring
userRefUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
Response 200

Result → PreviewResult

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/designs

MakeItFun. The linked user's saved designs (My Designs), newest first, with the designIds quote/order accept. Reusing a saved design costs nothing.

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
limitinteger (default 20)
Response 200

Designs

fieldtypedescription
designsPreviewResult[]

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/styles/feedback

MakeItFun. Thumbs up / down on a curated look (Design Curator ranking signal).

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
styleId requiredstring
votestring: up | down
Response 200

Recorded

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/sandbox/pay

MakeItFun, TEST keys only. Settle a sandbox order as if the user paid.

Request body
fieldtypedescription
orderId requiredstring
Response 200

Order paid → Order

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/categories

Printful catalog categories shippable to a country, with product counts

Request body
fieldtypedescription
countrystring (default CH)
Response 200

{ country, categories: [{ categoryId, title, imageUrl, parentId, productCount }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/products

Products of a category (sellerId product:<id> for discover)

Request body
fieldtypedescription
categoryId requiredinteger
countrystring (default CH)
limitinteger (default 60)
Response 200

{ country, categoryId, total, products: [{ sellerId, productId, title, imageUrl, brand, techniques, placements, priceFromCHF, allOverPrint }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/sizes

Size chart of a product (available sizes and measurement tables), cached 7 days

Request body
fieldtypedescription
sellerIdstringproduct:<id>
productIdinteger
unitstring: cm | inches (default cm)
Response 200

{ productId, unit, available: [string], sizeTables: [{ type, unit, description, imageUrl, measurements: [{ name, values: [{ size, value, min, max }] }] }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/shipping

Shipping options and prices (CHF) for variants to a country/zip, or to the linked user's saved address, without a quote

Request body
fieldtypedescription
items requiredobject[]
recipientobject
fieldtypedescription
country_codestring
zipstring
citystring
state_codestring
userRefUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
Response 200

{ shipTo, currency, rates: [{ id, name, rateCHF, minDeliveryDays, maxDeliveryDays }] }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/upload

Upload an image for the linked user's designs (base64 PNG/JPEG/WebP up to 15 MB, or a URL fetched server-side)

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
imageBase64stringraw base64 or data URL
imageUrlstring
Response 200

{ imageUrl } to use as preview design { kind: imageUrl, imageUrl }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/mockups

Extra mockup views (lifestyle, flat, folded, hanger...) of a saved design; done within ~45 s or returns a taskKey to poll

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
designId requiredstring
optionGroupsstring[]subset of the product's option groups (default: up to 4 lifestyle/flat views)
Response 200

{ designId, status: done|pending, taskKey, optionGroups, available, views: [{ title, url, placement }], pollAfterSeconds? }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/mockups/status

Result of a pending mockups task

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
taskKey requiredstring
Response 200

{ designId, status, taskKey, views }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

POST /a2a/v0/receipt

Stripe receipt of a paid order (NowTrust: orderId or bookingId; MakeItFun: orderId, sandbox orders say sandbox: true)

Request body
fieldtypedescription
userRef requiredUserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
orderIdstring
Response 200

{ orderId, status, paymentStatus, amount, currency, receiptUrl, paidAt, refunded, amountRefunded, invoiceUrl }

Errors: { error: { code, message, retryable, requestId } } with 400 / 401 / 403 / 404 / 409 / 429 / 5xx.

Schemas

UserRef
fieldtypedescription
network requiredstringYour integration slug (the key's network).
uid requiredstringYour user id.
Error
fieldtypedescription
errorobject
fieldtypedescription
codestring: auth | invalid_request | link_required | forbidden | mandate_scope | not_found | quote_expired | seller_unavailable | shipping_address_required | invalid_state | rate_limited | internal
messagestring
retryableboolean
Card
fieldtypedescription
protocolstring
versionstring
networkstring
description
endpointsobject
authobject
settlementstring[]
currenciesstring[]
capabilitiesstring[]
linkingobject
Seller
fieldtypedescription
sellerIdstringe.g. product:71, venue:abc, guard:xyz
namestring
imagestring | null
capabilitiesstring[]
Quote
fieldtypedescription
quoteIdstring
sellerIdstring
quantityinteger
linesobject[]
totalintegerMinor units (CHF centimes).
currencystring
expiresAtstring
termsobject
shippingobjectMakeItFun: methodId and options[]
Order
fieldtypedescription
orderIdstring
statusstring: needs_user_confirmation | paid | in_production | shipped | confirmed | active | completed | failed | refunded | cancelled | expired
totalinteger
currencystring
confirmUrlstring | nullWhere the user confirms/pays (seller app).
reasonstring | null
expiresAtstring | null
trackingobject | null
Mandate · Limits the user set for THIS agent (okidooki.app/webapp/connect). Amounts in centimes; null = no limit.
fieldtypedescription
perOrderMaxinteger | null
monthlyMaxinteger | null
capabilitiesarray | nullnull = everything the network offers
validUntilstring | null
autoApprovebooleanNowTrust: bookings within the limits settle without a tap
spentThisMonthinteger
remainingThisMonthinteger | null
expiredboolean
Connect
fieldtypedescription
connectIdstring
statusstring: pending | approved | declined | expired
urlstringSend the user here.
networksstring[]
resultsobject | null
mandateMandateLimits the user set for THIS agent (okidooki.app/webapp/connect). Amounts in centimes; null = no limit.
fieldtypedescription
perOrderMaxinteger | null
monthlyMaxinteger | null
capabilitiesarray | nullnull = everything the network offers
validUntilstring | null
autoApprovebooleanNowTrust: bookings within the limits settle without a tap
spentThisMonthinteger
remainingThisMonthinteger | null
expiredboolean
expiresInSecondsinteger
WebhookEvent · Delivered by POST to your webhook URL. Verify X-APPV0-Signature (t=<unix>,v1=hex(HMAC-SHA256(secret, t + '.' + rawBody))) within 5 minutes.
fieldtypedescription
idstring
typestring: ping | order.status | sos.status | connect.approved | link.revoked
networkstring
createdAtstring
dataobjectorder.status: orderId, status, previousStatus, userRef, total, currency, tracking?, reason?; sos.status: emergencyId, status, previousStatus, guardId, estimatedArrival; connect.approved: connectId, userRef, results, mandate; link.revoked: userRef, networks
PreviewResult
fieldtypedescription
jobIdstring | null
statusstring: queued | generating | done | failed
designIdstring
mockupURLstring | null
mockupURLsstring[]
mockupsByPlacementobject | null
colorAlternativesobject[]
placementsstring[]
retailPricenumber
currencystring
printSpecobject | nullprint file px/dpi
warningsstring[]
pollAfterSecondsinteger
existingbooleanA preview was already running for this user; poll it.