{"openapi":"3.1.0","info":{"title":"OpenRégie API","version":"0.1.0"},"paths":{"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login/otp":{"post":{"tags":["auth"],"summary":"Login Otp","operationId":"login_otp_api_v1_auth_login_otp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/password/forgot":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Always the same answer, whether or not the address is known.\n\nReturning 404 for an unknown address would turn this into a free directory\nof which businesses have signed up.","operationId":"forgot_password_api_v1_auth_password_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/password/reset":{"post":{"tags":["auth"],"summary":"Reset Password","operationId":"reset_password_api_v1_auth_password_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/signup-merchant":{"post":{"tags":["auth"],"summary":"Signup Merchant","operationId":"signup_merchant_api_v1_auth_signup_merchant_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupMerchantRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/contact":{"post":{"tags":["auth"],"summary":"Contact","description":"The contact form. No account, no database row -- it is a message.\n\nNothing is stored: a contact form that writes to the database is a place for\nanyone on the internet to put data we then have to look after.","operationId":"contact_api_v1_auth_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/pair":{"post":{"tags":["devices"],"summary":"Pair","operationId":"pair_api_v1_devices_pair_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/me/playlist":{"get":{"tags":["devices"],"summary":"Get Playlist","operationId":"get_playlist_api_v1_devices_me_playlist_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}},{"name":"x-device-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaylistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{device_code}/filler.png":{"get":{"tags":["devices"],"summary":"Get Filler Png","operationId":"get_filler_png_api_v1_devices__device_code__filler_png_get","parameters":[{"name":"device_code","in":"path","required":true,"schema":{"type":"string","title":"Device Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{device_code}/activation.png":{"get":{"tags":["devices"],"summary":"Get Activation Png","operationId":"get_activation_png_api_v1_devices__device_code__activation_png_get","parameters":[{"name":"device_code","in":"path","required":true,"schema":{"type":"string","title":"Device Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{device_code}/approval.png":{"get":{"tags":["devices"],"summary":"Get Approval Png","operationId":"get_approval_png_api_v1_devices__device_code__approval_png_get","parameters":[{"name":"device_code","in":"path","required":true,"schema":{"type":"string","title":"Device Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/me/plays":{"post":{"tags":["devices"],"summary":"Post Plays","operationId":"post_plays_api_v1_devices_me_plays_post","parameters":[{"name":"x-device-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaysBatchRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/me/reset":{"post":{"tags":["devices"],"summary":"Self Reset","description":"A board resetting itself from its own setup portal.\n\nThe board authenticates with its current token, so only the board on that\nhardware can trigger this. It runs the same unlink as an admin or a\nmerchant would -- campaigns settled, WiFi wipe requested, token revoked --\nwhich also invalidates the very token this request used: the board's next\npoll gets a 401 and it re-registers, unlinked. The unlink is attributed to\nthe board's own merchant when it has one; an unclaimed board simply resets.","operationId":"self_reset_api_v1_devices_me_reset_post","parameters":[{"name":"x-device-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/me/commands":{"get":{"tags":["devices"],"summary":"Get Commands","description":"Control actions waiting for this board (WiFi, HDMI, reboot, refresh).\n\nHanded out oldest-first and marked 'sent' as they leave, so the operator can\nsee the board has taken them; the board reports each result back below.","operationId":"get_commands_api_v1_devices_me_commands_get","parameters":[{"name":"x-device-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCommandList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/me/commands/{command_id}/result":{"post":{"tags":["devices"],"summary":"Post Command Result","description":"The board's report on one command: done, or failed with a reason.","operationId":"post_command_result_api_v1_devices_me_commands__command_id__result_post","parameters":[{"name":"command_id","in":"path","required":true,"schema":{"type":"string","title":"Command Id"}},{"name":"x-device-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCommandResult"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/me/heartbeat":{"post":{"tags":["devices"],"summary":"Post Heartbeat","operationId":"post_heartbeat_api_v1_devices_me_heartbeat_post","parameters":[{"name":"x-device-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/{media_id}/download":{"get":{"tags":["media"],"summary":"Download Media","operationId":"download_media_api_v1_media__media_id__download_get","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"variant","in":"query","required":true,"schema":{"type":"string","title":"Variant"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices":{"get":{"tags":["public"],"summary":"List Devices Public","operationId":"list_devices_public_api_v1_devices_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"slug de catégorie","title":"Category"},"description":"slug de catégorie"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"recherche libre : ville, adresse, nom","title":"Q"},"description":"recherche libre : ville, adresse, nom"},{"name":"filters","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"clés séparées par des virgules","title":"Filters"},"description":"clés séparées par des virgules"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"relevance","title":"Sort"}},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":200.0,"exclusiveMinimum":0.0,"default":20.0,"title":"Radius Km"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeviceListItem"},"title":"Response List Devices Public Api V1 Devices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{code}/public":{"get":{"tags":["public"],"summary":"Get Device Public","operationId":"get_device_public_api_v1_devices__code__public_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDeviceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/meta/catalogue":{"get":{"tags":["public"],"summary":"Listing Catalogue","description":"Everything the listing page needs to draw its own controls.\n\nCounts come with it so a category with no screens can be hidden rather than\noffered and then returning nothing.","operationId":"listing_catalogue_api_v1_devices_meta_catalogue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/coupons/{code}":{"get":{"tags":["public"],"summary":"Check Coupon","description":"Is this code good, and what does it take off this basket?\n\nPublic on purpose: the field sits on the booking page and the basket, and a\nshopper has no session. It reveals only whether a code the caller already\nknows is valid -- never the list of codes, and never anything about a code\nthat does not exist.","operationId":"check_coupon_api_v1_coupons__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"amount_cents","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Amount Cents"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/claim-init":{"post":{"tags":["provisioning"],"summary":"Claim Init","operationId":"claim_init_api_v1_devices_claim_init_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_claim_init_api_v1_devices_claim_init_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimInitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/claim":{"post":{"tags":["provisioning"],"summary":"Claim Device","operationId":"claim_device_api_v1_devices_claim_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_claim_device_api_v1_devices_claim_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/campaigns":{"post":{"tags":["campaigns"],"summary":"Create Campaign","operationId":"create_campaign_api_v1_campaigns_post","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_campaign_api_v1_campaigns_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["merchant"],"summary":"List Campaigns","operationId":"list_campaigns_api_v1_campaigns_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__schemas__campaign__CampaignOut"},"title":"Response List Campaigns Api V1 Campaigns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stripe/webhook":{"post":{"tags":["stripe"],"summary":"Stripe Webhook","operationId":"stripe_webhook_api_v1_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/merchant/devices":{"get":{"tags":["merchant"],"summary":"List My Devices","operationId":"list_my_devices_api_v1_merchant_devices_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MerchantDeviceItem"},"title":"Response List My Devices Api V1 Merchant Devices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/stripe/onboarding-link":{"post":{"tags":["merchant"],"summary":"Stripe Onboarding Link","operationId":"stripe_onboarding_link_api_v1_merchant_stripe_onboarding_link_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StripeOnboardingLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/stripe/account-session":{"post":{"tags":["merchant"],"summary":"Stripe Account Session","description":"What the embedded Connect components need to render for this merchant.\n\nCreates the Express account on first call, so a merchant who has never\nopened the panel gets the onboarding form straight away rather than a\nbutton that creates an account and then asks them to click again.","operationId":"stripe_account_session_api_v1_merchant_stripe_account_session_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/stripe/status":{"get":{"tags":["merchant"],"summary":"Stripe Status","description":"Whether this merchant can be paid yet. Stripe is the authority on its own\nrequirements and they change as forms are filled, so this always asks live.\nThe answer is also cached onto the user, so the admin badge and the payout\njob read the truth without a Stripe call per row.","operationId":"stripe_status_api_v1_merchant_stripe_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/bank":{"get":{"tags":["merchant"],"summary":"Get Bank","description":"The merchant's own bank details, for being paid by hand when they have not\nonboarded to Stripe. The IBAN is theirs -- shown back in full so they can\ncheck it.","operationId":"get_bank_api_v1_merchant_bank_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["merchant"],"summary":"Set Bank","description":"Record (or clear) the merchant's IBAN so the operator can pay them\ndirectly. Light-touch validation: an IBAN is two country letters then 13-32\nalphanumerics, no spaces.","operationId":"set_bank_api_v1_merchant_bank_patch","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/venues/me":{"get":{"tags":["merchant"],"summary":"List My Venues","operationId":"list_my_venues_api_v1_venues_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VenueOut"},"title":"Response List My Venues Api V1 Venues Me Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/campaigns/{campaign_id}/approve":{"post":{"tags":["merchant"],"summary":"Approve Campaign","operationId":"approve_campaign_api_v1_campaigns__campaign_id__approve_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__campaign__CampaignOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/campaigns/{campaign_id}/reject":{"post":{"tags":["merchant"],"summary":"Reject Campaign","operationId":"reject_campaign_api_v1_campaigns__campaign_id__reject_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__campaign__CampaignOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/venues/me/stats":{"get":{"tags":["merchant"],"summary":"Get Stats","operationId":"get_stats_api_v1_venues_me_stats_get","parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date","title":"From"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date","title":"To"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VenueStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/devices/{device_id}":{"get":{"tags":["merchant"],"summary":"Device Detail","operationId":"device_detail_api_v1_merchant_devices__device_id__get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/devices/{device_id}/hdmi-port":{"patch":{"tags":["merchant"],"summary":"Set Hdmi Port","description":"The HDMI input the board is plugged into. Pushed to the board on its next\npoll; it rewrites its EDID and reboots so CEC switches the TV to that input.","operationId":"set_hdmi_port_api_v1_merchant_devices__device_id__hdmi_port_patch","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HdmiPortRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/venues/{venue_id}":{"patch":{"tags":["merchant"],"summary":"Update Venue","operationId":"update_venue_api_v1_merchant_venues__venue_id__patch","parameters":[{"name":"venue_id","in":"path","required":true,"schema":{"type":"string","title":"Venue Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VenueUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/venues/{venue_id}/hours-impact":{"post":{"tags":["merchant"],"summary":"Preview Hours Change","description":"What a proposed set of hours would cost, without saving anything.\n\nSo the interface can warn while the merchant is still editing, rather than\nonly at the moment they press save.","operationId":"preview_hours_change_api_v1_merchant_venues__venue_id__hours_impact_post","parameters":[{"name":"venue_id","in":"path","required":true,"schema":{"type":"string","title":"Venue Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VenueUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/devices/{device_id}/slots":{"post":{"tags":["merchant"],"summary":"Change Slots","description":"Choose how the loop is shared: slots for advertisers, slots for the shop.\n\nWith `dry_run` nothing is saved and the answer says what saving would do,\nso the form can show \"s'applique tout de suite\" or \"à partir du 20\nnovembre à 18 h, quand la dernière réservation en cours se termine\" before\nthe merchant commits to it. Without it the change is recorded -- applied\nnow, or planned for the moment no paid booking is harmed by it\n(services/slot_config.py). Asking for the split already in force cancels\nwhatever was planned, as far as bookings allow.","operationId":"change_slots_api_v1_merchant_devices__device_id__slots_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlotChangeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/devices/{device_id}/pricing":{"patch":{"tags":["merchant"],"summary":"Update Device Pricing","operationId":"update_device_pricing_api_v1_merchant_devices__device_id__pricing_patch","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevicePricingUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/bookings":{"get":{"tags":["merchant"],"summary":"List Bookings","description":"Everything booked on this merchant's screens, for the planning calendar.","operationId":"list_bookings_api_v1_merchant_bookings_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BookingItem"},"title":"Response List Bookings Api V1 Merchant Bookings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/earnings":{"get":{"tags":["merchant"],"summary":"Earnings Summary","operationId":"earnings_summary_api_v1_merchant_earnings_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EarningsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/payouts":{"get":{"tags":["merchant"],"summary":"Payouts Detail","description":"Every euro accounted for: which ad, which day, whether the screen really\naired it, and which weeks are already payable.","operationId":"payouts_detail_api_v1_merchant_payouts_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/devices/{device_id}/unlink":{"post":{"tags":["merchant"],"summary":"Unlink Device","description":"Cut a screen loose from this merchant's account.\n\nSettles every unfinished campaign first (advertisers made whole, merchant\npaid only for aired time), records the unbind against the board's serial,\nthen detaches and revokes the board's credential. See device_unlink.","operationId":"unlink_device_api_v1_merchant_devices__device_id__unlink_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/slides":{"get":{"tags":["merchant-slides"],"summary":"List Slides","operationId":"list_slides_api_v1_merchant_slides_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SlideOut"},"title":"Response List Slides Api V1 Merchant Slides Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["merchant-slides"],"summary":"Create Slide","operationId":"create_slide_api_v1_merchant_slides_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_slide_api_v1_merchant_slides_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlideOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/slides/{slide_id}":{"patch":{"tags":["merchant-slides"],"summary":"Update Slide","operationId":"update_slide_api_v1_merchant_slides__slide_id__patch","parameters":[{"name":"slide_id","in":"path","required":true,"schema":{"type":"string","title":"Slide Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlidePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlideOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["merchant-slides"],"summary":"Archive Slide","description":"Archived, never deleted: its plays are history the merchant may still\nwant to read, and a play row must keep pointing at something.","operationId":"archive_slide_api_v1_merchant_slides__slide_id__delete","parameters":[{"name":"slide_id","in":"path","required":true,"schema":{"type":"string","title":"Slide Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/slides/{slide_id}/media":{"post":{"tags":["merchant-slides"],"summary":"Replace Media","description":"A new creative on an existing slide. The old file stays until the new\none has transcoded, so the screen never shows a hole in between.","operationId":"replace_media_api_v1_merchant_slides__slide_id__media_post","parameters":[{"name":"slide_id","in":"path","required":true,"schema":{"type":"string","title":"Slide Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_replace_media_api_v1_merchant_slides__slide_id__media_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlideOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/slides/{slide_id}/activate":{"post":{"tags":["merchant-slides"],"summary":"Activate Slide","operationId":"activate_slide_api_v1_merchant_slides__slide_id__activate_post","parameters":[{"name":"slide_id","in":"path","required":true,"schema":{"type":"string","title":"Slide Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlideOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/slides/{slide_id}/pause":{"post":{"tags":["merchant-slides"],"summary":"Pause Slide","operationId":"pause_slide_api_v1_merchant_slides__slide_id__pause_post","parameters":[{"name":"slide_id","in":"path","required":true,"schema":{"type":"string","title":"Slide Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlideOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/slides/{slide_id}/tracking":{"get":{"tags":["merchant-slides"],"summary":"Slide Tracking","description":"The same hour-by-hour report an advertiser gets, for the shop's own slot.\n\nThe window is the slide's life on the screen: from its start date (or its\ncreation) to its end date (or now). Plays are its own; the audience under\nthem is the screen's, published under the same cutoff as everywhere else.","operationId":"slide_tracking_api_v1_merchant_slides__slide_id__tracking_get","parameters":[{"name":"slide_id","in":"path","required":true,"schema":{"type":"string","title":"Slide Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{code}/plan":{"post":{"tags":["booking"],"summary":"Plan Booking","operationId":"plan_booking_api_v1_devices__code__plan_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/categories":{"get":{"tags":["booking"],"summary":"List Categories","description":"The closed list a merchant picks their trade from.\n\nServed rather than hardcoded in the browser so the catalogue has exactly one\ndefinition, and a category added here appears in the picker without a\nfrontend deploy.","operationId":"list_categories_api_v1_categories_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{code}/availability":{"get":{"tags":["booking"],"summary":"Availability","description":"Hour-by-hour availability for the next fortnight.\n\nOne call for the whole calendar rather than one per day: the grid has to\npaint in a single frame, and asking fourteen times would flicker its way\ndown the strip.\n\nHours are the shop's own, not UTC, because that is what the buyer picks.","operationId":"availability_api_v1_devices__code__availability_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":14,"title":"Days"}},{"name":"slots","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Slots"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DayAvailability"},"title":"Response Availability Api V1 Devices  Code  Availability Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/screens/{screen_id}/footfall":{"post":{"tags":["footfall"],"summary":"Ingest","description":"Accept a batch of hourly buckets from one screen.","operationId":"ingest_api_screens__screen_id__footfall_post","parameters":[{"name":"screen_id","in":"path","required":true,"schema":{"type":"string","title":"Screen Id"}},{"name":"x-device-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FootfallIn"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/footfall":{"get":{"tags":["footfall"],"summary":"Merchant Footfall","operationId":"merchant_footfall_api_v1_merchant_footfall_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"device_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/footfall":{"get":{"tags":["footfall"],"summary":"Admin Footfall","operationId":"admin_footfall_api_v1_admin_footfall_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"device_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/audience":{"get":{"tags":["footfall"],"summary":"Admin Audience","description":"Every screen on the fleet. Capped so it cannot run away.","operationId":"admin_audience_api_v1_admin_audience_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/audience":{"get":{"tags":["footfall"],"summary":"Merchant Audience","description":"The same rows, for the screens this merchant owns.","operationId":"merchant_audience_api_v1_merchant_audience_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{code}/footfall":{"get":{"tags":["footfall"],"summary":"Public Footfall","description":"The estimate shown on the booking page. No authentication: it is part of\nthe listing, like the price.","operationId":"public_footfall_api_v1_devices__code__footfall_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/devices/{device_id}/trafic":{"get":{"tags":["footfall"],"summary":"Merchant Traffic","description":"Arrivals over 24h/48h/7d/30d, and what is in front of the screen now.","operationId":"merchant_traffic_api_v1_merchant_devices__device_id__trafic_get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{code}/trafic":{"get":{"tags":["footfall"],"summary":"Public Traffic","description":"Part of the listing, like the price: an advertiser comparing two screens\nneeds the traffic figure before they decide, not after they have paid.","operationId":"public_traffic_api_v1_devices__code__trafic_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{code}/view":{"post":{"tags":["screen-views"],"summary":"Record View","description":"Someone opened this screen's booking page.","operationId":"record_view_api_v1_devices__code__view_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"src","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"qr when arriving from the screen","title":"Src"},"description":"qr when arriving from the screen"},{"name":"x-visitor-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Visitor-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/views":{"get":{"tags":["screen-views"],"summary":"Merchant Views","operationId":"merchant_views_api_v1_merchant_views_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/views":{"get":{"tags":["screen-views"],"summary":"Admin Views","description":"Fleet totals plus a ranking, so the best-scanned screens are visible.","operationId":"admin_views_api_v1_admin_views_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/{code}/views":{"get":{"tags":["screen-views"],"summary":"Public Views","description":"Shown on the booking page itself: interest is a selling point, and a\nbuyer deciding between two screens deserves to see it.","operationId":"public_views_api_v1_devices__code__views_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/campaigns":{"get":{"tags":["merchant"],"summary":"List Campaigns For Review","operationId":"list_campaigns_for_review_api_v1_merchant_campaigns_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CampaignReviewOut"},"title":"Response List Campaigns For Review Api V1 Merchant Campaigns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/campaigns/{campaign_id}":{"get":{"tags":["merchant"],"summary":"Campaign Detail","operationId":"campaign_detail_api_v1_merchant_campaigns__campaign_id__get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignReviewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/orders/quote":{"post":{"tags":["orders"],"summary":"Quote Order","description":"Price a basket without committing to it, so the total updates live.","operationId":"quote_order_api_v1_orders_quote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderQuoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/orders":{"post":{"tags":["orders"],"summary":"Create Order","description":"One creative, several screens, one authorisation.","operationId":"create_order_api_v1_orders_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_order_api_v1_orders_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/balance":{"get":{"tags":["agent"],"summary":"Get Balance","description":"What is left to spend, and where the last movements went.\n\nAn agent that cannot see its balance has to discover it is broke by having\nan order refused, which is a poor way to run a budget.","operationId":"get_balance_api_v1_agent_balance_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentBalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/orders":{"post":{"tags":["agent"],"summary":"Create Agent Order","description":"Book one or more screens, paid from the account's prepaid balance.","operationId":"create_agent_order_api_v1_agent_orders_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentOrderRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account/login/code":{"post":{"tags":["account"],"summary":"Request Login Code","description":"Mail a sign-in code, or say that this address signs in with a password.\n\nA CODE IS ONLY OFFERED TO AN ACCOUNT THAT HAS NO PASSWORD. That is the whole\nsecurity argument: an advertiser's mailbox is already the only credential\nthey have -- every tracking link we ever sent them is in it -- so a code\nchanges nothing. A merchant or an administrator does have a password, and\nletting an emailed code stand in for it would quietly demote a hardened\nlogin to \"whoever reads this inbox\". The administrator sign-in in\nrouters/auth.py goes to deliberate lengths to avoid exactly that.\n\nSo the answer differs by account, which does reveal that a given address\nbelongs to staff. That leak is worth it: the version that answered\nidentically in every case sent somebody with a merchant address to wait\nforever for a mail that was never going to arrive, with nothing on screen to\nexplain why. A dead end is a worse failure than a small disclosure.","operationId":"request_login_code_api_v1_account_login_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginCodeRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account/login/token":{"post":{"tags":["account"],"summary":"Confirm Login Code","operationId":"confirm_login_code_api_v1_account_login_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginCodeConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account":{"get":{"tags":["account"],"summary":"Get Account","operationId":"get_account_api_v1_account_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account/entries":{"get":{"tags":["account"],"summary":"Get Entries","operationId":"get_entries_api_v1_account_entries_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccountEntryOut"},"title":"Response Get Entries Api V1 Account Entries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account/topup":{"post":{"tags":["account"],"summary":"Topup","description":"A Stripe Checkout page. The balance moves when the webhook confirms it,\nnever here -- a session that is created is not a session that is paid.","operationId":"topup_api_v1_account_topup_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account/keys":{"get":{"tags":["account"],"summary":"List Keys","operationId":"list_keys_api_v1_account_keys_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyOut"},"title":"Response List Keys Api V1 Account Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["account"],"summary":"Create Key","operationId":"create_key_api_v1_account_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyIssued"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account/keys/{key_id}/revoke":{"post":{"tags":["account"],"summary":"Revoke Key","operationId":"revoke_key_api_v1_account_keys__key_id__revoke_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account/campaigns":{"get":{"tags":["account"],"summary":"List Campaigns","description":"Every campaign on this account, newest first.\n\nThis is the page that makes an autonomous agent acceptable to its owner:\nwhat it bought, what it cost, and whether the shopkeeper said yes.","operationId":"list_campaigns_api_v1_account_campaigns_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routers__account__CampaignOut"},"title":"Response List Campaigns Api V1 Account Campaigns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"post":{"tags":["mcp"],"summary":"Mcp Endpoint","operationId":"mcp_endpoint_mcp_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/mcp.json":{"get":{"tags":["mcp"],"summary":"Well Known Mcp","description":"Where an agent looks to find out we speak MCP at all.\n\nBuilt from the configured scheme and domain, never from request.base_url:\nbehind the reverse proxy the request arrives as plain http, so base_url\nwould publish `http://openregie.fr/mcp` here -- in the one document whose\nentire job is to tell an agent where to connect.","operationId":"well_known_mcp__well_known_mcp_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/admin/users":{"post":{"tags":["admin"],"summary":"Create User","operationId":"create_user_api_v1_admin_users_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/venues":{"post":{"tags":["admin"],"summary":"Create Venue","operationId":"create_venue_api_v1_admin_venues_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVenueRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VenueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices":{"post":{"tags":["admin"],"summary":"Create Device","operationId":"create_device_api_v1_admin_devices_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeviceRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin"],"summary":"List Devices","operationId":"list_devices_api_v1_admin_devices_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeviceFleetItem"},"title":"Response List Devices Api V1 Admin Devices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices/pending":{"get":{"tags":["admin"],"summary":"List Pending Devices","description":"Boards that have registered themselves but aren't approved yet. Nothing\nhere can be claimed or sold until it's approved.","operationId":"list_pending_devices_api_v1_admin_devices_pending_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PendingDeviceItem"},"title":"Response List Pending Devices Api V1 Admin Devices Pending Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices/{device_id}/approve":{"post":{"tags":["admin"],"summary":"Approve Device","operationId":"approve_device_api_v1_admin_devices__device_id__approve_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices/{device_id}/revoke":{"post":{"tags":["admin"],"summary":"Revoke Device","description":"Pull a board's approval and cut its token, e.g. a unit reported stolen or\nsuspected of reporting plays it never showed.","operationId":"revoke_device_api_v1_admin_devices__device_id__revoke_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/plays/export.csv":{"get":{"tags":["admin"],"summary":"Export Plays Csv","operationId":"export_plays_csv_api_v1_admin_plays_export_csv_get","parameters":[{"name":"device_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/clients":{"get":{"tags":["admin"],"summary":"List Clients","operationId":"list_clients_api_v1_admin_clients_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"recherche email ou nom","title":"Q"},"description":"recherche email ou nom"},{"name":"only_with_devices","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only With Devices"}},{"name":"only_owed","in":"query","required":false,"schema":{"type":"boolean","description":"uniquement ceux à qui on doit de l'argent","default":false,"title":"Only Owed"},"description":"uniquement ceux à qui on doit de l'argent"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClientRow"},"title":"Response List Clients Api V1 Admin Clients Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/clients/{client_id}":{"get":{"tags":["admin"],"summary":"Client Detail","operationId":"client_detail_api_v1_admin_clients__client_id__get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/payouts/pending":{"get":{"tags":["admin"],"summary":"Pending Payouts","operationId":"pending_payouts_api_v1_admin_payouts_pending_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PendingPayoutRow"},"title":"Response Pending Payouts Api V1 Admin Payouts Pending Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/payouts/{merchant_id}/pay":{"post":{"tags":["admin"],"summary":"Pay Merchant","description":"Settle everything currently owed to one merchant, in one action.","operationId":"pay_merchant_api_v1_admin_payouts__merchant_id__pay_post","parameters":[{"name":"merchant_id","in":"path","required":true,"schema":{"type":"string","title":"Merchant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/payouts/{merchant_id}/pay-manual":{"post":{"tags":["admin"],"summary":"Pay Merchant Manual","description":"Settle everything owed to one merchant by hand -- no Stripe.\n\nFor hosts who have not onboarded to Stripe Connect: the operator makes the\nbank transfer themselves to the merchant's IBAN and records it here with a\nreference. The weeks are marked paid exactly as a Stripe transfer would.","operationId":"pay_merchant_manual_api_v1_admin_payouts__merchant_id__pay_manual_post","parameters":[{"name":"merchant_id","in":"path","required":true,"schema":{"type":"string","title":"Merchant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/payouts/{merchant_id}/detail":{"get":{"tags":["admin"],"summary":"Payout Detail","description":"The same week-by-week, ad-by-ad ledger the merchant sees, so the operator\ncan check exactly what a payment is made of before releasing it.","operationId":"payout_detail_api_v1_admin_payouts__merchant_id__detail_get","parameters":[{"name":"merchant_id","in":"path","required":true,"schema":{"type":"string","title":"Merchant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/stats":{"get":{"tags":["admin"],"summary":"Platform Stats","operationId":"platform_stats_api_v1_admin_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/refunds":{"get":{"tags":["admin"],"summary":"List Refunds","description":"The refund log: every euro returned to an advertiser, newest first, each\nwith the reason it happened -- so a remboursement is never a mystery line.","operationId":"list_refunds_api_v1_admin_refunds_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":200,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RefundRow"},"title":"Response List Refunds Api V1 Admin Refunds Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/refunds/{refund_id}/approve":{"post":{"tags":["admin"],"summary":"Approve Refund","description":"Release the money for one pending refund: issues the real Stripe refund\n(or frees the hold) -- nothing moves until this is called.","operationId":"approve_refund_api_v1_admin_refunds__refund_id__approve_post","parameters":[{"name":"refund_id","in":"path","required":true,"schema":{"type":"string","title":"Refund Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/refunds/{refund_id}/reject":{"post":{"tags":["admin"],"summary":"Reject Refund","description":"Decide a pending refund is not warranted. No money moves.","operationId":"reject_refund_api_v1_admin_refunds__refund_id__reject_post","parameters":[{"name":"refund_id","in":"path","required":true,"schema":{"type":"string","title":"Refund Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/monitoring":{"get":{"tags":["admin"],"summary":"Monitoring","description":"Live control room: every screen's presence and footfall right now, plus\nthe security events and outages worth a human's eye.","operationId":"monitoring_api_v1_admin_monitoring_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Monitoring"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/alerts":{"get":{"tags":["admin"],"summary":"List Alerts","description":"The full alert history -- security events AND operational outages (screen\noff, board offline) merged into one time-ordered stream. Not just security:\na dark screen or a board that went silent is an alert too, and this is where\na human reviews all of them, filters them, and traces them back.","operationId":"list_alerts_api_v1_admin_alerts_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","description":"all | security | screen | offline","default":"all","title":"Category"},"description":"all | security | screen | offline"},{"name":"severity","in":"query","required":false,"schema":{"type":"string","description":"all | info | warning | critical","default":"all","title":"Severity"},"description":"all | info | warning | critical"},{"name":"device_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AlertRow"},"title":"Response List Alerts Api V1 Admin Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices/{device_id}/hdmi-port":{"patch":{"tags":["admin"],"summary":"Set Device Hdmi Port","description":"Set which HDMI input a board is on, from the monitoring view. Pushed to\nthe board on its next poll; it rewrites its EDID and reboots.","operationId":"set_device_hdmi_port_api_v1_admin_devices__device_id__hdmi_port_patch","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices/{device_id}/unlink":{"post":{"tags":["admin"],"summary":"Admin Unlink Device","description":"Cut a board loose from the monitoring view -- the factory-reset path.\n\nThe same operation a merchant runs from their own account: unfinished\ncampaigns settled (advertisers refunded, merchant paid for aired time\nonly), the board detached from its venue, its WiFi forgotten and its token\nrevoked so it raises its setup hotspot on next contact. Used when a board\nis redeployed to another shop, or reclaimed. The venue keeps its history;\nonly the hardware is freed.","operationId":"admin_unlink_device_api_v1_admin_devices__device_id__unlink_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices/{device_id}/commands":{"post":{"tags":["admin"],"summary":"Queue Device Command","description":"Push a control action to a board -- change its WiFi, switch its HDMI input,\nreboot it, refresh its display. It is picked up on the board's next poll and\nacknowledged back here, so the operator sees whether it worked.","operationId":"queue_device_command_api_v1_admin_devices__device_id__commands_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCommandRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin"],"summary":"List Device Commands","operationId":"list_device_commands_api_v1_admin_devices__device_id__commands_get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeviceCommandRow"},"title":"Response List Device Commands Api V1 Admin Devices  Device Id  Commands Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices/{device_id}/investigation":{"get":{"tags":["admin"],"summary":"Device Investigation","description":"Everything tied to one screen in one place -- who holds it, its health,\nits numbers, and its full event history -- so an operator can investigate a\ndetected fault without stitching five pages together.","operationId":"device_investigation_api_v1_admin_devices__device_id__investigation_get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Investigation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/leaderboard/screens":{"get":{"tags":["admin"],"summary":"Best Screens","operationId":"best_screens_api_v1_admin_leaderboard_screens_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeaderboardRow"},"title":"Response Best Screens Api V1 Admin Leaderboard Screens Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/leaderboard/clients":{"get":{"tags":["admin"],"summary":"Best Clients","operationId":"best_clients_api_v1_admin_leaderboard_clients_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeaderboardRow"},"title":"Response Best Clients Api V1 Admin Leaderboard Clients Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/campaigns":{"get":{"tags":["admin"],"summary":"List Campaigns","operationId":"list_campaigns_api_v1_admin_campaigns_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CampaignReviewOut"},"title":"Response List Campaigns Api V1 Admin Campaigns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/campaigns/{campaign_id}/approve":{"post":{"tags":["admin"],"summary":"Approve Campaign","operationId":"approve_campaign_api_v1_admin_campaigns__campaign_id__approve_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignReviewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/campaigns/{campaign_id}/reject":{"post":{"tags":["admin"],"summary":"Reject Campaign","operationId":"reject_campaign_api_v1_admin_campaigns__campaign_id__reject_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignReviewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/api-keys":{"get":{"tags":["admin"],"summary":"List Api Keys","operationId":"list_api_keys_api_v1_admin_api_keys_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyOut"},"title":"Response List Api Keys Api V1 Admin Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Api Key","description":"Issue a key for an advertiser. The secret is shown once and never again.","operationId":"create_api_key_api_v1_admin_api_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyIssued"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/api-keys/{key_id}/revoke":{"post":{"tags":["admin"],"summary":"Revoke Api Key","operationId":"revoke_api_key_api_v1_admin_api_keys__key_id__revoke_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/accounts/credit":{"post":{"tags":["admin"],"summary":"Credit Account","description":"Top an advertiser's prepaid balance up by hand, after a transfer lands.","operationId":"credit_account_api_v1_admin_accounts_credit_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCredit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/filler-design":{"get":{"tags":["admin"],"summary":"Get Filler Designs","description":"The house design, and every screen that overrides it.","operationId":"get_filler_designs_api_v1_admin_filler_design_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Put Global Filler Design","description":"The house design: every screen with nothing of its own.","operationId":"put_global_filler_design_api_v1_admin_filler_design_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_put_global_filler_design_api_v1_admin_filler_design_put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Global Filler Design","operationId":"delete_global_filler_design_api_v1_admin_filler_design_delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices/{device_id}/filler-design":{"put":{"tags":["admin"],"summary":"Put Device Filler Design","description":"One screen's own design, which beats the house one.","operationId":"put_device_filler_design_api_v1_admin_devices__device_id__filler_design_put","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_put_device_filler_design_api_v1_admin_devices__device_id__filler_design_put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Device Filler Design","description":"Back to the house design, or to the built-in slide.","operationId":"delete_device_filler_design_api_v1_admin_devices__device_id__filler_design_delete","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/filler-design/preview":{"get":{"tags":["admin"],"summary":"Preview Filler Design","description":"Exactly what a screen will show, QR code included.\n\nRendered against a real screen so the code in the preview is the code that\nscreen will carry -- the one thing worth checking before pushing artwork to\na fleet. With no screen named, the first one stands in for the house design.","operationId":"preview_filler_design_api_v1_admin_filler_design_preview_get","parameters":[{"name":"device_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Code"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/introducers":{"get":{"tags":["admin"],"summary":"List Introducers","operationId":"list_introducers_api_v1_admin_introducers_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Introducer","operationId":"create_introducer_api_v1_admin_introducers_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/introducers/{introducer_id}":{"put":{"tags":["admin"],"summary":"Update Introducer","description":"Contact details and bank details. Never written to a log, here or below.","operationId":"update_introducer_api_v1_admin_introducers__introducer_id__put","parameters":[{"name":"introducer_id","in":"path","required":true,"schema":{"type":"string","title":"Introducer Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/introducers/{introducer_id}/bank":{"get":{"tags":["admin"],"summary":"Reveal Bank Details","description":"The full IBAN, for making the transfer. Asked for deliberately, one at a\ntime, so it never sits in a list on a screen somebody walks past.","operationId":"reveal_bank_details_api_v1_admin_introducers__introducer_id__bank_get","parameters":[{"name":"introducer_id","in":"path","required":true,"schema":{"type":"string","title":"Introducer Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/devices/{device_id}/introducer":{"put":{"tags":["admin"],"summary":"Assign Introducer","description":"Attach a board to the person who placed it, or detach it.\n\nOn the board, not the venue: the commission follows the hardware, so a\nmerchant who moves shop keeps the board somebody earned.","operationId":"assign_introducer_api_v1_admin_devices__device_id__introducer_put","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/introducer-payouts":{"get":{"tags":["admin"],"summary":"List Introducer Payouts","description":"Everything owed and everything already transferred.\n\nMaterialises the mature weeks first, so opening the page is what makes a\nfinished week appear -- there is no separate job to forget to run.","operationId":"list_introducer_payouts_api_v1_admin_introducer_payouts_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/introducer-payouts/{payout_id}/mark-paid":{"post":{"tags":["admin"],"summary":"Mark Introducer Payout Paid","description":"Record that the SEPA transfer was made. This moves no money by itself.","operationId":"mark_introducer_payout_paid_api_v1_admin_introducer_payouts__payout_id__mark_paid_post","parameters":[{"name":"payout_id","in":"path","required":true,"schema":{"type":"string","title":"Payout Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/coupons":{"get":{"tags":["admin"],"summary":"List Coupons","operationId":"list_coupons_api_v1_admin_coupons_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Coupon","operationId":"create_coupon_api_v1_admin_coupons_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/coupons/{coupon_id}":{"put":{"tags":["admin"],"summary":"Update Coupon","description":"Turn a code off, or change what it takes off.\n\nThe percentage is not retroactive: bookings already made keep the price they\nwere charged, because that is the money that actually changed hands.","operationId":"update_coupon_api_v1_admin_coupons__coupon_id__put","parameters":[{"name":"coupon_id","in":"path","required":true,"schema":{"type":"string","title":"Coupon Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/suivi/{token}":{"get":{"tags":["tracking"],"summary":"Get Tracking","operationId":"get_tracking_api_v1_suivi__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/suivi/{token}/reconduction":{"get":{"tags":["tracking"],"summary":"Get Renewal","description":"The same purchase again: same screens, same slots, same length, shifted.\n\nQuoted live rather than copied from what was paid last time -- the screen's\nweekly price may have changed, and a buyer shown a stale figure here would\nmeet a different one in the basket. Availability is reported per screen and\nnever silently applied: a line whose slots are already taken says so, and the\nbuyer decides.","operationId":"get_renewal_api_v1_suivi__token__reconduction_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/verification/email":{"post":{"tags":["verification"],"summary":"Request Code","description":"Mail a six-digit code to the address the buyer typed.","operationId":"request_code_api_v1_verification_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/verification/email/confirm":{"post":{"tags":["verification"],"summary":"Confirm Code","description":"Trade a correct code for the proof the booking routes require.","operationId":"confirm_code_api_v1_verification_email_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProofResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/favicon.ico":{"get":{"tags":["seo"],"summary":"Favicon","description":"The icon every crawler asks for before it asks for anything else.\n\nThe site only ever published an SVG, so this path fell through to the\nsingle-page app's catch-all and answered with an HTML document under a 200 --\nwhich is worse than a 404, because a 404 is understood and a wrong document\nis parsed, rejected and remembered. Search results carried the generic globe.\n\nA PNG served under a .ico name is correct: the Content-Type decides, not the\nextension, and every browser and crawler reads it. 192px is a multiple of 48,\nwhich is what Google requires of a favicon it will display.","operationId":"favicon_favicon_ico_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/robots.txt":{"get":{"tags":["seo"],"summary":"Robots","operationId":"robots_robots_txt_get","responses":{"200":{"description":"Successful Response"}}}},"/sitemap.xml":{"get":{"tags":["seo"],"summary":"Sitemap","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/blog":{"get":{"tags":["content"],"summary":"Blog Index","operationId":"blog_index_blog_get","responses":{"200":{"description":"Successful Response"}}}},"/blog/{slug}":{"get":{"tags":["content"],"summary":"Blog Article","operationId":"blog_article_blog__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gagner-de-l-argent":{"get":{"tags":["content"],"summary":"Sectors Index","operationId":"sectors_index_gagner_de_l_argent_get","responses":{"200":{"description":"Successful Response"}}}},"/gagner-de-l-argent/{slug}":{"get":{"tags":["content"],"summary":"Sector Page","operationId":"sector_page_gagner_de_l_argent__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/villes":{"get":{"tags":["content"],"summary":"Towns Page","operationId":"towns_page_villes_get","responses":{"200":{"description":"Successful Response"}}}},"/ville/{slug}":{"get":{"tags":["content"],"summary":"Town Page","operationId":"town_page_ville__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hote":{"get":{"tags":["content"],"summary":"Host Page","operationId":"host_page_hote_get","responses":{"200":{"description":"Successful Response"}}}},"/api":{"get":{"tags":["content"],"summary":"Agent Portal Page","operationId":"agent_portal_page_api_get","responses":{"200":{"description":"Successful Response"}}}},"/llms.txt":{"get":{"tags":["content"],"summary":"Llms Txt","description":"A plain-text summary for language models that read sites.\n\nAn emerging convention, cheap to serve and honest to write: it states what\nthe service is, what it costs and where the real pages are, so an assistant\nanswering \"comment rentabiliser l'écran de mon commerce\" can cite something\naccurate instead of inferring from marketing copy.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response"}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AccountCredit":{"properties":{"advertiser_email":{"type":"string","title":"Advertiser Email"},"amount_cents":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount Cents"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["advertiser_email","amount_cents"],"title":"AccountCredit"},"AccountEntryOut":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"amount_cents":{"type":"integer","title":"Amount Cents"},"kind":{"type":"string","title":"Kind"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["created_at","amount_cents","kind"],"title":"AccountEntryOut"},"AccountOut":{"properties":{"email":{"type":"string","title":"Email"},"balance_cents":{"type":"integer","title":"Balance Cents"},"keys":{"type":"integer","title":"Keys"}},"type":"object","required":["email","balance_cents","keys"],"title":"AccountOut"},"AgentBalanceResponse":{"properties":{"account_email":{"type":"string","title":"Account Email"},"balance_cents":{"type":"integer","title":"Balance Cents"},"currency":{"type":"string","title":"Currency","default":"EUR"},"recent":{"items":{"$ref":"#/components/schemas/AccountEntryOut"},"type":"array","title":"Recent"}},"type":"object","required":["account_email","balance_cents","recent"],"title":"AgentBalanceResponse"},"AgentOrderItem":{"properties":{"device_code":{"type":"string","title":"Device Code"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"slots":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Slots","default":1},"creative_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Creative Url"}},"type":"object","required":["device_code","starts_at","ends_at","creative_url"],"title":"AgentOrderItem","description":"One screen an agent wants, with the creative it will play.\n\nThe creative arrives as a URL rather than a file: an autonomous buyer has no\nmultipart form to post and usually nothing local to post from, but it always\nhas a link. We fetch it and probe it exactly as if it had been uploaded --\nsee services/creative_fetch.py for why that URL is treated as hostile."},"AgentOrderLine":{"properties":{"device_code":{"type":"string","title":"Device Code"},"venue_name":{"type":"string","title":"Venue Name"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"slots":{"type":"integer","title":"Slots"},"amount_cents":{"type":"integer","title":"Amount Cents"},"vat_cents":{"type":"integer","title":"Vat Cents"}},"type":"object","required":["device_code","venue_name","starts_at","ends_at","slots","amount_cents","vat_cents"],"title":"AgentOrderLine"},"AgentOrderRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AgentOrderItem"},"type":"array","maxItems":20,"minItems":1,"title":"Items"},"notify_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notify Email"}},"type":"object","required":["items"],"title":"AgentOrderRequest"},"AgentOrderResponse":{"properties":{"order_id":{"type":"string","title":"Order Id"},"amount_cents":{"type":"integer","title":"Amount Cents"},"vat_cents":{"type":"integer","title":"Vat Cents"},"total_cents":{"type":"integer","title":"Total Cents"},"lines":{"items":{"$ref":"#/components/schemas/AgentOrderLine"},"type":"array","title":"Lines"},"status":{"type":"string","title":"Status"},"balance_cents":{"type":"integer","title":"Balance Cents"},"tracking_token":{"type":"string","title":"Tracking Token"},"tracking_url":{"type":"string","title":"Tracking Url"}},"type":"object","required":["order_id","amount_cents","vat_cents","total_cents","lines","status","balance_cents","tracking_token","tracking_url"],"title":"AgentOrderResponse"},"AlertRow":{"properties":{"uid":{"type":"string","title":"Uid"},"device_id":{"type":"string","title":"Device Id"},"device_code":{"type":"string","title":"Device Code"},"venue_name":{"type":"string","title":"Venue Name"},"category":{"type":"string","title":"Category"},"kind":{"type":"string","title":"Kind"},"severity":{"type":"string","title":"Severity"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"at":{"type":"string","title":"At"},"ongoing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ongoing"},"ended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ended At"}},"type":"object","required":["uid","device_id","device_code","venue_name","category","kind","severity","at"],"title":"AlertRow","description":"One line of the unified alert history -- security events AND operational\noutages (screen off, board offline) in a single time-ordered stream."},"ApiKeyCreate":{"properties":{"advertiser_email":{"type":"string","title":"Advertiser Email"},"label":{"type":"string","title":"Label","default":"agent"}},"type":"object","required":["advertiser_email"],"title":"ApiKeyCreate"},"ApiKeyIssued":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"prefix":{"type":"string","title":"Prefix"},"owner_email":{"type":"string","title":"Owner Email"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"secret":{"type":"string","title":"Secret"}},"type":"object","required":["id","label","prefix","owner_email","created_at","secret"],"title":"ApiKeyIssued"},"ApiKeyOut":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"prefix":{"type":"string","title":"Prefix"},"owner_email":{"type":"string","title":"Owner Email"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","label","prefix","owner_email","created_at"],"title":"ApiKeyOut"},"Body_claim_device_api_v1_devices_claim_post":{"properties":{"pairing_code":{"type":"string","title":"Pairing Code"},"venue_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Id"},"venue_name":{"type":"string","title":"Venue Name","default":""},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"category":{"type":"string","title":"Category","default":"Commerce"},"footfall_daily_estimate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Footfall Daily Estimate"},"peak_hours_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Peak Hours Note"},"opening_hours":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opening Hours"},"photos":{"items":{"type":"string","format":"binary"},"type":"array","title":"Photos","default":[]}},"type":"object","required":["pairing_code"],"title":"Body_claim_device_api_v1_devices_claim_post"},"Body_claim_init_api_v1_devices_claim_init_post":{"properties":{"agent_version":{"type":"string","title":"Agent Version"},"resolution":{"type":"string","title":"Resolution"},"hardware_serial":{"type":"string","title":"Hardware Serial"},"provisioning_secret":{"type":"string","title":"Provisioning Secret"},"hdmi_port":{"type":"integer","title":"Hdmi Port","default":1}},"type":"object","required":["agent_version","resolution","hardware_serial","provisioning_secret"],"title":"Body_claim_init_api_v1_devices_claim_init_post"},"Body_create_campaign_api_v1_campaigns_post":{"properties":{"device_code":{"type":"string","title":"Device Code"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"advertiser_email":{"type":"string","format":"email","title":"Advertiser Email"},"verification_token":{"type":"string","title":"Verification Token","default":""},"slots":{"type":"integer","title":"Slots","default":1},"file":{"items":{"type":"string","format":"binary"},"type":"array","title":"File"},"coupon_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon Code"}},"type":"object","required":["device_code","starts_at","ends_at","advertiser_email","file"],"title":"Body_create_campaign_api_v1_campaigns_post"},"Body_create_order_api_v1_orders_post":{"properties":{"items_json":{"type":"string","title":"Items Json"},"advertiser_email":{"type":"string","format":"email","title":"Advertiser Email"},"verification_token":{"type":"string","title":"Verification Token","default":""},"file":{"items":{"type":"string","format":"binary"},"type":"array","title":"File"}},"type":"object","required":["items_json","advertiser_email","file"],"title":"Body_create_order_api_v1_orders_post"},"Body_create_slide_api_v1_merchant_slides_post":{"properties":{"device_code":{"type":"string","title":"Device Code"},"title":{"type":"string","title":"Title"},"position":{"type":"integer","title":"Position","default":1},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"daily_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daily From"},"daily_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daily To"},"activate":{"type":"boolean","title":"Activate","default":true},"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["device_code","title","file"],"title":"Body_create_slide_api_v1_merchant_slides_post"},"Body_put_device_filler_design_api_v1_admin_devices__device_id__filler_design_put":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"qr_x_pct":{"type":"integer","title":"Qr X Pct","default":50},"qr_y_pct":{"type":"integer","title":"Qr Y Pct","default":50},"qr_size_pct":{"type":"integer","title":"Qr Size Pct","default":33}},"type":"object","required":["file"],"title":"Body_put_device_filler_design_api_v1_admin_devices__device_id__filler_design_put"},"Body_put_global_filler_design_api_v1_admin_filler_design_put":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"qr_x_pct":{"type":"integer","title":"Qr X Pct","default":50},"qr_y_pct":{"type":"integer","title":"Qr Y Pct","default":50},"qr_size_pct":{"type":"integer","title":"Qr Size Pct","default":33}},"type":"object","required":["file"],"title":"Body_put_global_filler_design_api_v1_admin_filler_design_put"},"Body_replace_media_api_v1_merchant_slides__slide_id__media_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_replace_media_api_v1_merchant_slides__slide_id__media_post"},"BookingItem":{"properties":{"campaign_id":{"type":"string","title":"Campaign Id"},"device_code":{"type":"string","title":"Device Code"},"venue_name":{"type":"string","title":"Venue Name"},"starts_at":{"type":"string","title":"Starts At"},"ends_at":{"type":"string","title":"Ends At"},"slots":{"type":"integer","title":"Slots"},"amount_cents":{"type":"integer","title":"Amount Cents"},"merchant_share_cents":{"type":"integer","title":"Merchant Share Cents"},"status":{"type":"string","title":"Status"},"advertiser_email":{"type":"string","title":"Advertiser Email"}},"type":"object","required":["campaign_id","device_code","venue_name","starts_at","ends_at","slots","amount_cents","merchant_share_cents","status","advertiser_email"],"title":"BookingItem"},"BucketIn":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"hour":{"type":"integer","maximum":23.0,"minimum":0.0,"title":"Hour"},"contacts":{"type":"integer","minimum":0.0,"title":"Contacts"},"presence":{"type":"integer","minimum":0.0,"title":"Presence","default":0},"visitors":{"type":"integer","minimum":0.0,"title":"Visitors","default":0},"samples":{"type":"integer","minimum":0.0,"title":"Samples","default":0},"scan_seconds":{"type":"number","minimum":0.0,"title":"Scan Seconds"},"span_seconds":{"type":"number","minimum":0.0,"title":"Span Seconds"},"duty_ratio":{"type":"number","minimum":0.0,"title":"Duty Ratio","default":0.0},"saturated":{"type":"boolean","title":"Saturated","default":false}},"type":"object","required":["date","hour","contacts","scan_seconds","span_seconds"],"title":"BucketIn"},"BusyPeriod":{"properties":{"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"slots_taken":{"type":"integer","title":"Slots Taken"},"slots_free":{"type":"integer","title":"Slots Free"}},"type":"object","required":["starts_at","ends_at","slots_taken","slots_free"],"title":"BusyPeriod"},"CampaignCreateResponse":{"properties":{"campaign_id":{"type":"string","title":"Campaign Id"},"checkout_url":{"type":"string","title":"Checkout Url"},"tracking_token":{"type":"string","title":"Tracking Token","default":""}},"type":"object","required":["campaign_id","checkout_url"],"title":"CampaignCreateResponse"},"CampaignReviewOut":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"reject_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reject Reason"},"media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Url"},"media_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Kind"},"media_status":{"type":"string","title":"Media Status"},"media_ready":{"type":"boolean","title":"Media Ready"},"duration_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration S"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"advertiser_email":{"type":"string","title":"Advertiser Email"},"device_code":{"type":"string","title":"Device Code"},"venue_name":{"type":"string","title":"Venue Name"},"merchant_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Email"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"hours":{"type":"integer","title":"Hours"},"duration_label":{"type":"string","title":"Duration Label"},"slots":{"type":"integer","title":"Slots"},"amount_cents":{"type":"integer","title":"Amount Cents"},"vat_cents":{"type":"integer","title":"Vat Cents","default":0},"merchant_share_cents":{"type":"integer","title":"Merchant Share Cents"},"submitted_at":{"type":"string","title":"Submitted At"}},"type":"object","required":["id","status","media_status","media_ready","advertiser_email","device_code","venue_name","starts_at","ends_at","hours","duration_label","slots","amount_cents","merchant_share_cents","submitted_at"],"title":"CampaignReviewOut","description":"Everything a merchant needs to judge an ad before it plays in their shop.\nApproving without seeing the creative was never a real decision."},"ClaimInitResponse":{"properties":{"device_token":{"type":"string","title":"Device Token"},"device_id":{"type":"string","title":"Device Id"},"code":{"type":"string","title":"Code"},"pairing_code":{"type":"string","title":"Pairing Code"},"poll_interval_s":{"type":"integer","title":"Poll Interval S"},"provisioning_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provisioning Secret","default":""},"factory_reset":{"type":"boolean","title":"Factory Reset","default":false}},"type":"object","required":["device_token","device_id","code","pairing_code","poll_interval_s"],"title":"ClaimInitResponse"},"ClientDetail":{"properties":{"client":{"$ref":"#/components/schemas/ClientRow"},"devices":{"items":{"$ref":"#/components/schemas/ClientDeviceRow"},"type":"array","title":"Devices"}},"type":"object","required":["client","devices"],"title":"ClientDetail"},"ClientDeviceRow":{"properties":{"id":{"type":"string","title":"Id"},"code":{"type":"string","title":"Code"},"venue_name":{"type":"string","title":"Venue Name"},"address":{"type":"string","title":"Address"},"online":{"type":"boolean","title":"Online"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"},"approved":{"type":"boolean","title":"Approved"},"hardware_serial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hardware Serial"},"agent_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Version"},"price_cents_per_week":{"type":"integer","title":"Price Cents Per Week"},"live_campaigns":{"type":"integer","title":"Live Campaigns"}},"type":"object","required":["id","code","venue_name","address","online","approved","price_cents_per_week","live_campaigns"],"title":"ClientDeviceRow"},"ClientRow":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"created_at":{"type":"string","title":"Created At"},"venue_count":{"type":"integer","title":"Venue Count"},"device_count":{"type":"integer","title":"Device Count"},"devices_online":{"type":"integer","title":"Devices Online"},"stripe_connected":{"type":"boolean","title":"Stripe Connected"},"earned_total_cents":{"type":"integer","title":"Earned Total Cents"},"pending_payout_cents":{"type":"integer","title":"Pending Payout Cents"}},"type":"object","required":["id","email","created_at","venue_count","device_count","devices_online","stripe_connected","earned_total_cents","pending_payout_cents"],"title":"ClientRow"},"CodeConfirm":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"CodeConfirm"},"CodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"CodeRequest"},"ContactRequest":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"subject":{"type":"string","title":"Subject","default":""},"message":{"type":"string","title":"Message"}},"type":"object","required":["name","email","message"],"title":"ContactRequest"},"CreateDeviceRequest":{"properties":{"venue_id":{"type":"string","title":"Venue Id"},"orientation":{"type":"string","title":"Orientation","default":"landscape"},"price_cents_per_week":{"type":"integer","title":"Price Cents Per Week"},"loop_slots":{"type":"integer","title":"Loop Slots","default":4},"slot_duration_s":{"type":"integer","title":"Slot Duration S","default":10},"revenue_share_bps":{"type":"integer","title":"Revenue Share Bps","default":5000}},"type":"object","required":["venue_id","price_cents_per_week"],"title":"CreateDeviceRequest"},"CreateUserRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"role":{"type":"string","title":"Role"}},"type":"object","required":["email","password","role"],"title":"CreateUserRequest"},"CreateVenueRequest":{"properties":{"merchant_id":{"type":"string","title":"Merchant Id"},"name":{"type":"string","title":"Name"},"address":{"type":"string","title":"Address"},"category":{"type":"string","title":"Category"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"footfall_daily_estimate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Footfall Daily Estimate"}},"type":"object","required":["merchant_id","name","address","category"],"title":"CreateVenueRequest"},"DayAvailability":{"properties":{"date":{"type":"string","title":"Date"},"weekday":{"type":"integer","title":"Weekday"},"closed_all_day":{"type":"boolean","title":"Closed All Day"},"free_hours":{"type":"integer","title":"Free Hours"},"hours":{"items":{"$ref":"#/components/schemas/HourCell"},"type":"array","title":"Hours"}},"type":"object","required":["date","weekday","closed_all_day","free_hours","hours"],"title":"DayAvailability"},"DeviceCommandList":{"properties":{"commands":{"items":{"$ref":"#/components/schemas/DeviceCommandOut"},"type":"array","title":"Commands","default":[]}},"type":"object","title":"DeviceCommandList"},"DeviceCommandOut":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","title":"Kind"},"payload":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Payload"}},"type":"object","required":["id","kind"],"title":"DeviceCommandOut"},"DeviceCommandResult":{"properties":{"status":{"type":"string","title":"Status"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"}},"type":"object","required":["status"],"title":"DeviceCommandResult"},"DeviceCommandRow":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","title":"Kind"},"status":{"type":"string","title":"Status"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"created_at":{"type":"string","title":"Created At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","kind","status","created_at"],"title":"DeviceCommandRow"},"DeviceCreatedResponse":{"properties":{"device_id":{"type":"string","title":"Device Id"},"code":{"type":"string","title":"Code"},"pairing_code":{"type":"string","title":"Pairing Code"}},"type":"object","required":["device_id","code","pairing_code"],"title":"DeviceCreatedResponse"},"DeviceDetail":{"properties":{"id":{"type":"string","title":"Id"},"code":{"type":"string","title":"Code"},"venue_id":{"type":"string","title":"Venue Id"},"venue_name":{"type":"string","title":"Venue Name"},"address":{"type":"string","title":"Address"},"category":{"type":"string","title":"Category"},"orientation":{"type":"string","title":"Orientation"},"online":{"type":"boolean","title":"Online"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"},"offline_since_s":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Offline Since S"},"agent_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Version"},"price_cents_per_week":{"type":"integer","title":"Price Cents Per Week"},"price_cents_per_day":{"type":"integer","title":"Price Cents Per Day"},"platform_fee_bps":{"type":"integer","title":"Platform Fee Bps","default":3000},"advertiser_price_cents_per_week":{"type":"integer","title":"Advertiser Price Cents Per Week","default":0},"loop_slots":{"type":"integer","title":"Loop Slots"},"merchant_slots":{"type":"integer","title":"Merchant Slots","default":2},"slot_seconds":{"type":"integer","title":"Slot Seconds","default":10},"slot_changes":{"items":{"type":"object"},"type":"array","title":"Slot Changes","default":[]},"slot_limits":{"type":"object","title":"Slot Limits","default":{}},"hdmi_port":{"type":"integer","title":"Hdmi Port","default":1},"photo_urls":{"items":{"type":"string"},"type":"array","title":"Photo Urls","default":[]},"footfall_daily_estimate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Footfall Daily Estimate"},"peak_hours_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Peak Hours Note"},"opening_hours":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Opening Hours"},"uptime_ratio_30d":{"type":"number","title":"Uptime Ratio 30D"},"open_seconds_30d":{"type":"integer","title":"Open Seconds 30D","default":0},"down_seconds_30d":{"type":"integer","title":"Down Seconds 30D","default":0},"hours_declared":{"type":"boolean","title":"Hours Declared","default":true},"recent_outages":{"items":{"$ref":"#/components/schemas/OutageItem"},"type":"array","title":"Recent Outages","default":[]},"cpu_temp_c":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Temp C"},"disk_free_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Disk Free Mb"},"wifi_rssi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wifi Rssi"},"screen":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Screen"}},"type":"object","required":["id","code","venue_id","venue_name","address","category","orientation","online","price_cents_per_week","price_cents_per_day","loop_slots","uptime_ratio_30d"],"title":"DeviceDetail"},"DeviceFleetItem":{"properties":{"id":{"type":"string","title":"Id"},"code":{"type":"string","title":"Code"},"venue_name":{"type":"string","title":"Venue Name"},"status":{"type":"string","title":"Status"},"online":{"type":"boolean","title":"Online"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"},"agent_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Version"},"screen":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Screen"},"merchant_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Email"},"merchant_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Phone"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"}},"type":"object","required":["id","code","venue_name","status","online"],"title":"DeviceFleetItem"},"DeviceListItem":{"properties":{"code":{"type":"string","title":"Code"},"venue_name":{"type":"string","title":"Venue Name"},"category":{"type":"string","title":"Category"},"address":{"type":"string","title":"Address"},"photo_urls":{"items":{"type":"string"},"type":"array","title":"Photo Urls","default":[]},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"price_cents_per_week":{"type":"integer","title":"Price Cents Per Week"},"slots_free":{"type":"integer","title":"Slots Free"},"footfall_daily_average":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Footfall Daily Average"},"footfall_state":{"type":"string","title":"Footfall State","default":"no_data"},"footfall_days_measured":{"type":"integer","title":"Footfall Days Measured","default":0},"distance_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Distance Label"},"matched_search":{"type":"boolean","title":"Matched Search","default":false},"category_label":{"type":"string","title":"Category Label","default":""},"category_emoji":{"type":"string","title":"Category Emoji","default":""},"views_30d":{"type":"integer","title":"Views 30D","default":0},"open_now":{"type":"boolean","title":"Open Now","default":true}},"type":"object","required":["code","venue_name","category","address","price_cents_per_week","slots_free"],"title":"DeviceListItem"},"DevicePricingUpdateRequest":{"properties":{"price_cents_per_week":{"type":"integer","title":"Price Cents Per Week"}},"type":"object","required":["price_cents_per_week"],"title":"DevicePricingUpdateRequest"},"EarningsSummary":{"properties":{"pending_review_count":{"type":"integer","title":"Pending Review Count"},"live_count":{"type":"integer","title":"Live Count"},"upcoming_count":{"type":"integer","title":"Upcoming Count"},"earned_total_cents":{"type":"integer","title":"Earned Total Cents"},"due_cents":{"type":"integer","title":"Due Cents"},"upcoming_payout_cents":{"type":"integer","title":"Upcoming Payout Cents"},"paid_out_cents":{"type":"integer","title":"Paid Out Cents"},"not_aired_cents":{"type":"integer","title":"Not Aired Cents"}},"type":"object","required":["pending_review_count","live_count","upcoming_count","earned_total_cents","due_cents","upcoming_payout_cents","paid_out_cents","not_aired_cents"],"title":"EarningsSummary"},"FootfallIn":{"properties":{"buckets":{"items":{"$ref":"#/components/schemas/BucketIn"},"type":"array","title":"Buckets"}},"type":"object","required":["buckets"],"title":"FootfallIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HdmiPortRequest":{"properties":{"port":{"type":"integer","title":"Port"}},"type":"object","required":["port"],"title":"HdmiPortRequest"},"HeartbeatRequest":{"properties":{"uptime_s":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime S"},"cpu_temp_c":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Temp C"},"disk_free_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Disk Free Mb"},"mpv_running":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mpv Running"},"playlist_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Playlist Version"},"agent_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Version"},"wifi_rssi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wifi Rssi"},"screen":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Screen"},"security":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Security"},"hardware_serial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hardware Serial"},"bssid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bssid"},"wifi_ssid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wifi Ssid"}},"type":"object","title":"HeartbeatRequest"},"HourCell":{"properties":{"hour":{"type":"integer","title":"Hour"},"state":{"type":"string","title":"State"},"slots_free":{"type":"integer","title":"Slots Free"}},"type":"object","required":["hour","state","slots_free"],"title":"HourCell","description":"One hour of one day, and whether it can be sold."},"Investigation":{"properties":{"device_id":{"type":"string","title":"Device Id"},"device_code":{"type":"string","title":"Device Code"},"hardware_serial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hardware Serial"},"agent_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Version"},"online":{"type":"boolean","title":"Online"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"},"screen_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screen State"},"hdmi_port":{"type":"integer","title":"Hdmi Port","default":1},"bssid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bssid"},"wifi_ssid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wifi Ssid"},"cpu_temp_c":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Temp C"},"disk_free_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Disk Free Mb"},"wifi_rssi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wifi Rssi"},"venue_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Name"},"venue_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Address"},"merchant_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Email"},"merchant_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Phone"},"merchant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Name"},"linked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linked At"},"live_campaigns":{"type":"integer","title":"Live Campaigns","default":0},"passages_24h":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passages 24H"},"scans_7d":{"type":"integer","title":"Scans 7D","default":0},"events":{"items":{"$ref":"#/components/schemas/InvestigationEvent"},"type":"array","title":"Events","default":[]},"outages":{"items":{"$ref":"#/components/schemas/MonitorOutage"},"type":"array","title":"Outages","default":[]},"commands":{"items":{"$ref":"#/components/schemas/DeviceCommandRow"},"type":"array","title":"Commands","default":[]}},"type":"object","required":["device_id","device_code","online"],"title":"Investigation"},"InvestigationEvent":{"properties":{"kind":{"type":"string","title":"Kind"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"at":{"type":"string","title":"At"}},"type":"object","required":["kind","at"],"title":"InvestigationEvent"},"KeyCreate":{"properties":{"label":{"type":"string","maxLength":80,"title":"Label","default":"agent"}},"type":"object","title":"KeyCreate"},"LeaderboardRow":{"properties":{"label":{"type":"string","title":"Label"},"sublabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sublabel"},"revenue_cents":{"type":"integer","title":"Revenue Cents"},"campaigns":{"type":"integer","title":"Campaigns"}},"type":"object","required":["label","revenue_cents","campaigns"],"title":"LeaderboardRow"},"LoginCodeConfirm":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"LoginCodeConfirm"},"LoginCodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"LoginCodeRequest"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"LoginResponse":{"properties":{"result":{"type":"string","title":"Result"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"otp_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Otp Hint"}},"type":"object","required":["result"],"title":"LoginResponse","description":"Either a session, or a demand for the code we just emailed.\n\nOne response type for both outcomes rather than two endpoints: the client\nposts credentials and is told what happens next, which keeps the \"was the\npassword right?\" answer in one place."},"MerchantDeviceItem":{"properties":{"id":{"type":"string","title":"Id"},"code":{"type":"string","title":"Code"},"venue_name":{"type":"string","title":"Venue Name"},"status":{"type":"string","title":"Status"},"online":{"type":"boolean","title":"Online"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"},"offline_since_s":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Offline Since S"},"screen_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screen State"},"screen_resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screen Resolution"},"loop_slots":{"type":"integer","title":"Loop Slots","default":4},"merchant_slots":{"type":"integer","title":"Merchant Slots","default":2},"merchant_slots_planned":{"type":"integer","title":"Merchant Slots Planned","default":2}},"type":"object","required":["id","code","venue_name","status","online"],"title":"MerchantDeviceItem"},"MonitorAlert":{"properties":{"device_code":{"type":"string","title":"Device Code"},"venue_name":{"type":"string","title":"Venue Name"},"kind":{"type":"string","title":"Kind"},"severity":{"type":"string","title":"Severity"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"occurred_at":{"type":"string","title":"Occurred At"}},"type":"object","required":["device_code","venue_name","kind","severity","occurred_at"],"title":"MonitorAlert"},"MonitorOutage":{"properties":{"device_code":{"type":"string","title":"Device Code"},"venue_name":{"type":"string","title":"Venue Name"},"kind":{"type":"string","title":"Kind"},"started_at":{"type":"string","title":"Started At"},"ongoing":{"type":"boolean","title":"Ongoing"}},"type":"object","required":["device_code","venue_name","kind","started_at","ongoing"],"title":"MonitorOutage"},"MonitorScreen":{"properties":{"device_id":{"type":"string","title":"Device Id"},"device_code":{"type":"string","title":"Device Code"},"venue_name":{"type":"string","title":"Venue Name"},"online":{"type":"boolean","title":"Online"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"},"live_campaigns":{"type":"integer","title":"Live Campaigns"},"presence_now":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Presence Now"},"presence_fresh":{"type":"boolean","title":"Presence Fresh","default":false},"passages_24h":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passages 24H"},"screen_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screen State"},"hdmi_port":{"type":"integer","title":"Hdmi Port","default":1},"merchant_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Email"},"merchant_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Phone"},"agent_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Version"},"bssid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bssid"},"wifi_ssid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wifi Ssid"},"introducer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Introducer Id"},"introducer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Introducer Name"},"ongoing_outage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ongoing Outage"}},"type":"object","required":["device_id","device_code","venue_name","online","live_campaigns"],"title":"MonitorScreen"},"Monitoring":{"properties":{"generated_at":{"type":"string","title":"Generated At"},"screens":{"items":{"$ref":"#/components/schemas/MonitorScreen"},"type":"array","title":"Screens"},"alerts":{"items":{"$ref":"#/components/schemas/MonitorAlert"},"type":"array","title":"Alerts"},"outages":{"items":{"$ref":"#/components/schemas/MonitorOutage"},"type":"array","title":"Outages"}},"type":"object","required":["generated_at","screens","alerts","outages"],"title":"Monitoring"},"OrderCreateResponse":{"properties":{"order_id":{"type":"string","title":"Order Id"},"amount_cents":{"type":"integer","title":"Amount Cents"},"vat_cents":{"type":"integer","title":"Vat Cents"},"total_cents":{"type":"integer","title":"Total Cents"},"checkout_url":{"type":"string","title":"Checkout Url"},"tracking_token":{"type":"string","title":"Tracking Token","default":""}},"type":"object","required":["order_id","amount_cents","vat_cents","total_cents","checkout_url"],"title":"OrderCreateResponse"},"OrderItemIn":{"properties":{"device_code":{"type":"string","title":"Device Code"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"slots":{"type":"integer","minimum":1.0,"title":"Slots","default":1},"creatives":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Creatives","default":1}},"type":"object","required":["device_code","starts_at","ends_at"],"title":"OrderItemIn","description":"One screen in the basket, with its own dates and slot count."},"OrderQuoteRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OrderItemIn"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"OrderQuoteRequest"},"OrderQuoteResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/QuotedItem"},"type":"array","title":"Items"},"amount_cents":{"type":"integer","title":"Amount Cents"},"vat_cents":{"type":"integer","title":"Vat Cents"},"vat_rate_bps":{"type":"integer","title":"Vat Rate Bps"},"total_cents":{"type":"integer","title":"Total Cents"}},"type":"object","required":["items","amount_cents","vat_cents","vat_rate_bps","total_cents"],"title":"OrderQuoteResponse"},"OtpRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","password","code"],"title":"OtpRequest"},"OutageItem":{"properties":{"started_at":{"type":"string","title":"Started At"},"ended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ended At"},"duration_s":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration S"},"kind":{"type":"string","title":"Kind","default":"offline"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["started_at"],"title":"OutageItem"},"PairRequest":{"properties":{"pairing_code":{"type":"string","title":"Pairing Code"},"agent_version":{"type":"string","title":"Agent Version"},"resolution":{"type":"string","title":"Resolution"}},"type":"object","required":["pairing_code","agent_version","resolution"],"title":"PairRequest"},"PairResponse":{"properties":{"device_token":{"type":"string","title":"Device Token"},"device_id":{"type":"string","title":"Device Id"},"poll_interval_s":{"type":"integer","title":"Poll Interval S"}},"type":"object","required":["device_token","device_id","poll_interval_s"],"title":"PairResponse"},"PasswordResetConfirm":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"PasswordResetConfirm"},"PasswordResetRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"PasswordResetRequest"},"PayoutCampaignDetail":{"properties":{"campaign_id":{"type":"string","title":"Campaign Id"},"advertiser_email":{"type":"string","title":"Advertiser Email"},"media_kind":{"type":"string","title":"Media Kind"},"starts_at":{"type":"string","title":"Starts At"},"ends_at":{"type":"string","title":"Ends At"},"total_share_cents":{"type":"integer","title":"Total Share Cents"},"earned_cents":{"type":"integer","title":"Earned Cents"},"due_cents":{"type":"integer","title":"Due Cents"},"days":{"items":{"$ref":"#/components/schemas/PayoutDayLine"},"type":"array","title":"Days"}},"type":"object","required":["campaign_id","advertiser_email","media_kind","starts_at","ends_at","total_share_cents","earned_cents","due_cents","days"],"title":"PayoutCampaignDetail"},"PayoutDayLine":{"properties":{"day":{"type":"string","title":"Day"},"share_cents":{"type":"integer","title":"Share Cents"},"plays":{"type":"integer","title":"Plays"},"aired_minutes":{"type":"integer","title":"Aired Minutes"},"status":{"type":"string","title":"Status"}},"type":"object","required":["day","share_cents","plays","aired_minutes","status"],"title":"PayoutDayLine"},"PayoutDetail":{"properties":{"summary":{"$ref":"#/components/schemas/EarningsSummary"},"campaigns":{"items":{"$ref":"#/components/schemas/PayoutCampaignDetail"},"type":"array","title":"Campaigns"},"payouts":{"items":{"$ref":"#/components/schemas/PayoutRow"},"type":"array","title":"Payouts"}},"type":"object","required":["summary","campaigns","payouts"],"title":"PayoutDetail"},"PayoutRow":{"properties":{"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"amount_cents":{"type":"integer","title":"Amount Cents"},"status":{"type":"string","title":"Status"},"paid_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid At"}},"type":"object","required":["period_start","period_end","amount_cents","status"],"title":"PayoutRow"},"PendingDeviceItem":{"properties":{"id":{"type":"string","title":"Id"},"code":{"type":"string","title":"Code"},"pairing_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pairing Code"},"hardware_serial":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hardware Serial"},"agent_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Version"},"first_seen_at":{"type":"string","title":"First Seen At"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"}},"type":"object","required":["id","code","first_seen_at"],"title":"PendingDeviceItem"},"PendingPayoutRow":{"properties":{"merchant_id":{"type":"string","title":"Merchant Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"stripe_connected":{"type":"boolean","title":"Stripe Connected"},"device_count":{"type":"integer","title":"Device Count"},"earned_total_cents":{"type":"integer","title":"Earned Total Cents"},"already_paid_cents":{"type":"integer","title":"Already Paid Cents"},"pending_payout_cents":{"type":"integer","title":"Pending Payout Cents"},"iban":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iban"},"iban_holder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iban Holder"}},"type":"object","required":["merchant_id","email","stripe_connected","device_count","earned_total_cents","already_paid_cents","pending_payout_cents"],"title":"PendingPayoutRow"},"PlanGap":{"properties":{"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"hours":{"type":"number","title":"Hours"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["starts_at","ends_at","hours","reason"],"title":"PlanGap"},"PlanOffer":{"properties":{"kind":{"type":"string","title":"Kind"},"label":{"type":"string","title":"Label"},"gain":{"type":"string","title":"Gain"},"extra_cents":{"type":"integer","title":"Extra Cents"},"total_cents":{"type":"integer","title":"Total Cents"},"slots":{"type":"integer","title":"Slots"},"loop_slots":{"type":"integer","title":"Loop Slots"},"guaranteed":{"type":"boolean","title":"Guaranteed"},"new_ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"New Ends At"},"new_slots":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"New Slots"}},"type":"object","required":["kind","label","gain","extra_cents","total_cents","slots","loop_slots","guaranteed"],"title":"PlanOffer","description":"One step up from the plan as it stands, priced by the engine that bills.\n\nTWO OF THEM, ON THE TWO AXES THE SCREEN ACTUALLY SELLS\n\n`kind=\"duration\"` buys a longer run; `kind=\"slots\"` buys another space in\nthe loop. Offering only the first would leave the advertiser who wants to\nbe on the screen more often with nothing to buy -- which is how the page\nstood until this was added, and it was the larger of the two misses.\n\nPriced here rather than in the browser for the same reason everything else\non this page is: the button has to charge what it says. Taking the offer\nsets `new_ends_at` or `new_slots` on the form, and the plan that comes back\nquotes exactly `total_cents`."},"PlanRequest":{"properties":{"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"slots":{"type":"integer","minimum":1.0,"title":"Slots","default":1}},"type":"object","required":["starts_at","ends_at"],"title":"PlanRequest"},"PlanResponse":{"properties":{"bookable":{"type":"boolean","title":"Bookable"},"slots":{"type":"integer","title":"Slots"},"segments":{"items":{"$ref":"#/components/schemas/PlanSegment"},"type":"array","title":"Segments"},"gaps":{"items":{"$ref":"#/components/schemas/PlanGap"},"type":"array","title":"Gaps"},"airtime_hours":{"type":"number","title":"Airtime Hours"},"billable_hours_exact":{"type":"number","title":"Billable Hours Exact"},"requested_hours":{"type":"number","title":"Requested Hours"},"billable_hours":{"type":"integer","title":"Billable Hours"},"amount_cents":{"type":"integer","title":"Amount Cents"},"vat_cents":{"type":"integer","title":"Vat Cents"},"total_cents":{"type":"integer","title":"Total Cents"},"vat_rate_bps":{"type":"integer","title":"Vat Rate Bps"},"at_minimum":{"type":"boolean","title":"At Minimum"},"max_slots_available":{"type":"integer","title":"Max Slots Available"},"loop_slots":{"type":"integer","title":"Loop Slots"},"full_price_cents":{"type":"integer","title":"Full Price Cents"},"offers":{"items":{"$ref":"#/components/schemas/PlanOffer"},"type":"array","title":"Offers"},"opening_hours":{"items":{"type":"object"},"type":"array","title":"Opening Hours"},"message":{"type":"string","title":"Message"}},"type":"object","required":["bookable","slots","segments","gaps","airtime_hours","billable_hours_exact","requested_hours","billable_hours","amount_cents","vat_cents","total_cents","vat_rate_bps","at_minimum","max_slots_available","loop_slots","full_price_cents","offers","opening_hours","message"],"title":"PlanResponse"},"PlanSegment":{"properties":{"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"hours":{"type":"number","title":"Hours"},"slots":{"type":"integer","title":"Slots","default":1},"amount_cents":{"type":"integer","title":"Amount Cents","default":0}},"type":"object","required":["starts_at","ends_at","hours"],"title":"PlanSegment"},"PlatformStats":{"properties":{"merchants":{"type":"integer","title":"Merchants"},"advertisers":{"type":"integer","title":"Advertisers"},"devices_total":{"type":"integer","title":"Devices Total"},"devices_online":{"type":"integer","title":"Devices Online"},"devices_awaiting_approval":{"type":"integer","title":"Devices Awaiting Approval"},"campaigns_live":{"type":"integer","title":"Campaigns Live"},"campaigns_pending_review":{"type":"integer","title":"Campaigns Pending Review"},"gross_revenue_cents":{"type":"integer","title":"Gross Revenue Cents"},"platform_fees_cents":{"type":"integer","title":"Platform Fees Cents"},"merchant_share_cents":{"type":"integer","title":"Merchant Share Cents","default":0},"owed_to_merchants_cents":{"type":"integer","title":"Owed To Merchants Cents"},"upcoming_payout_cents":{"type":"integer","title":"Upcoming Payout Cents","default":0},"plays_30d":{"type":"integer","title":"Plays 30D"},"played_seconds_30d":{"type":"integer","title":"Played Seconds 30D","default":0},"refunded_cents":{"type":"integer","title":"Refunded Cents","default":0},"refund_count":{"type":"integer","title":"Refund Count","default":0}},"type":"object","required":["merchants","advertisers","devices_total","devices_online","devices_awaiting_approval","campaigns_live","campaigns_pending_review","gross_revenue_cents","platform_fees_cents","owed_to_merchants_cents","plays_30d"],"title":"PlatformStats"},"PlayIn":{"properties":{"campaign_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Id"},"played_at":{"type":"string","title":"Played At"},"duration_ms":{"type":"integer","title":"Duration Ms"}},"type":"object","required":["played_at","duration_ms"],"title":"PlayIn"},"PlaylistItemOut":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","title":"Kind"},"url":{"type":"string","title":"Url"},"sha256":{"type":"string","title":"Sha256"},"duration_s":{"type":"number","title":"Duration S"},"campaign_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Id"}},"type":"object","required":["id","kind","url","sha256","duration_s"],"title":"PlaylistItemOut"},"PlaylistResponse":{"properties":{"version":{"type":"string","title":"Version"},"loop_slots":{"type":"integer","title":"Loop Slots"},"items":{"items":{"$ref":"#/components/schemas/PlaylistItemOut"},"type":"array","title":"Items"},"reclaim_screen":{"type":"boolean","title":"Reclaim Screen","default":false}},"type":"object","required":["version","loop_slots","items"],"title":"PlaylistResponse"},"PlaysBatchRequest":{"properties":{"plays":{"items":{"$ref":"#/components/schemas/PlayIn"},"type":"array","title":"Plays"}},"type":"object","required":["plays"],"title":"PlaysBatchRequest"},"ProofResponse":{"properties":{"verification_token":{"type":"string","title":"Verification Token"}},"type":"object","required":["verification_token"],"title":"ProofResponse"},"PublicDeviceResponse":{"properties":{"code":{"type":"string","title":"Code"},"venue_name":{"type":"string","title":"Venue Name"},"category":{"type":"string","title":"Category"},"address":{"type":"string","title":"Address"},"photo_urls":{"items":{"type":"string"},"type":"array","title":"Photo Urls","default":[]},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"footfall_daily_estimate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Footfall Daily Estimate"},"peak_hours_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Peak Hours Note"},"price_cents_per_week":{"type":"integer","title":"Price Cents Per Week"},"price_cents_per_day":{"type":"integer","title":"Price Cents Per Day"},"vat_rate_bps":{"type":"integer","title":"Vat Rate Bps","default":0},"busy_periods":{"items":{"$ref":"#/components/schemas/BusyPeriod"},"type":"array","title":"Busy Periods","default":[]},"server_now":{"type":"string","title":"Server Now","default":""},"opening_hours":{"items":{"type":"object"},"type":"array","title":"Opening Hours","default":[]},"views_30d":{"type":"integer","title":"Views 30D","default":0},"qr_scans_30d":{"type":"integer","title":"Qr Scans 30D","default":0},"loop_slots":{"type":"integer","title":"Loop Slots"},"loop_seconds":{"type":"integer","title":"Loop Seconds","default":70},"slot_seconds":{"type":"integer","title":"Slot Seconds","default":10},"slot_changes":{"items":{"type":"object"},"type":"array","title":"Slot Changes","default":[]},"next_available_at":{"type":"string","title":"Next Available At"},"slots_free":{"type":"integer","title":"Slots Free"},"screen":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Screen"},"online":{"type":"boolean","title":"Online","default":true},"open_hours_on_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Open Hours On Rate"}},"type":"object","required":["code","venue_name","category","address","price_cents_per_week","price_cents_per_day","loop_slots","next_available_at","slots_free"],"title":"PublicDeviceResponse"},"QuotedItem":{"properties":{"available":{"type":"boolean","title":"Available","default":true},"unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unavailable Reason"},"device_code":{"type":"string","title":"Device Code"},"venue_name":{"type":"string","title":"Venue Name"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"hours":{"type":"integer","title":"Hours"},"duration_label":{"type":"string","title":"Duration Label"},"slots":{"type":"integer","title":"Slots"},"amount_cents":{"type":"integer","title":"Amount Cents"},"shortfalls":{"items":{"$ref":"#/components/schemas/QuotedShortfall"},"type":"array","title":"Shortfalls","default":[]},"slots_available":{"type":"integer","title":"Slots Available","default":0},"loop_slots":{"type":"integer","title":"Loop Slots","default":0}},"type":"object","required":["device_code","venue_name","starts_at","ends_at","hours","duration_label","slots","amount_cents"],"title":"QuotedItem"},"QuotedShortfall":{"properties":{"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"slots":{"type":"integer","title":"Slots"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["starts_at","ends_at","slots","reason"],"title":"QuotedShortfall","description":"A stretch of the requested window that cannot give what was asked.\n\n\"Fewer slots than you wanted\" and \"nothing at all here\" are different\nproblems with different answers, so each stretch says which it is and\nexactly when it runs -- a basket that only says \"partly unavailable\" leaves\nthe buyer guessing which day to change."},"RefundRow":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","title":"Created At"},"venue_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Name"},"device_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Code"},"advertiser_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advertiser Email"},"merchant_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Email"},"amount_cents":{"type":"integer","title":"Amount Cents"},"kind":{"type":"string","title":"Kind"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"stripe_refund_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Refund Id"},"payments_enabled":{"type":"boolean","title":"Payments Enabled","default":false},"status":{"type":"string","title":"Status","default":"pending"}},"type":"object","required":["id","created_at","amount_cents","kind"],"title":"RefundRow"},"RejectRequest":{"properties":{"reason":{"type":"string","title":"Reason"}},"type":"object","required":["reason"],"title":"RejectRequest"},"SignupMerchantRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","required":["email","password"],"title":"SignupMerchantRequest"},"SlideOut":{"properties":{"id":{"type":"string","title":"Id"},"device_id":{"type":"string","title":"Device Id"},"device_code":{"type":"string","title":"Device Code"},"venue_name":{"type":"string","title":"Venue Name"},"title":{"type":"string","title":"Title"},"position":{"type":"integer","title":"Position"},"status":{"type":"string","title":"Status"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At"},"daily_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daily From"},"daily_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daily To"},"media_kind":{"type":"string","title":"Media Kind"},"media_status":{"type":"string","title":"Media Status"},"media_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Error"},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url"},"on_air":{"type":"boolean","title":"On Air"},"position_in_loop":{"type":"boolean","title":"Position In Loop","default":true},"plays":{"type":"integer","title":"Plays"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","device_id","device_code","venue_name","title","position","status","starts_at","ends_at","daily_from","daily_to","media_kind","media_status","media_error","preview_url","on_air","plays","created_at","updated_at"],"title":"SlideOut"},"SlidePatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Title"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"daily_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daily From"},"daily_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Daily To"},"clear_starts_at":{"type":"boolean","title":"Clear Starts At","default":false},"clear_ends_at":{"type":"boolean","title":"Clear Ends At","default":false},"clear_daily":{"type":"boolean","title":"Clear Daily","default":false}},"type":"object","title":"SlidePatch"},"SlotChangeRequest":{"properties":{"sold":{"type":"integer","title":"Sold"},"merchant":{"type":"integer","title":"Merchant"},"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","required":["sold","merchant"],"title":"SlotChangeRequest","description":"How the merchant wants the loop shared (services/slot_config.py)."},"StripeOnboardingLinkResponse":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"StripeOnboardingLinkResponse"},"TokenOut":{"properties":{"access_token":{"type":"string","title":"Access Token"},"role":{"type":"string","title":"Role"}},"type":"object","required":["access_token","role"],"title":"TokenOut"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"role":{"type":"string","title":"Role"}},"type":"object","required":["access_token","role"],"title":"TokenResponse"},"TopupRequest":{"properties":{"amount_cents":{"type":"integer","maximum":500000.0,"minimum":2000.0,"title":"Amount Cents"}},"type":"object","required":["amount_cents"],"title":"TopupRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VenueOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"address":{"type":"string","title":"Address"},"category":{"type":"string","title":"Category"},"footfall_daily_estimate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Footfall Daily Estimate"}},"type":"object","required":["id","name","address","category"],"title":"VenueOut"},"VenueStatsResponse":{"properties":{"plays_count":{"type":"integer","title":"Plays Count"},"revenue_cents":{"type":"integer","title":"Revenue Cents"},"merchant_share_cents":{"type":"integer","title":"Merchant Share Cents"}},"type":"object","required":["plays_count","revenue_cents","merchant_share_cents"],"title":"VenueStatsResponse"},"VenueUpdateRequest":{"properties":{"opening_hours":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Opening Hours"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"footfall_daily_estimate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Footfall Daily Estimate"},"peak_hours_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Peak Hours Note"},"confirm_revenue_loss":{"type":"boolean","title":"Confirm Revenue Loss","default":false}},"type":"object","title":"VenueUpdateRequest"},"app__routers__account__CampaignOut":{"properties":{"venue_name":{"type":"string","title":"Venue Name"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"slots":{"type":"integer","title":"Slots"},"amount_cents":{"type":"integer","title":"Amount Cents"},"vat_cents":{"type":"integer","title":"Vat Cents"},"status":{"type":"string","title":"Status"},"reject_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reject Reason"},"tracking_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracking Url"},"bought_by_agent":{"type":"boolean","title":"Bought By Agent","default":false}},"type":"object","required":["venue_name","starts_at","ends_at","slots","amount_cents","vat_cents","status"],"title":"CampaignOut"},"app__schemas__campaign__CampaignOut":{"properties":{"id":{"type":"string","title":"Id"},"device_id":{"type":"string","title":"Device Id"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"amount_cents":{"type":"integer","title":"Amount Cents"},"status":{"type":"string","title":"Status"},"reject_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reject Reason"}},"type":"object","required":["id","device_id","starts_at","ends_at","amount_cents","status"],"title":"CampaignOut"}}}}