{"openapi":"3.1.0","info":{"title":"Perfect World Hub API","version":"0.1.0"},"paths":{"/api/auth/config":{"get":{"tags":["auth"],"summary":"Auth Config","operationId":"auth_config_api_auth_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthConfig"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/UserOut"},{"type":"null"}],"title":"Response Me Api Auth Me Get"}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__RegisterIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Sign in. Returns the member — UNLESS a second factor is enrolled, in\nwhich case it returns `{\"mfa_required\": true}` and the caller must POST the\ncode to /api/auth/2fa/verify.\n\nThe password alone buys a session marked `pending_mfa`, which\n`security.current_user` refuses to treat as a login. So the half-finished\nstate is not \"a session with a flag the endpoints must remember to check\" —\nit is not a session at all as far as the rest of the codebase is concerned.","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_auth_logout_post","responses":{"204":{"description":"Successful Response"}}}},"/api/auth/verify":{"get":{"tags":["auth"],"summary":"Verify","description":"Spend a proof token and put the member somewhere that says so.\n\nA GET that redirects, because this is opened from a mail client -- often on\na different device, always without our cookie. Nothing here reads the\nsession to decide WHO is proven; the token names the member. The session is\nconsulted only to answer kindly when the token is already spent.","operationId":"verify_api_auth_verify_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify/resend":{"post":{"tags":["auth"],"summary":"Verify Resend","description":"Send the confirmation email, because the member asked for it.\n\nThe ONLY thing on this platform that mails an unprompted-looking demand, and\nit is not unprompted: it takes a press. Reports the reason it did not send\nrather than a bare false, because \"we already sent one two minutes ago\" and\n\"this server has no mail configured\" need different sentences on the page --\nand the second one is a fault of ours that a member must not be left\ninterpreting as their own.","operationId":"verify_resend_api_auth_verify_resend_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Verify Resend Api Auth Verify Resend Post"}}}}}}},"/api/auth/forgot":{"post":{"tags":["auth"],"summary":"Forgot","description":"Ask for a reset link. Always answers the same way.\n\nDeliberately says nothing about whether the address exists, whether it has a\npassword, whether it is suspended, or whether one was already sent a minute\nago — every one of those is a fact about somebody else's account, handed to\nanybody who can type. The real outcome goes to the log, where the station\ncan see it and a stranger cannot.\n\nNot gated on the account having a password: a Google-only member asking for\none is adding a way in, which password_reset's docstring covers.","operationId":"forgot_api_auth_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Forgot Api Auth Forgot Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/reset":{"post":{"tags":["auth"],"summary":"Reset","description":"Spend a reset token and set the password.\n\nDoes NOT sign the member in. That is not an omission — see password_reset's\ndocstring: `login` is where `totp_enabled` is checked, so handing out a\nsession here would let anybody holding the mailbox walk past an enrolled\nauthenticator. The member sets a password and then signs in like anybody\nelse, second factor and all.","operationId":"reset_api_auth_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Reset Api Auth Reset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/start":{"get":{"tags":["auth"],"summary":"Google Start","operationId":"google_start_api_auth_google_start_get","parameters":[{"name":"return_to","in":"query","required":false,"schema":{"type":"string","default":"/","title":"Return To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/callback":{"get":{"tags":["auth"],"summary":"Google Callback","operationId":"google_callback_api_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/2fa/status":{"get":{"tags":["auth"],"summary":"Status","description":"Where this account stands. Also answers for a half-finished login, so the\nsign-in screen can tell 'needs a code' from 'not signed in'.","operationId":"status_api_auth_2fa_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/2fa/setup":{"post":{"tags":["auth"],"summary":"Setup","description":"Issue a secret and the QR code for it. Nothing is enabled by this call.","operationId":"setup_api_auth_2fa_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/2fa/enable":{"post":{"tags":["auth"],"summary":"Enable","description":"Prove the secret with a live code, then switch it on.\n\nReturns the recovery codes — the ONLY time they are ever shown. They are\nstored as hashes, so a member who loses this list regenerates it rather than\nrecovering it, and a database leak yields nothing usable.","operationId":"enable_api_auth_2fa_enable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/2fa/disable":{"post":{"tags":["auth"],"summary":"Disable","description":"Turn the second factor off. Costs a password and a live code.","operationId":"disable_api_auth_2fa_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisableIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/2fa/recovery":{"post":{"tags":["auth"],"summary":"Regenerate Recovery","description":"Issue a fresh set of recovery codes, invalidating every old one.","operationId":"regenerate_recovery_api_auth_2fa_recovery_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/2fa/verify":{"post":{"tags":["auth"],"summary":"Verify","description":"Finish a pending login, or step up the session already signed in.","operationId":"verify_api_auth_2fa_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/town-square/boards":{"get":{"tags":["town-square"],"summary":"List Boards","operationId":"list_boards_api_markets__slug__town_square_boards_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BoardWithCount"},"title":"Response List Boards Api Markets  Slug  Town Square Boards Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["town-square"],"summary":"Create Board","operationId":"create_board_api_markets__slug__town_square_boards_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/town-square/boards/{board_slug}":{"patch":{"tags":["town-square"],"summary":"Edit Board","description":"Admin: rename a board / change its description or emoji. Slug is left\nunchanged so existing links keep working.","operationId":"edit_board_api_markets__slug__town_square_boards__board_slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"board_slug","in":"path","required":true,"schema":{"type":"string","title":"Board Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["town-square"],"summary":"Delete Board","operationId":"delete_board_api_markets__slug__town_square_boards__board_slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"board_slug","in":"path","required":true,"schema":{"type":"string","title":"Board Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["town-square"],"summary":"Board Page","description":"One board, one page of it.\n\nMembers the READER has silenced drop out. The clause is built ONCE and\napplied to the count and to the page on adjacent lines, which is the whole\ntrick: filter the rows without also fixing `total` and every silenced\nauthor gives the reader a short page and a total that lies — an off-by-one\nthey find long before a reviewer does.\n\nAnonymous-safe: an empty Screen returns `true()` and this is the query it\nalways was.","operationId":"board_page_api_markets__slug__town_square_boards__board_slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"board_slug","in":"path","required":true,"schema":{"type":"string","title":"Board Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/town-square/boards/{board_slug}/posts":{"post":{"tags":["town-square"],"summary":"Create Post","operationId":"create_post_api_markets__slug__town_square_boards__board_slug__posts_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"board_slug","in":"path","required":true,"schema":{"type":"string","title":"Board Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__PostDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/town-square/posts/{post_id}":{"get":{"tags":["town-square"],"summary":"Post Thread","description":"One post and its comments.\n\nA post by somebody the reader silenced is 404, not 403 — a 403 confirms\nthat the thing they guessed at exists, which for a permalink is the fact\nbeing withheld. Comments by silenced members are dropped from the thread.\n\n`comments` on the returned thread is the FULL count and deliberately does\nnot shrink to match. It comes from `_counts_for`, which every board row\nalso uses, and making it reader-aware means correlated subqueries on the\nhottest read path on the platform. The honest failure mode is a row that\nsays four and opens to three — a number one too high, never a leak.","operationId":"post_thread_api_town_square_posts__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostThread"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["town-square"],"summary":"Edit Post","description":"Edit a post's title/body. Allowed for the author or an admin.","operationId":"edit_post_api_town_square_posts__post_id__patch","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__PostEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["town-square"],"summary":"Delete Post","operationId":"delete_post_api_town_square_posts__post_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/town-square/posts/{post_id}/moderate":{"patch":{"tags":["town-square"],"summary":"Moderate Post","description":"Admin: pin/unpin or lock/unlock a post.","operationId":"moderate_post_api_town_square_posts__post_id__moderate_patch","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostModerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostFlags"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/town-square/posts/{post_id}/comments":{"post":{"tags":["town-square"],"summary":"Add Comment","operationId":"add_comment_api_town_square_posts__post_id__comments_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__CommentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/town-square/comments/{comment_id}":{"patch":{"tags":["town-square"],"summary":"Edit Comment","description":"Edit a comment. Allowed for the author or an admin.","operationId":"edit_comment_api_town_square_comments__comment_id__patch","parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["town-square"],"summary":"Delete Comment","operationId":"delete_comment_api_town_square_comments__comment_id__delete","parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/town-square/posts/{post_id}/like":{"get":{"tags":["town-square"],"summary":"Like State","operationId":"like_state_api_town_square_posts__post_id__like_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LikeState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["town-square"],"summary":"Toggle Like","operationId":"toggle_like_api_town_square_posts__post_id__like_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LikeState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users":{"get":{"tags":["admin"],"summary":"List Users","operationId":"list_users_api_admin_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AdminUserOut"},"type":"array","title":"Response List Users Api Admin Users Get"}}}}}}},"/api/admin/users/{user_id}":{"patch":{"tags":["admin"],"summary":"Update User","operationId":"update_user_api_admin_users__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/nearest":{"get":{"tags":["geo"],"summary":"Nearest Market","description":"Return the market whose centroid is closest to (lat, lng).\n\nFalls back to the lowest-id market when no market has coordinates yet, so\nthe caller always gets a usable market to open.","operationId":"nearest_market_api_markets_nearest_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"}},{"name":"lng","in":"query","required":true,"schema":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/summary":{"get":{"tags":["flock"],"summary":"Flock Summary","operationId":"flock_summary_api_flock_summary_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlockSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/agencies":{"get":{"tags":["flock"],"summary":"List Flock Agencies","operationId":"list_flock_agencies_api_flock_agencies_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search agency/city/county name","title":"Q"},"description":"Search agency/city/county name"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(search_count|total_cameras|hotlist_hits|name)$","default":"search_count","title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgencySummary"},"title":"Response List Flock Agencies Api Flock Agencies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/agencies/{slug}":{"get":{"tags":["flock"],"summary":"Get Flock Agency","operationId":"get_flock_agency_api_flock_agencies__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgencyDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/cameras":{"get":{"tags":["flock"],"summary":"List Cameras","description":"ALPR camera locations, optionally clipped to a bounding box. Attribution\n(© OpenStreetMap contributors) must be shown wherever these render.","operationId":"list_cameras_api_flock_cameras_get","parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a box: 'south,west,north,east'","title":"Bbox"},"description":"Filter to a box: 'south,west,north,east'"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":1,"default":5000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CameraOut"},"title":"Response List Cameras Api Flock Cameras Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/cameras/near":{"get":{"tags":["flock"],"summary":"Cameras Near","description":"ALPR cameras within radius_km of a point, nearest first — the 'cameras\nnear you' view. Pre-filters by a lat/lng box (cheap, index-friendly) then\nrefines with haversine so the radius is a true circle.","operationId":"cameras_near_api_flock_cameras_near_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"}},{"name":"lng","in":"query","required":true,"schema":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":200.0,"exclusiveMinimum":0.0,"default":8.0,"title":"Radius Km"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CameraOut"},"title":"Response Cameras Near Api Flock Cameras Near Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/procurement/summary":{"get":{"tags":["flock"],"summary":"Procurement Summary","description":"Statewide rollup of the procurement record.","operationId":"procurement_summary_api_flock_procurement_summary_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":4,"default":"nm","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/procurement/jurisdictions":{"get":{"tags":["flock"],"summary":"Procurement Jurisdictions","description":"The coverage table: every jurisdiction and what we hold for it.","operationId":"procurement_jurisdictions_api_flock_procurement_jurisdictions_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":4,"default":"nm","title":"State"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Q"}},{"name":"with_contracts","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"With Contracts"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/JurisdictionSummary"},"title":"Response Procurement Jurisdictions Api Flock Procurement Jurisdictions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/procurement/findings":{"get":{"tags":["flock"],"summary":"Procurement Findings","description":"Promoted findings across the state — the pattern view.\n\nThere is no status parameter. Candidates are not reachable from here.","operationId":"procurement_findings_api_flock_procurement_findings_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":4,"default":"nm","title":"State"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_flock__FindingOut"},"title":"Response Procurement Findings Api Flock Procurement Findings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/media":{"get":{"tags":["flock"],"summary":"List Media","description":"The catalogue of films about these products.","operationId":"list_media_api_flock_media_get","parameters":[{"name":"vendor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Vendor"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_flock__MediaOut"},"title":"Response List Media Api Flock Media Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/media/caveat":{"get":{"tags":["flock"],"summary":"Media Caveat","operationId":"media_caveat_api_flock_media_caveat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/flock/procurement/states":{"get":{"tags":["flock"],"summary":"Procurement States","description":"Every state we hold a procurement record for, with its coverage.\n\nOrdered by how much of the record we actually have rather than\nalphabetically, so the national page opens on the states where the work\nhas been done instead of on Alabama.","operationId":"procurement_states_api_flock_procurement_states_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ProcurementStateRollup"},"type":"array","title":"Response Procurement States Api Flock Procurement States Get"}}}}}}},"/api/flock/procurement/{slug}/compare":{"get":{"tags":["flock"],"summary":"Procurement Compare","description":"Contract against staff report against enactment, term by term.\n\nThe working view. Everything else in this module archives documents; this\nis the one that answers the question the archive exists for.\n\nExtraction happens here rather than being read off the stored columns so\nthe quote and page for every cell come back with it - a table of numbers\nwith no passages behind them is not checkable, and this table's whole\nvalue is that a reader can check it.","operationId":"procurement_compare_api_flock_procurement__slug__compare_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ComparisonOut"},"title":"Response Procurement Compare Api Flock Procurement  Slug  Compare Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/procurement/{slug}":{"get":{"tags":["flock"],"summary":"Procurement Detail","description":"One jurisdiction: its contract timeline, its findings, and its gaps.","operationId":"procurement_detail_api_flock_procurement__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JurisdictionDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/evidence/meta":{"get":{"tags":["flock"],"summary":"Corpus Meta","description":"Corpus-level counts and the caveats that govern how it may be rendered.","operationId":"corpus_meta_api_flock_evidence_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorpusMeta"}}}}}}},"/api/flock/evidence/sources":{"get":{"tags":["flock"],"summary":"List Sources","operationId":"list_sources_api_flock_evidence_sources_get","parameters":[{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"primary | secondary | vendor-claim","title":"Tier"},"description":"primary | secondary | vendor-claim"},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}},{"name":"jurisdiction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jurisdiction"}},{"name":"unread","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true = only sources nobody has read","title":"Unread"},"description":"true = only sources nobody has read"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_flock_dossier__SourceOut"},"title":"Response List Sources Api Flock Evidence Sources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/evidence/claims":{"get":{"tags":["flock"],"summary":"List Claims","operationId":"list_claims_api_flock_evidence_claims_get","parameters":[{"name":"strength","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"strong | contested | reported-once","title":"Strength"},"description":"strong | contested | reported-once"},{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"claims resting on this source","title":"Source Id"},"description":"claims resting on this source"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_flock_dossier__ClaimOut"},"title":"Response List Claims Api Flock Evidence Claims Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/evidence/claims/{claim_id}":{"get":{"tags":["flock"],"summary":"Get Claim","description":"One claim with its sources resolved.\n\nA contested claim without its counterpoint is a half-quote, so this refuses\nto serve one rather than let a renderer drop it.","operationId":"get_claim_api_flock_evidence_claims__claim_id__get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Claim Api Flock Evidence Claims  Claim Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flock/evidence/sources/{source_id}":{"get":{"tags":["flock"],"summary":"Get Source","description":"One source with the claims that rest on it.","operationId":"get_source_api_flock_evidence_sources__source_id__get","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Source Api Flock Evidence Sources  Source Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/candidates":{"get":{"tags":["alpr-admin"],"summary":"List Candidates","description":"The queue. Defaults to unreviewed candidates.","operationId":"list_candidates_api_admin_alpr_candidates_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"candidate","title":"Status"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":4},{"type":"null"}],"title":"State"}},{"name":"jurisdiction","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Jurisdiction"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CandidateOut"},"title":"Response List Candidates Api Admin Alpr Candidates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/candidates/count":{"get":{"tags":["alpr-admin"],"summary":"Candidate Counts","operationId":"candidate_counts_api_admin_alpr_candidates_count_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":4,"default":"nm","title":"State"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/candidates/{candidate_id}":{"post":{"tags":["alpr-admin"],"summary":"Review Candidate","description":"Promote, reject, or send a candidate back to the queue.\n\nPromotion requires a claim the reviewer wrote. The machine's own note is\nnever promoted into the published sentence: it is a description of which\nregex fired, and it has not read the documents the way a person has.","operationId":"review_candidate_api_admin_alpr_candidates__candidate_id__post","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"integer","title":"Candidate Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_alpr_admin__ReviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/contracts/{contract_id}":{"post":{"tags":["alpr-admin"],"summary":"Correct Contract","description":"Fix a field the extractor read wrong, and mark the row human-checked.","operationId":"correct_contract_api_admin_alpr_contracts__contract_id__post","parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"integer","title":"Contract Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/jurisdictions":{"post":{"tags":["alpr-admin"],"summary":"Upsert Jurisdiction","description":"Create or update one jurisdiction. Idempotent on slug.","operationId":"upsert_jurisdiction_api_admin_alpr_jurisdictions_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JurisdictionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/documents":{"post":{"tags":["alpr-admin"],"summary":"Ingest Document","description":"Read an archived document and file it as a contract or a staff report.\n\nThe two roles are extracted by the same rules but in separate passes, and\nneither is given the other's values. That independence is what makes the\ncomparison downstream capable of disagreeing.","operationId":"ingest_document_api_admin_alpr_documents_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentIngestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/analyze/{jurisdiction}":{"post":{"tags":["alpr-admin"],"summary":"Analyze Jurisdiction","description":"Pair each staff report with its contract and run the detectors.\n\nEverything produced here is a CANDIDATE. Nothing this endpoint writes is\npublicly readable, and nothing it writes is a finding until a person\npromotes it.","operationId":"analyze_jurisdiction_api_admin_alpr_analyze__jurisdiction__post","parameters":[{"name":"jurisdiction","in":"path","required":true,"schema":{"type":"string","title":"Jurisdiction"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/transcripts":{"post":{"tags":["alpr-admin"],"summary":"Ingest Transcript","description":"Record where ALPR was discussed in a meeting, and what was raised.\n\nTopics only. See alpr_transcript for why a number from automatic captions\nnever becomes a claim here.","operationId":"ingest_transcript_api_admin_alpr_transcripts_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptIngestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/enactments":{"post":{"tags":["alpr-admin"],"summary":"Ingest Enactment","description":"File what the governing body actually passed.\n\nExtracted independently of the contract and the staff report, for the same\nreason those two are: a comparison in which one side was filled in from\nanother can only agree with itself.","operationId":"ingest_enactment_api_admin_alpr_enactments_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnactmentIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/comments":{"post":{"tags":["alpr-admin"],"summary":"Ingest Comments","description":"Read an archived minutes document for named comment on ALPR.\n\nMinutes rather than captions, because minutes name people. Everything\nstored is what the minutes printed; nothing is inferred about who a\nspeaker is.","operationId":"ingest_comments_api_admin_alpr_comments_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentsIngestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/emails":{"post":{"tags":["alpr-admin"],"summary":"Ingest Email","description":"Record one disclosed email that mentions ALPR. Idempotent on source_ref.","operationId":"ingest_email_api_admin_alpr_emails_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["alpr-admin"],"summary":"List Emails Admin","description":"Every disclosed email, for review.","operationId":"list_emails_admin_api_admin_alpr_emails_get","parameters":[{"name":"jurisdiction","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Jurisdiction"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Kind"}},{"name":"include_withheld","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Withheld"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmailAdminOut"},"title":"Response List Emails Admin Api Admin Alpr Emails Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/emails/{email_id}":{"post":{"tags":["alpr-admin"],"summary":"Patch Email","description":"Reclassify an email, or withhold it from public view.\n\nWithholding is the reversible act and should be the first reach: the row\nand its reason survive, so what a disclosure returned is still countable\neven when a record is not shown.","operationId":"patch_email_api_admin_alpr_emails__email_id__post","parameters":[{"name":"email_id","in":"path","required":true,"schema":{"type":"integer","title":"Email Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailAdminOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["alpr-admin"],"summary":"Delete Email","description":"Destroy one email row. Irreversible.\n\nWithholding covers almost every case and keeps the record countable, so\nthis exists for the ones it does not: a row that should never have been\ningested at all, most often a private individual whose correspondence\nappeared in a disclosure without their having any part in the decision\nbeing examined.\n\n`confirm` must repeat the id, and `reason` is required and logged, because\nthe one thing that must not happen here is a deletion nobody meant.","operationId":"delete_email_api_admin_alpr_emails__email_id__delete","parameters":[{"name":"email_id","in":"path","required":true,"schema":{"type":"integer","title":"Email Id"}},{"name":"reason","in":"query","required":true,"schema":{"type":"string","minLength":8,"maxLength":300,"description":"Why this row is being destroyed","title":"Reason"},"description":"Why this row is being destroyed"},{"name":"reviewer","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"title":"Reviewer"}},{"name":"confirm","in":"query","required":true,"schema":{"type":"string","description":"Must equal the email id","title":"Confirm"},"description":"Must equal the email id"},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/disclosures":{"post":{"tags":["alpr-admin"],"summary":"Ingest Disclosure","description":"Record what a records disclosure covered.\n\nWithout this an empty email section cannot be read: a reader cannot tell\nwhether nobody wrote about the cameras or nobody asked for the mailbox\nthat would show it.","operationId":"ingest_disclosure_api_admin_alpr_disclosures_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisclosureIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/media":{"post":{"tags":["alpr-admin"],"summary":"Upsert Media","description":"Catalogue a film about a product. Idempotent on the URL.\n\nA vendor must be one we already track, so the catalogue cannot drift away\nfrom the systems the procurement record actually names.","operationId":"upsert_media_api_admin_alpr_media_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/site-hardware":{"post":{"tags":["alpr-admin"],"summary":"Upsert Site Hardware","description":"Record a device on a pole. Idempotent on (jurisdiction, location, function, model).\n\nThe vendor is resolved against the registry so a pole joins the rest of the\nstack, but a manufacturer the registry does not know is still recorded -\nan unrecognised device on a pole is a fact, and dropping it would make the\ninventory look tidier than the record is.","operationId":"upsert_site_hardware_api_admin_alpr_site_hardware_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteHardwareIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/alpr/gaps":{"post":{"tags":["alpr-admin"],"summary":"Record Gap","description":"Record that a record was not found on a portal. Idempotent.","operationId":"record_gap_api_admin_alpr_gaps_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GapIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/yellow-pages":{"get":{"tags":["yellow-pages"],"summary":"Directory Page","description":"The whole phone book for a market: mesh status, the section index (with\ncounts), and the listings for the active section (featured pulled out on\ntop). No `section` picks the first one by sort order. `group` scopes the\nsection index to Yellow Pages (business) or White Pages (personal+civic)\n— see GROUP_KINDS.","operationId":"directory_page_api_markets__slug__yellow_pages_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"section","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Section slug; defaults to the first section","title":"Section"},"description":"Section slug; defaults to the first section"},{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'business' (Yellow Pages) or 'personal' (White Pages); omit for all","title":"Group"},"description":"'business' (Yellow Pages) or 'personal' (White Pages); omit for all"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectoryPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/yellow-pages/status":{"get":{"tags":["yellow-pages"],"summary":"Mesh Status","operationId":"mesh_status_api_markets__slug__yellow_pages_status_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeshStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/yellow-pages/sections":{"get":{"tags":["yellow-pages"],"summary":"List Sections","operationId":"list_sections_api_markets__slug__yellow_pages_sections_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'business' or 'personal'; omit for all","title":"Group"},"description":"'business' or 'personal'; omit for all"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SectionWithCount"},"title":"Response List Sections Api Markets  Slug  Yellow Pages Sections Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["yellow-pages"],"summary":"Create Section","description":"Admin: add a phone-book section (tab).","operationId":"create_section_api_markets__slug__yellow_pages_sections_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__SectionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/yellow-pages/listings/{listing_id}":{"get":{"tags":["yellow-pages"],"summary":"Get Listing","description":"One listing, for a business's own portal page — `directory_page` only\never returns the *active section's* rows, not a single listing by id.","operationId":"get_listing_api_markets__slug__yellow_pages_listings__listing_id__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["yellow-pages"],"summary":"Edit Listing","description":"Edit a listing. Allowed for the member who claimed it, or an admin.","operationId":"edit_listing_api_markets__slug__yellow_pages_listings__listing_id__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["yellow-pages"],"summary":"Delete Listing","operationId":"delete_listing_api_markets__slug__yellow_pages_listings__listing_id__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/yellow-pages/listings":{"post":{"tags":["yellow-pages"],"summary":"Create Listing","description":"A member lists (claims) an entry in the directory. Non-admins can't\nself-feature; a new listing is published immediately.","operationId":"create_listing_api_markets__slug__yellow_pages_listings_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/yellow-pages/listings/{listing_id}/moderate":{"patch":{"tags":["yellow-pages"],"summary":"Moderate Listing","description":"Admin: feature/unfeature or publish/unpublish a listing.","operationId":"moderate_listing_api_markets__slug__yellow_pages_listings__listing_id__moderate_patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingModerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/yellow-pages/listings/{listing_id}/message":{"post":{"tags":["yellow-pages"],"summary":"Message Over Mesh","description":"'Let your fingers do the walking' — queue a text to a listing's node for\ntransmission over LoRa. The bridge worker drains the outbox via MQTT; while\nno gateway is online the message stays 'queued' and we say so plainly.","operationId":"message_over_mesh_api_markets__slug__yellow_pages_listings__listing_id__message_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeshMessageCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeshMessageResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/yellow-pages/listings/{listing_id}/claim":{"post":{"tags":["yellow-pages"],"summary":"Claim Listing","description":"Claim an auto-discovered / unclaimed listing (e.g. a node stub imported from\nthe public mesh). Only an unclaimed listing can be claimed; once claimed the\nmember owns it and can edit or delete it like any listing they created.","operationId":"claim_listing_api_markets__slug__yellow_pages_listings__listing_id__claim_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/listings/{listing_id}":{"get":{"tags":["yellow-pages"],"summary":"Get Listing Global","operationId":"get_listing_global_api_yellow_pages_listings__listing_id__get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/resolve-domain":{"get":{"tags":["yellow-pages"],"summary":"Resolve Domain","description":"Host header -> listing id, for web/middleware.ts's custom-domain\nrewrite. Deliberately a normal DB-backed read (unlike tls_ask): this is\ncalled once per request to an unrecognized host, not on the hot path\nevery certificate issuance depends on, so it carries none of tls_ask's\nperformance constraint.","operationId":"resolve_domain_api_yellow_pages_resolve_domain_get","parameters":[{"name":"host","in":"query","required":true,"schema":{"type":"string","title":"Host"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/{listing_id}/products":{"get":{"tags":["yellow-pages"],"summary":"Get Catalog","operationId":"get_catalog_api_yellow_pages__listing_id__products_get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["yellow-pages"],"summary":"Create Product","operationId":"create_product_api_yellow_pages__listing_id__products_post","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/{listing_id}/products/{product_id}":{"patch":{"tags":["yellow-pages"],"summary":"Edit Product","operationId":"edit_product_api_yellow_pages__listing_id__products__product_id__patch","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["yellow-pages"],"summary":"Delete Product","operationId":"delete_product_api_yellow_pages__listing_id__products__product_id__delete","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/{listing_id}/products/{product_id}/photo":{"post":{"tags":["yellow-pages"],"summary":"Upload Product Photo","description":"Replace a product's photo. One per product, on purpose — see the\nmodule docstring. The old derivatives are only removed after the new\nones render clean, so a bad upload never leaves a product photo-less.","operationId":"upload_product_photo_api_yellow_pages__listing_id__products__product_id__photo_post","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_product_photo_api_yellow_pages__listing_id__products__product_id__photo_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/products/{storage_key}/{variant}":{"get":{"tags":["yellow-pages"],"summary":"Product Photo","description":"Served by this API rather than rooted in the Caddyfile, exactly like\nHoodRide's photos — so an unpublished product, or its unpublished\nlisting, takes its photo dark with it. A static file_server can't do\nthat check; this endpoint does.","operationId":"product_photo_api_yellow_pages_products__storage_key___variant__get","parameters":[{"name":"storage_key","in":"path","required":true,"schema":{"type":"string","title":"Storage Key"}},{"name":"variant","in":"path","required":true,"schema":{"type":"string","title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/{listing_id}/portfolio":{"get":{"tags":["yellow-pages"],"summary":"Get Portfolio","operationId":"get_portfolio_api_yellow_pages__listing_id__portfolio_get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectOut"},"title":"Response Get Portfolio Api Yellow Pages  Listing Id  Portfolio Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["yellow-pages"],"summary":"Create Project","operationId":"create_project_api_yellow_pages__listing_id__portfolio_post","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/{listing_id}/portfolio/{project_id}":{"patch":{"tags":["yellow-pages"],"summary":"Edit Project","operationId":"edit_project_api_yellow_pages__listing_id__portfolio__project_id__patch","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["yellow-pages"],"summary":"Delete Project","operationId":"delete_project_api_yellow_pages__listing_id__portfolio__project_id__delete","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/{listing_id}/portfolio/{project_id}/photos":{"post":{"tags":["yellow-pages"],"summary":"Add Project Photos","description":"Add one or more photos to a project — a real portfolio documents a\nproject across several shots, not one cover image. Mirrors HoodRide's\nadd_photos exactly: stage every render before touching the DB, so a bad\nfile in the middle of a batch never leaves a half-written row.","operationId":"add_project_photos_api_yellow_pages__listing_id__portfolio__project_id__photos_post","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_add_project_photos_api_yellow_pages__listing_id__portfolio__project_id__photos_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/{listing_id}/portfolio/{project_id}/photos/{photo_id}":{"patch":{"tags":["yellow-pages"],"summary":"Edit Project Photo","description":"Caption it, or move it. The frontend's only use of sort_order today\nis \"make cover\": PATCH sort_order=-1.\n\nA negative value is that \"make cover\" signal, resolved to strictly\nBELOW the project's current lowest sort_order — not clamped to a flat\n0. Clamping to 0 alone ties with whatever photo is already the cover\n(it's already sitting at 0, that's what makes it the cover), and ties\nbreak on id ascending in the public read's ORDER BY — silently keeping\nthe OLD cover in front instead of promoting this one. A non-negative\nvalue is taken as-is (bounded to the project's photo cap) for direct\npositioning, though nothing in this codebase's own frontend sends one\ntoday.","operationId":"edit_project_photo_api_yellow_pages__listing_id__portfolio__project_id__photos__photo_id__patch","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"photo_id","in":"path","required":true,"schema":{"type":"integer","title":"Photo Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["yellow-pages"],"summary":"Delete Project Photo","operationId":"delete_project_photo_api_yellow_pages__listing_id__portfolio__project_id__photos__photo_id__delete","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"photo_id","in":"path","required":true,"schema":{"type":"integer","title":"Photo Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/portfolio-photos/{storage_key}/{variant}":{"get":{"tags":["yellow-pages"],"summary":"Project Photo","description":"Served by this API rather than rooted in the Caddyfile, exactly like\ncatalog product photos — so an unpublished project, or its unpublished\nlisting, takes its photos dark with it. A static file_server can't do\nthat check; this endpoint does.","operationId":"project_photo_api_yellow_pages_portfolio_photos__storage_key___variant__get","parameters":[{"name":"storage_key","in":"path","required":true,"schema":{"type":"string","title":"Storage Key"}},{"name":"variant","in":"path","required":true,"schema":{"type":"string","title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/{listing_id}/videos":{"get":{"tags":["yellow-pages"],"summary":"Get Videos","operationId":"get_videos_api_yellow_pages__listing_id__videos_get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VideoOut"},"title":"Response Get Videos Api Yellow Pages  Listing Id  Videos Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["yellow-pages"],"summary":"Create Video","operationId":"create_video_api_yellow_pages__listing_id__videos_post","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/yellow-pages/{listing_id}/videos/{video_id}":{"patch":{"tags":["yellow-pages"],"summary":"Edit Video","operationId":"edit_video_api_yellow_pages__listing_id__videos__video_id__patch","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["yellow-pages"],"summary":"Delete Video","operationId":"delete_video_api_yellow_pages__listing_id__videos__video_id__delete","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"integer","title":"Listing Id"}},{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/signals/live":{"get":{"tags":["signals"],"summary":"Live","operationId":"live_api_signals_live_get","parameters":[{"name":"band","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(wifi|ble)$"},{"type":"null"}],"title":"Band"}},{"name":"classification","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(unknown|infrastructure|personal|priority)$"},{"type":"null"}],"title":"Classification"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":120,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivePage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/signals/summary":{"get":{"tags":["signals"],"summary":"Summary","operationId":"summary_api_signals_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalsSummary"}}}}}}},"/api/signals/devices/{mac}":{"get":{"tags":["signals"],"summary":"Device Detail","operationId":"device_detail_api_signals_devices__mac__get","parameters":[{"name":"mac","in":"path","required":true,"schema":{"type":"string","title":"Mac"}},{"name":"band","in":"query","required":false,"schema":{"type":"string","pattern":"^(wifi|ble)$","default":"wifi","title":"Band"}}],"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/signals/ingest":{"post":{"tags":["signals"],"summary":"Ingest","operationId":"ingest_api_signals_ingest_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/IngestBatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/xray/analyze":{"post":{"tags":["xray"],"summary":"Analyze","operationId":"analyze_api_xray_analyze_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyze_api_xray_analyze_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/xray/recon":{"post":{"tags":["xray"],"summary":"Recon","operationId":"recon_api_xray_recon_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/foreign-exchange/formats":{"get":{"tags":["foreign-exchange"],"summary":"Formats","operationId":"formats_api_foreign_exchange_formats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormatsResponse"}}}}}}},"/api/foreign-exchange/inspect":{"post":{"tags":["foreign-exchange"],"summary":"Inspect","operationId":"inspect_api_foreign_exchange_inspect_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_inspect_api_foreign_exchange_inspect_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InspectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/":{"get":{"tags":["transcripts"],"summary":"List Transcripts","operationId":"list_transcripts_api_transcripts__get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search title, channel, transcript, and summary","title":"Q"},"description":"Search title, channel, transcript, and summary"},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Corpus filter, e.g. 'flock'","title":"Topic"},"description":"Corpus filter, e.g. 'flock'"},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact channel name filter","title":"Channel"},"description":"Exact channel name filter"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(views|recent|longest|title)$","default":"views","title":"Sort"}},{"name":"has_summary","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Summary"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":24,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts":{"get":{"tags":["transcripts"],"summary":"List Transcripts","operationId":"list_transcripts_api_transcripts_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search title, channel, transcript, and summary","title":"Q"},"description":"Search title, channel, transcript, and summary"},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Corpus filter, e.g. 'flock'","title":"Topic"},"description":"Corpus filter, e.g. 'flock'"},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact channel name filter","title":"Channel"},"description":"Exact channel name filter"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(views|recent|longest|title)$","default":"views","title":"Sort"}},{"name":"has_summary","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Summary"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":24,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/stats":{"get":{"tags":["transcripts"],"summary":"Transcripts Stats","operationId":"transcripts_stats_api_transcripts_stats_get","parameters":[{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptsStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{video_id}":{"get":{"tags":["transcripts"],"summary":"Get Transcript","operationId":"get_transcript_api_transcripts__video_id__get","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{video_id}/transcript.txt":{"get":{"tags":["transcripts"],"summary":"Get Transcript Text","description":"The raw flattened transcript as plain text — so the corpus stays usable as\ndata (grep, feed to another tool), not just as a web page.","operationId":"get_transcript_text_api_transcripts__video_id__transcript_txt_get","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{video_id}/resummarize":{"post":{"tags":["transcripts"],"summary":"Resummarize","description":"Admin: re-queue one video's summary (the worker regenerates it).","operationId":"resummarize_api_transcripts__video_id__resummarize_post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/summary":{"get":{"tags":["superfund"],"summary":"Superfund Summary","operationId":"superfund_summary_api_superfund_summary_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperfundSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/sites":{"get":{"tags":["superfund"],"summary":"List Sites","operationId":"list_sites_api_superfund_sites_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search site / city / county name","title":"Q"},"description":"Search site / city / county name"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status substring, e.g. 'Deleted'","title":"Status"},"description":"Filter by status substring, e.g. 'Deleted'"},{"name":"industry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact industry sector filter","title":"Industry"},"description":"Exact industry sector filter"},{"name":"subindustry","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact sub-industry filter","title":"Subindustry"},"description":"Exact sub-industry filter"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(name|hrs_score|listing_date|state)$","default":"name","title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"asc","title":"Order"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteSummary"},"title":"Response List Sites Api Superfund Sites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/industries":{"get":{"tags":["superfund"],"summary":"Industries","description":"Two-level industry rollup for the visualizer: each sector with its site\ncount and its sub-industry (\"what type\") breakdown. Classification is the\nheuristic from superfund_industry.py (name-based, not an official EPA field).\nSorted by count desc, with Uncategorized always pushed to the end.","operationId":"industries_api_superfund_industries_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndustryBreakdown"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/sites/{sems_id}":{"get":{"tags":["superfund"],"summary":"Get Site","operationId":"get_site_api_superfund_sites__sems_id__get","parameters":[{"name":"sems_id","in":"path","required":true,"schema":{"type":"integer","title":"Sems Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/timeline":{"get":{"tags":["superfund"],"summary":"Timeline","description":"Per-year NPL activity: how many sites were proposed, listed (established),\nreached construction completion, and were deleted each year — plus the\nrunning net count of sites on the list. This is the 'are we cleaning up\nfaster than we're listing?' story.","operationId":"timeline_api_superfund_timeline_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/YearActivity"},"title":"Response Timeline Api Superfund Timeline Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/pipeline":{"get":{"tags":["superfund"],"summary":"Pipeline","description":"The cleanup funnel — how far sites get along Proposed → Listed →\nConstruction complete → Deleted — plus how long completion takes.","operationId":"pipeline_api_superfund_pipeline_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/contaminants":{"get":{"tags":["superfund"],"summary":"Contaminants","description":"Most common contaminants by the number of sites they appear at\n(state-filterable). Backed by the SEMS contaminant list.","operationId":"contaminants_api_superfund_contaminants_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContaminantSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/map-points":{"get":{"tags":["superfund"],"summary":"Map Points","description":"Slim per-site points (coords + the year each went on/off the NPL) for the\nanimated time-lapse map. Only sites with coordinates are returned.","operationId":"map_points_api_superfund_map_points_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MapPoint"},"title":"Response Map Points Api Superfund Map Points Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/calendar":{"get":{"tags":["superfund"],"summary":"Calendar","description":"Every dated milestone falling in [start, end], joined to its site. This is\nthe query the calendar UI ranges over month by month.","operationId":"calendar_api_superfund_calendar_get","parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Inclusive range start (YYYY-MM-DD)","title":"Start"},"description":"Inclusive range start (YYYY-MM-DD)"},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Inclusive range end (YYYY-MM-DD)","title":"End"},"description":"Inclusive range end (YYYY-MM-DD)"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one event_type","title":"Event Type"},"description":"Filter to one event_type"},{"name":"include_projected","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Projected"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"default":2000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CalendarEvent"},"title":"Response Calendar Api Superfund Calendar Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superfund/calendar/histogram":{"get":{"tags":["superfund"],"summary":"Calendar Histogram","description":"Per-month event counts across the range — powers the calendar's density\nstrip without shipping every event to the browser.","operationId":"calendar_histogram_api_superfund_calendar_histogram_get","parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date","title":"Start"}},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date","title":"End"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}],"title":"State"}},{"name":"include_projected","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Projected"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonthBucket"},"title":"Response Calendar Histogram Api Superfund Calendar Histogram Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/polygraph/check":{"post":{"tags":["polygraph"],"summary":"Live Check","description":"Preliminary AI claim-by-claim analysis of a passage. 503 when no analyst\nkey is configured, so the frontend can show an honest 'offline' state.","operationId":"live_check_api_polygraph_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/polygraph/reports":{"get":{"tags":["polygraph"],"summary":"List Reports","description":"Public: only reports a moderator has published or reviewed. Reporter\nidentity is never included.","operationId":"list_reports_api_polygraph_reports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["polygraph"],"summary":"Create Report","description":"Accept a public/whistleblower report. Lands as 'pending' (unlisted) — a\nmoderator must publish it before it appears anywhere public.","operationId":"create_report_api_polygraph_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/polygraph/admin/reports":{"get":{"tags":["polygraph"],"summary":"Admin List Reports","description":"Admin: the full queue, including reporter identity, filtered by status.","operationId":"admin_list_reports_api_polygraph_admin_reports_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/polygraph/admin/reports/{report_id}/moderate":{"post":{"tags":["polygraph"],"summary":"Moderate Report","description":"Admin: move a report through the moderation ladder.","operationId":"moderate_report_api_polygraph_admin_reports__report_id__moderate_post","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/summary":{"get":{"tags":["police-academy"],"summary":"Summary","operationId":"summary_api_police_academy_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryOut"}}}}}}},"/api/police-academy/classes":{"get":{"tags":["police-academy"],"summary":"List Classes","operationId":"list_classes_api_police_academy_classes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ClassOut"},"type":"array","title":"Response List Classes Api Police Academy Classes Get"}}}}}}},"/api/police-academy/classes/named/{class_id}":{"get":{"tags":["police-academy"],"summary":"Named Class","description":"One agency's own numbered academy class, with the roster it published.\n\nCadet names come from the department's announcement; certification numbers\ncome from the state. Joining them is a guess, so each member carries the\nbasis and confidence of its match — and an unmatched cadet stays unmatched\nrather than being attached to somebody who shares a surname.","operationId":"named_class_api_police_academy_classes_named__class_id__get","parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"integer","title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/classes/{year}":{"get":{"tags":["police-academy"],"summary":"Class Year","description":"The yearbook spread — everyone certified in one year.","operationId":"class_year_api_police_academy_classes__year__get","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"agency","in":"query","required":false,"schema":{"type":"string","description":"filter to one agency slug","default":"","title":"Agency"},"description":"filter to one agency slug"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficerPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/officers":{"get":{"tags":["police-academy"],"summary":"List Officers","operationId":"list_officers_api_police_academy_officers_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"whole-word name search","default":"","title":"Q"},"description":"whole-word name search"},{"name":"agency","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agency"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"two-letter state code","default":"","title":"State"},"description":"two-letter state code"},{"name":"cert","in":"query","required":false,"schema":{"type":"string","description":"exact certification number, across every state","default":"","title":"Cert"},"description":"exact certification number, across every state"},{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"market","in":"query","required":false,"schema":{"type":"string","description":"hub market slug, e.g. las-cruces-nm","default":"","title":"Market"},"description":"hub market slug, e.g. las-cruces-nm"},{"name":"disposition","in":"query","required":false,"schema":{"type":"string","description":"cleared | revoked | suspended | restricted | …","default":"","title":"Disposition"},"description":"cleared | revoked | suspended | restricted | …"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":40,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficerPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/crossings":{"get":{"tags":["police-academy"],"summary":"Crossings","description":"Officers who may have carried a career across a state line.\n\nThis is what the border corridor was gathered for. An officer who separates\nin Las Cruces and is hired in El Paso disappears from a New-Mexico-only\nrecord, and that disappearance is the single most useful thing an\naccountability record can fail to show.\n\nIt is also the claim most likely to be wrong about a specific person, so\nnothing here is asserted. These are candidates, the evidence sits on every\nrow, and the number that matters is how many pairings were REFUTED:\nmeasured 2026-08-30, 924 refuted against 35 proposed.","operationId":"crossings_api_police_academy_crossings_get","parameters":[{"name":"strength","in":"query","required":false,"schema":{"type":"string","description":"strong | possible","default":"","title":"Strength"},"description":"strong | possible"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CrossingOut"},"title":"Response Crossings Api Police Academy Crossings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/brady":{"get":{"tags":["police-academy"],"summary":"Brady","description":"Prosecutors' credibility disclosures — and which offices publish none.\n\nThe second half is the more useful record. A reader asking \"is the officer\nwho arrested me on a Brady list\" deserves to know that in almost every New\nMexico county the prosecutor publishes nothing, so the question has no\npublic answer at all. That is a fact about the office, not the officer.","operationId":"brady_api_police_academy_brady_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BradyCoverage"}}}}}}},"/api/police-academy/pay":{"get":{"tags":["police-academy"],"summary":"Pay","description":"What employers publish about officer pay.\n\nAlmost nothing, and the comparison is the point: the City of Las Cruces\npublishes every Fire Department salary by name and no police salary at all,\nthrough the same tool, with no stated exclusion.","operationId":"pay_api_police_academy_pay_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PayDisclosureOut"},"type":"array","title":"Response Pay Api Police Academy Pay Get"}}}}}}},"/api/police-academy/lawsuits":{"get":{"tags":["police-academy"],"summary":"Lawsuits","description":"Federal lawsuits that name an individual officer.\n\nThe agency-level dockets elsewhere in this module say a department was sued.\nThese say who was named, which is the thing a reader actually arrived to ask.","operationId":"lawsuits_api_police_academy_lawsuits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LitigantOut"},"type":"array","title":"Response Lawsuits Api Police Academy Lawsuits Get"}}}}}}},"/api/police-academy/payouts":{"get":{"tags":["police-academy"],"summary":"Payouts","description":"Money the state paid out on claims against law-enforcement agencies.\n\nDisclosed because NMSA 1978 § 15-7-3(C) requires it of every indemnity\npayment over $1,000 from the Public Liability Fund. Claimant names are in\nthe source and are deliberately not repeated here.","operationId":"payouts_api_police_academy_payouts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutSummary"}}}}}}},"/api/police-academy/internal-affairs/{slug}":{"get":{"tags":["police-academy"],"summary":"Internal Affairs","description":"A department's own Internal Affairs annual reports, as a series.","operationId":"internal_affairs_api_police_academy_internal_affairs__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IaOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/media":{"get":{"tags":["police-academy"],"summary":"Media","description":"Policing-conduct coverage banked as it appeared.","operationId":"media_api_police_academy_media_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_police_academy__MediaOut"}}}}}}},"/api/police-academy/agencies/{slug}/holdings":{"get":{"tags":["police-academy"],"summary":"Agency Holdings","description":"Everything this module holds on one agency, including the gaps.\n\nThe module grew a register at a time and each got its own page, so a reader\nlanding on an agency could not see that we hold thirteen federal suits\nagainst it, or that its prosecutor publishes no credibility list. This is\nthat view — and it reports an EMPTY register as loudly as a full one,\nbecause for most of these an empty count is a fact about a custodian rather\nthan about the agency.","operationId":"agency_holdings_api_police_academy_agencies__slug__holdings_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/freshness":{"get":{"tags":["police-academy"],"summary":"Freshness","description":"When each source was fetched, and what period it actually covers.\n\nThe module carries thirteen sources and they are not equally current. The\nspine — the certification roster — is the oldest thing here by three years,\nwhich matters more than any of the fresh ones because every other register\nhangs off it.","operationId":"freshness_api_police_academy_freshness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FreshnessOut"},"type":"array","title":"Response Freshness Api Police Academy Freshness Get"}}}}}}},"/api/police-academy/coverage":{"get":{"tags":["police-academy"],"summary":"Coverage","description":"What the module can see, state by state.\n\nDeliberately NOT a shaded map. The reasoning is already written down in\nthis codebase, in the Flock module's coverage component: a state shaded\npale because nobody read its records looks identical to one shaded pale\nbecause nothing happened there, and those are opposite facts. Here the\nconsequence would be heavier still — a pale state would read as \"few\nproblems with the police\". So every state gets a NAMED tier on an\nequal-sized tile, and the tiers are ordered by how much of a record we can\nshow rather than by anything a state did.","operationId":"coverage_api_police_academy_coverage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoverageOut"}}}}}}},"/api/police-academy/discipline":{"get":{"tags":["police-academy"],"summary":"Discipline","description":"Another state's decertification register, kept apart from the local one.","operationId":"discipline_api_police_academy_discipline_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"ga | fl","default":"","title":"State"},"description":"ga | fl"},{"name":"adverse_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Adverse Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisciplineRegisterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/officers/{cert}":{"get":{"tags":["police-academy"],"summary":"Officer Detail","operationId":"officer_detail_api_police_academy_officers__cert__get","parameters":[{"name":"cert","in":"path","required":true,"schema":{"type":"string","title":"Cert"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficerDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/agencies":{"get":{"tags":["police-academy"],"summary":"List Agencies","operationId":"list_agencies_api_police_academy_agencies_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","default":"","title":"Market"}},{"name":"min_officers","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":1,"title":"Min Officers"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_police_academy__AgencyOut"},"title":"Response List Agencies Api Police Academy Agencies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/agencies/{slug}":{"get":{"tags":["police-academy"],"summary":"Agency Detail","operationId":"agency_detail_api_police_academy_agencies__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_police_academy__AgencyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/replies":{"post":{"tags":["police-academy"],"summary":"Submit Reply","description":"File a correction or a response to a record on this site.\n\nThe premise of this module is that people accused of things get no\ncounter-voice while their case is open. Practising the opposite is the\npoint, so this endpoint is open to the public and the reply is published\nbeside the record it answers.\n\nIt lands `pending` and is invisible until a moderator acts. Storing a reply\nis not endorsing it, and filing one does not mark the record disputed —\nthat would hand anyone a way to muddy an accurate record on demand.","operationId":"submit_reply_api_police_academy_replies_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Submit Reply Api Police Academy Replies Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["police-academy"],"summary":"Reply Queue","description":"Replies waiting on a human. Admin only.\n\nCarries the submitter's contact, which the public reader never does — a\nmoderator has to be able to reach the person who wrote it.","operationId":"reply_queue_api_police_academy_replies_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"pending | accepted | published | rejected | all","default":"pending","title":"Status"},"description":"pending | accepted | published | rejected | all"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyQueue"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/replies/{reply_id}":{"patch":{"tags":["police-academy"],"summary":"Review Reply","operationId":"review_reply_api_police_academy_replies__reply_id__patch","parameters":[{"name":"reply_id","in":"path","required":true,"schema":{"type":"integer","title":"Reply Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyReview"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Review Reply Api Police Academy Replies  Reply Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/records-asks":{"get":{"tags":["police-academy"],"summary":"List Records Asks","description":"Every request this module depends on, whatever its state.\n\nOrdered so the unresolved ones lead — a reader looking for why a page stops\nat 2021 should not have to scroll past the successes to find out.","operationId":"list_records_asks_api_police_academy_records_asks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RecordsAskOut"},"type":"array","title":"Response List Records Asks Api Police Academy Records Asks Get"}}}}}}},"/api/police-academy/letters/{kind}":{"get":{"tags":["police-academy"],"summary":"Get Letter","description":"Render the IPRA letter for a given request kind.\n\nThe text lives in app.academy_ipra and exists in exactly one copy — a second\none in the frontend would drift from this the first time a citation changed,\nand nothing would compare them.","operationId":"get_letter_api_police_academy_letters__kind__get","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"agency","in":"query","required":false,"schema":{"type":"string","description":"agency slug, for agency-scoped letters","default":"","title":"Agency"},"description":"agency slug, for agency-scoped letters"},{"name":"cert","in":"query","required":false,"schema":{"type":"string","description":"certification number, for an officer file","default":"","title":"Cert"},"description":"certification number, for an officer file"},{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"state code, when a number is held in more than one","default":"","title":"State"},"description":"state code, when a number is held in more than one"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LetterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/recognition":{"get":{"tags":["police-academy"],"summary":"Recognition","operationId":"recognition_api_police_academy_recognition_get","parameters":[{"name":"agency","in":"query","required":false,"schema":{"type":"string","description":"agency slug","default":"","title":"Agency"},"description":"agency slug"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecognitionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/agencies/{slug}/civic-record":{"get":{"tags":["police-academy"],"summary":"Civic Record","description":"Meetings of this agency's own oversight body that name the department.\n\nA mention is a mention. That a council meeting says \"police\" is not a claim\nthat the meeting concerned police conduct, so every row ships the matched\nexcerpt and the surface is labelled as the civic record rather than as a\nfinding.","operationId":"civic_record_api_police_academy_agencies__slug__civic_record_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"topic","in":"query","required":false,"schema":{"type":"string","description":"filter to one oversight subject","default":"","title":"Topic"},"description":"filter to one oversight subject"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CivicRecord"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/agencies/{slug}/press":{"get":{"tags":["police-academy"],"summary":"Agency Press","description":"What the department has announced about itself.\n\nThe least independent of the module's three registers and the most current.\nLabelled as the agency's own account so it is never read as an adjudicated\nfinding, and crime news is excluded at ingest — a release about a suspect is\nnot a record about an officer.","operationId":"agency_press_api_police_academy_agencies__slug__press_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","description":"filter to one release kind","default":"","title":"Kind"},"description":"filter to one release kind"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PressFeed"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/activity":{"get":{"tags":["police-academy"],"summary":"Activity","description":"The most recent entries across all three registers, newest first.","operationId":"activity_api_police_academy_activity_get","parameters":[{"name":"register","in":"query","required":false,"schema":{"type":"string","description":"adjudicated | oversight | department","default":"","title":"Register"},"description":"adjudicated | oversight | department"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityFeed"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/agencies/{slug}/litigation":{"get":{"tags":["police-academy"],"summary":"Agency Litigation","description":"Federal civil-rights suits naming this agency's employer as defendant.\n\nA FILING IS AN ALLEGATION, NOT A FINDING, and the docket never says who won.\nBoth facts are stated on the payload rather than left to the page.","operationId":"agency_litigation_api_police_academy_agencies__slug__litigation_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"basis","in":"query","required":false,"schema":{"type":"string","description":"named | employer","default":"","title":"Basis"},"description":"named | employer"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":150,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LitigationFeed"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/agencies/{slug}/opinions":{"get":{"tags":["police-academy"],"summary":"Agency Opinions","description":"Court opinions naming or discussing this agency.\n\nNO HOLDING IS SUMMARISED. Compressing a court's reasoning into a sentence is\nhow a project starts inventing law; the payload carries the citation and the\nlink, and the reader reads the opinion.","operationId":"agency_opinions_api_police_academy_agencies__slug__opinions_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"posture","in":"query","required":false,"schema":{"type":"string","description":"civil_against | criminal | other","default":"","title":"Posture"},"description":"civil_against | criminal | other"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpinionFeed"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/police-academy/methodology":{"get":{"tags":["police-academy"],"summary":"Methodology","description":"What each register proves, and what it does not.","operationId":"methodology_api_police_academy_methodology_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Methodology"}}}}}}},"/api/markets/{slug}/environment":{"get":{"tags":["environment"],"summary":"Market Environment","operationId":"market_environment_api_markets__slug__environment_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Force a synchronous refetch of all upstreams","default":false,"title":"Refresh"},"description":"Force a synchronous refetch of all upstreams"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvSnapshotOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/headlines":{"get":{"tags":["headlines"],"summary":"Market Headlines","operationId":"market_headlines_api_markets__slug__headlines_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"warm","in":"query","required":false,"schema":{"type":"boolean","description":"Serve only what is already cached and never pay for a cold fetch. For surfaces that merely TEASE the desk — the Town Square card — where an 8-second wait to render a link is not a trade worth making.","default":false,"title":"Warm"},"description":"Serve only what is already cached and never pay for a cold fetch. For surfaces that merely TEASE the desk — the Town Square card — where an 8-second wait to render a link is not a trade worth making."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/headlines/outlets":{"get":{"tags":["headlines"],"summary":"Registered Outlets","description":"The whole newsroom registry — which towns have their own paper wired up\nand which are riding on their state desk. Public on purpose: \"why is my\ntown thin?\" should be answerable without asking anybody.","operationId":"registered_outlets_api_headlines_outlets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/analytics/beacon.js":{"get":{"tags":["analytics"],"summary":"Beacon Js","operationId":"beacon_js_api_analytics_beacon_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/analytics/hit":{"post":{"tags":["analytics"],"summary":"Record Hit","description":"Record a page view. Analytics must never break a page, so any failure is\nswallowed and still returns 204.","operationId":"record_hit_api_analytics_hit_post","parameters":[{"name":"x-forwarded-for","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Forwarded-For"}},{"name":"x-real-ip","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Real-Ip"}},{"name":"user-agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hit"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/summary":{"get":{"tags":["analytics"],"summary":"Summary","operationId":"summary_api_analytics_summary_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","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/analytics/servers":{"get":{"tags":["analytics"],"summary":"Servers","description":"Live side-by-side comparison of the fleet, as a tree. Cached ~60s.","operationId":"servers_api_analytics_servers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/states":{"get":{"tags":["states"],"summary":"List States","description":"Every state with its market count and how many have real meeting data.","operationId":"list_states_api_states_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/app__schemas__StateOut"},"type":"array","title":"Response List States Api States Get"}}}}}}},"/api/states/{code}":{"get":{"tags":["states"],"summary":"Get State","operationId":"get_state_api_states__code__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/StateDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tls/ask":{"get":{"tags":["states"],"summary":"Tls Ask","operationId":"tls_ask_api_tls_ask_get","parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts":{"get":{"tags":["alerts"],"summary":"List Alerts","description":"Published alerts, newest first. Unpublished rows are never returned here\n— there is no `?published=0` escape hatch, because a draft notice about a\ntown is not something a query string should be able to publish.","operationId":"list_alerts_api_alerts_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Two-letter state code, e.g. nm","title":"State"},"description":"Two-letter state code, e.g. nm"},{"name":"county","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County"}},{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Market slug","title":"Market"},"description":"Market slug"},{"name":"module","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Owning module slug, e.g. acequias","title":"Module"},"description":"Owning module slug, e.g. acequias"},{"name":"active","in":"query","required":false,"schema":{"type":"integer","description":"1 = only live alerts (started, unexpired)","default":0,"title":"Active"},"description":"1 = only live alerts (started, unexpired)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AlertOut"},"title":"Response List Alerts Api Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["alerts"],"summary":"Create Alert","operationId":"create_alert_api_alerts_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/{slug}":{"get":{"tags":["alerts"],"summary":"Get Alert","description":"One alert by slug. An EXPIRED OR RESOLVED ALERT STILL RESOLVES HERE —\nthe record of what a town was told does not get deleted when it stops being\nurgent. Only `published` gates this.","operationId":"get_alert_api_alerts__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["alerts"],"summary":"Update Alert","operationId":"update_alert_api_alerts__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["alerts"],"summary":"Delete Alert","description":"Hard delete, admin only. Prefer PATCHing `published=false` or setting a\n`resolved_as` — those keep the permalink honest. This exists for a notice\nthat should never have been posted at all.","operationId":"delete_alert_api_alerts__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/acequias":{"get":{"tags":["acequias"],"summary":"List Coverage","description":"States where this desk has published something. A state with nothing to\nsay does not get a row — an empty desk advertised as coverage is the same\nlie as an empty city hub.","operationId":"list_coverage_api_acequias_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AcequiaStateSummary"},"type":"array","title":"Response List Coverage Api Acequias Get"}}}}}}},"/api/acequias/{code}":{"get":{"tags":["acequias"],"summary":"Get State Desk","operationId":"get_state_desk_api_acequias__code__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/AcequiaStateDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/acequias/{code}/water":{"get":{"tags":["acequias"],"summary":"State Water","description":"The Mora basin water picture. NM-only today, and it says so.\n\nThe gage roster in acequia_water is the Mora Valley. Another state asking\nfor this gets the committed halves omitted rather than New Mexico's numbers\nrelabelled with its name — the single worst thing a civic data page can do.","operationId":"state_water_api_acequias__code__water_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/WaterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/acequias/{code}/news":{"get":{"tags":["acequias"],"summary":"State News","description":"Latest from the New Mexico Acequia Association. Empty list on failure.","operationId":"state_news_api_acequias__code__news_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":6,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/acequias/{code}/library":{"get":{"tags":["acequias"],"summary":"State Library","description":"The reading room: verified documents, the OSE's own words, and where\nmeetings are posted. Static — no database, no network.","operationId":"state_library_api_acequias__code__library_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/acequias/{code}/photos":{"get":{"tags":["acequias"],"summary":"State Photos","description":"Public-domain photographs of the place. NM = Mora County, 1939 and 1943.","operationId":"state_photos_api_acequias__code__photos_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/acequias/{code}/map":{"get":{"tags":["acequias"],"summary":"State Map","description":"The statewide map, already projected to SVG paths.\n\nNM only. Another state gets an empty payload rather than New Mexico's\nditches under its own name — the same rule as /water.","operationId":"state_map_api_acequias__code__map_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/acequias/{code}/guides":{"get":{"tags":["acequias"],"summary":"List Guides","description":"Every regional fieldguide, most-mapped first.","operationId":"list_guides_api_acequias__code__guides_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/acequias/{code}/guides/{slug}":{"get":{"tags":["acequias"],"summary":"Get Guide","description":"One region's fieldguide: its ditches, diversions, adjudications, counties.\n\nA slug that is not a region 404s — the guide list is an allow-list built\nfrom the state's own region layer, so this cannot mint empty pages.","operationId":"get_guide_api_acequias__code__guides__slug__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/acequias/{code}/guides/{slug}/water":{"get":{"tags":["acequias"],"summary":"Guide Water","description":"Live gage readings and drought for one region.\n\nSEPARATE FROM THE GUIDE ITSELF ON PURPOSE. The guide is static geometry that\nnever changes between deploys; this half talks to USGS. Splitting them means\na slow federal API cannot delay the map, the ditch list or the adjudications\n— the page renders and this section fills in or renders away.","operationId":"guide_water_api_acequias__code__guides__slug__water_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hydrology":{"get":{"tags":["hydrology"],"summary":"National","operationId":"national_api_hydrology_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NationalOut"}}}}}}},"/api/hydrology/systems":{"get":{"tags":["hydrology"],"summary":"River Systems","operationId":"river_systems_api_hydrology_systems_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemsOut"}}}}}}},"/api/hydrology/states":{"get":{"tags":["hydrology"],"summary":"State Coverage","operationId":"state_coverage_api_hydrology_states_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatesOut"}}}}}}},"/api/hydrology/zones":{"get":{"tags":["hydrology"],"summary":"Delicate Zones","operationId":"delicate_zones_api_hydrology_zones_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZonesOut"}}}}}}},"/api/hydrology/{slug}":{"get":{"tags":["hydrology"],"summary":"Reservoir","operationId":"reservoir_api_hydrology__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotient/indicators":{"get":{"tags":["quotient"],"summary":"Indicators","operationId":"indicators_api_quotient_indicators_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexOut"}}}}}}},"/api/quotient/series/{slug}":{"get":{"tags":["quotient"],"summary":"One Series","operationId":"one_series_api_quotient_series__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeriesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotient/compare":{"get":{"tags":["quotient"],"summary":"Compare","operationId":"compare_api_quotient_compare_get","parameters":[{"name":"a","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":40,"title":"A"}},{"name":"b","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":40,"title":"B"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(indexed|ratio|spread)$","default":"indexed","title":"Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotient/polling":{"get":{"tags":["quotient"],"summary":"Polling","operationId":"polling_api_quotient_polling_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Polling Api Quotient Polling Get"}}}}}}},"/api/quotient/cabinet":{"get":{"tags":["quotient"],"summary":"Cabinet","operationId":"cabinet_api_quotient_cabinet_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Cabinet Api Quotient Cabinet Get"}}}}}}},"/api/quotient/trades":{"get":{"tags":["quotient"],"summary":"Trades","operationId":"trades_api_quotient_trades_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Trades Api Quotient Trades Get"}}}}}}},"/api/quotient/filings":{"get":{"tags":["quotient"],"summary":"Filings","operationId":"filings_api_quotient_filings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Filings Api Quotient Filings Get"}}}}}}},"/api/roles/me":{"get":{"tags":["roles"],"summary":"Whoami","description":"What the signed-in person may do — every desk can ask this to decide\nwhich controls to render, instead of each inventing its own answer.","operationId":"whoami_api_roles_me_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roles/rooms":{"get":{"tags":["roles"],"summary":"Rooms","operationId":"rooms_api_roles_rooms_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roles/modules-status":{"get":{"tags":["roles"],"summary":"Modules Status","description":"Every module's publish/mirror/bundle flags, for Global Controls.\n\nRead-only on purpose. `modules.json` is repo-owned — `deploy.sh` ships it\nfrom git — so a live write here would drift from whatever the next deploy\nlands, the same class of bug as a gitignored file riding the static lane.\nChanging one of these is a manifest edit + `scripts/sync_manifest.py` +\ncommit + deploy, not a button on this page.","operationId":"modules_status_api_roles_modules_status_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Modules Status Api Roles Modules Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roles/people":{"get":{"tags":["roles"],"summary":"People","description":"The staff roster. Members are only listed when they hold a rank —\nthe panel is a staff list, not a directory of everyone who ever signed up.","operationId":"people_api_roles_people_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roles/assign":{"post":{"tags":["roles"],"summary":"Assign","operationId":"assign_api_roles_assign_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_roles__AssignIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/roles/suspend":{"post":{"tags":["roles"],"summary":"Suspend","description":"Switch an account off without deleting it — the reversible answer to a\ncompromised login or a departing volunteer. Sessions die immediately\nbecause current_user re-checks is_active on every request.","operationId":"suspend_api_roles_suspend_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuspendIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/status":{"get":{"tags":["news"],"summary":"Status","operationId":"status_api_news_status_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/onair":{"post":{"tags":["news"],"summary":"Set Onair","description":"Flip the site-wide takeover. The flag file is all Caddy looks at, so\nthis is instant and needs no reload; delete = site reopens.","operationId":"set_onair_api_news_onair_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnAirIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/config":{"put":{"tags":["news"],"summary":"Put Config","operationId":"put_config_api_news_config_put","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"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/news/console-key":{"get":{"tags":["news"],"summary":"Console Key","description":"Hand the station key to a signed-in admin member.\n\nMaster Control is gated by the shared ADMIN_TOKEN, which is fine for a\nscripted call and miserable on a phone: a 32-character hex string typed\nby hand, on the device most likely to be holding a camera. An admin\nmember has already proven who they are with the session cookie, so the\nconsole can collect the key itself instead of asking.\n\nSame privilege, not more: this returns the token only to a member whose\naccount carries is_admin, and the console already stores that token in\nlocalStorage once it is entered by hand. Everything else keeps taking\nthe header exactly as before — nothing about the existing gate changes.","operationId":"console_key_api_news_console_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/news/viewer":{"post":{"tags":["news"],"summary":"Viewer Ping","description":"Public heartbeat from an open viewer. No auth, no identity, no storage.","operationId":"viewer_ping_api_news_viewer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewerIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/viewers":{"get":{"tags":["news"],"summary":"Viewers Now","description":"Public: how many sets are tuned in right now.","operationId":"viewers_now_api_news_viewers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/news/broadcasts":{"get":{"tags":["news"],"summary":"List Broadcasts","operationId":"list_broadcasts_api_news_broadcasts_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/broadcasts/{broadcast_id}":{"get":{"tags":["news"],"summary":"Get Broadcast","operationId":"get_broadcast_api_news_broadcasts__broadcast_id__get","parameters":[{"name":"broadcast_id","in":"path","required":true,"schema":{"type":"string","title":"Broadcast Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/watchdog":{"get":{"tags":["news"],"summary":"Watchdog State","description":"Is the safety net armed, and how close is it to signing us off?","operationId":"watchdog_state_api_news_watchdog_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/slate":{"get":{"tags":["news"],"summary":"Get Slate","description":"Public: what is on the air right now (or nothing).","operationId":"get_slate_api_news_slate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["news"],"summary":"Post Slate","description":"Master Control's own slate (the field kit posts via /api/fieldreporter).","operationId":"post_slate_api_news_slate_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_news__SlateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["news"],"summary":"Delete Slate","operationId":"delete_slate_api_news_slate_delete","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/broadcast-settings":{"get":{"tags":["news"],"summary":"Broadcast Settings","description":"The engineer's card: everything a phone needs to feed the tower.\nServed only to the admin so credentials never sit in public page source.","operationId":"broadcast_settings_api_news_broadcast_settings_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/source":{"get":{"tags":["news"],"summary":"Get Source","operationId":"get_source_api_news_source_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["news"],"summary":"Set Source","operationId":"set_source_api_news_source_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_news__SourceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/feeds":{"get":{"tags":["news"],"summary":"List Feeds","operationId":"list_feeds_api_news_feeds_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["news"],"summary":"Add Feed","operationId":"add_feed_api_news_feeds_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/feeds/{feed_id}":{"delete":{"tags":["news"],"summary":"Delete Feed","operationId":"delete_feed_api_news_feeds__feed_id__delete","parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","title":"Feed Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/press-pass/email":{"post":{"tags":["news"],"summary":"Send Pass","operationId":"send_pass_api_news_press_pass_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PressEmailIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fieldreporter/mtx-auth":{"post":{"tags":["fieldreporter"],"summary":"Mtx Auth","operationId":"mtx_auth_api_fieldreporter_mtx_auth_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MtxAuthIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fieldreporter/me":{"get":{"tags":["fieldreporter"],"summary":"Me","operationId":"me_api_fieldreporter_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/fieldreporter/slate":{"post":{"tags":["fieldreporter"],"summary":"Post Slate","description":"Slate the story before rolling. Required — nothing airs untitled.\n\nThe public slate carries the title, the unit, the start time and — by\nstation default — a pinpoint location, which the reporter can coarsen\nto ~100m or switch off per broadcast. The exact fix is always written\nto the private broadcast log regardless of what goes on air.","operationId":"post_slate_api_fieldreporter_slate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_fieldreporter__SlateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["fieldreporter"],"summary":"End Slate","description":"Feed ended — clear the slate so no stale title outlives the broadcast.","operationId":"end_slate_api_fieldreporter_slate_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/fieldreporter/kitt/publish":{"post":{"tags":["fieldreporter"],"summary":"Kitt Publish","description":"Publish a new build. Raw bytes in the body, same shape as a tape.\n\nX-Kind selects which build is being replaced: ipa (default, so an older\ncaller that never heard of Android still lands on the .ipa), apk-watch or\napk-phone.\n\nWritten to a .part file and renamed, so an agent downloading mid-publish\ncan never be handed a half-written file.","operationId":"kitt_publish_api_fieldreporter_kitt_publish_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}},{"name":"x-version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Version"}},{"name":"x-notes","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Notes"}},{"name":"x-kind","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fieldreporter/kitt":{"get":{"tags":["fieldreporter"],"summary":"Kitt","description":"Hand the badge holder the .ipa. Same gate as /me, enforced server-side.","operationId":"kitt_api_fieldreporter_kitt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/fieldreporter/kitt/{kind}":{"get":{"tags":["fieldreporter"],"summary":"Kitt Kind","description":"The Android halves, behind the same badge as everything else here.","operationId":"kitt_kind_api_fieldreporter_kitt__kind__get","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fieldreporter/upload":{"post":{"tags":["fieldreporter"],"summary":"Upload","description":"Transmit the tape: stream the original footage file to the archive.\nBody is the raw file bytes (not multipart) so multi-GB uploads stream\nstraight to disk without buffering.\n\nAn audio tape also gets a station-stamped broadcast copy written beside\nit — see station_stamp.py. That runs as a background task rather than\ninline: the reporter is on a phone, probably on cell data, and should\nget their \"transmitted\" the moment the bytes are safe on disk, not\nafter an encoder has finished with a copy of them.","operationId":"upload_api_fieldreporter_upload_post","parameters":[{"name":"x-badge","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Badge"}},{"name":"x-stream-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Stream-Key"}},{"name":"x-filename","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fieldreporter/roster":{"get":{"tags":["fieldreporter"],"summary":"Roster","operationId":"roster_api_fieldreporter_roster_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fieldreporter/assign":{"post":{"tags":["fieldreporter"],"summary":"Assign","operationId":"assign_api_fieldreporter_assign_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_fieldreporter__AssignIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fieldreporter/revoke":{"post":{"tags":["fieldreporter"],"summary":"Revoke","operationId":"revoke_api_fieldreporter_revoke_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadgeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fieldreporter/rekey":{"post":{"tags":["fieldreporter"],"summary":"Rekey","operationId":"rekey_api_fieldreporter_rekey_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadgeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fieldreporter/uploads":{"get":{"tags":["fieldreporter"],"summary":"Uploads","description":"The tape shelf: everything the bureau has transmitted, newest first.\n\nBroadcast copies and stamp receipts are folded INTO their tape's row\nrather than listed as tapes of their own — one upload is one thing on\nthe shelf, whatever the station stamp left beside it.","operationId":"uploads_api_fieldreporter_uploads_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/schedule":{"get":{"tags":["news"],"summary":"List Schedule","operationId":"list_schedule_api_news_schedule_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["news"],"summary":"Add Entry","operationId":"add_entry_api_news_schedule_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__news_schedule__EntryIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/news/schedule/{entry_id}":{"delete":{"tags":["news"],"summary":"Delete Entry","operationId":"delete_entry_api_news_schedule__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tv-guide/log":{"get":{"tags":["tv-guide"],"summary":"Get Log","description":"The book, oldest first. Filter by station date and/or free text.","operationId":"get_log_api_tv_guide_log_get","parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tv-guide/log.csv":{"get":{"tags":["tv-guide"],"summary":"Get Log Csv","description":"The same book as a spreadsheet.","operationId":"get_log_csv_api_tv_guide_log_csv_get","parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tv-guide/grid":{"get":{"tags":["tv-guide"],"summary":"Get Grid","description":"Listings: time across, station days down.","operationId":"get_grid_api_tv_guide_grid_get","parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tv-guide/day/{day}":{"get":{"tags":["tv-guide"],"summary":"Get Day","description":"One log sheet.","operationId":"get_day_api_tv_guide_day__day__get","parameters":[{"name":"day","in":"path","required":true,"schema":{"type":"string","title":"Day"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tv-guide/summary":{"get":{"tags":["tv-guide"],"summary":"Get Summary","description":"What the whole book adds up to, plus the months it covers.","operationId":"get_summary_api_tv_guide_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tv-guide/now":{"get":{"tags":["tv-guide"],"summary":"Get Now","description":"What is on the air this second, and what is booked next.\n\nBoth come from files another module owns, so both are best-effort: the\nguide reports what it can read and says nothing it cannot.","operationId":"get_now_api_tv_guide_now_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tv-guide/entries":{"post":{"tags":["tv-guide"],"summary":"Post Entry","description":"Hand-log a broadcast the tower didn't seal itself.","operationId":"post_entry_api_tv_guide_entries_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_tvguide__EntryIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tv-guide/entries/{entry_id}":{"patch":{"tags":["tv-guide"],"summary":"Patch Entry","description":"Correct a line. The previous values stay in the entry's own history.","operationId":"patch_entry_api_tv_guide_entries__entry_id__patch","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_tvguide__CorrectionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tv-guide"],"summary":"Get Entry","description":"The complete record of one line, private fields included.","operationId":"get_entry_api_tv_guide_entries__entry_id__get","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tv-guide/reconcile":{"post":{"tags":["tv-guide"],"summary":"Post Reconcile","description":"Force an ingest pass. Normally unnecessary — reads trigger one.","operationId":"post_reconcile_api_tv_guide_reconcile_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/record-remix/bootstrap":{"get":{"tags":["record-remix"],"summary":"Bootstrap","operationId":"bootstrap_api_record_remix_bootstrap_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/record-remix/records":{"get":{"tags":["record-remix"],"summary":"Crate Records","operationId":"crate_records_api_record_remix_records_get","parameters":[{"name":"agency","in":"query","required":true,"schema":{"type":"string","title":"Agency"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":150,"minimum":1,"default":80,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/record-remix/analytics":{"get":{"tags":["record-remix"],"summary":"Crate Analytics","operationId":"crate_analytics_api_record_remix_analytics_get","parameters":[{"name":"agency","in":"query","required":true,"schema":{"type":"string","title":"Agency"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/record-remix/connect":{"post":{"tags":["record-remix"],"summary":"Connect","operationId":"connect_api_record_remix_connect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/record-remix/save-remix":{"post":{"tags":["record-remix"],"summary":"Save Remix","operationId":"save_remix_api_record_remix_save_remix_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveRemixRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/record-remix/remix/{public_id}":{"get":{"tags":["record-remix"],"summary":"Get Remix","operationId":"get_remix_api_record_remix_remix__public_id__get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/record-remix/remixes/{public_id}/export.json":{"get":{"tags":["record-remix"],"summary":"Export Json","operationId":"export_json_api_record_remix_remixes__public_id__export_json_get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/record-remix/remixes/{public_id}/export.pdf":{"get":{"tags":["record-remix"],"summary":"Export Pdf","operationId":"export_pdf_api_record_remix_remixes__public_id__export_pdf_get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","title":"Public Id"}},{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Download"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/record-remix/remixes/{public_id}/cover":{"get":{"tags":["record-remix"],"summary":"Cover Image","operationId":"cover_image_api_record_remix_remixes__public_id__cover_get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ads/rotation":{"get":{"tags":["ads"],"summary":"Rotation","description":"The public playlist: every active creative sold into this zone.\nClients rotate banners in order (weight repeats a slot) and pick a\nweighted-random commercial for the pre-roll.","operationId":"rotation_api_ads_rotation_get","parameters":[{"name":"zone","in":"query","required":false,"schema":{"type":"string","default":"news","title":"Zone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ads/event":{"post":{"tags":["ads"],"summary":"Event","description":"The sales ledger's pen: public beacon, one counter bump per call.\nA bare UPDATE .. = col + 1 keeps it race-free without a row per event.","operationId":"event_api_ads_event_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ads/inventory":{"get":{"tags":["ads"],"summary":"Inventory","operationId":"inventory_api_ads_inventory_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ads/upload":{"post":{"tags":["ads"],"summary":"Upload","description":"Book a new spot: multipart upload straight onto the archive volume.\nStarlette spools big parts to a temp file, so a 300 MB commercial never\nsits in memory; we then stream it to its permanent home.","operationId":"upload_api_ads_upload_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_api_ads_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ads/{creative_id}":{"patch":{"tags":["ads"],"summary":"Patch","operationId":"patch_api_ads__creative_id__patch","parameters":[{"name":"creative_id","in":"path","required":true,"schema":{"type":"integer","title":"Creative Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ads"],"summary":"Delete","description":"Pull the spot entirely: row and file both go (the counters go with it —\nflip `active` off instead to keep the ledger).","operationId":"delete_api_ads__creative_id__delete","parameters":[{"name":"creative_id","in":"path","required":true,"schema":{"type":"integer","title":"Creative Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/derricks-millions/fund":{"get":{"tags":["derricks-millions"],"summary":"Fund Summary","description":"Everything the scoreboard needs in one call. All figures are sums over\nentered ledger rows; an empty ledger returns honest zeros.","operationId":"fund_summary_api_derricks_millions_fund_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/derricks-millions/ledger":{"get":{"tags":["derricks-millions"],"summary":"Public Ledger","description":"The whole book, newest first. Public by design — a fund that asks for\nother people's receipts publishes its own.","operationId":"public_ledger_api_derricks_millions_ledger_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/derricks-millions/pitches":{"post":{"tags":["derricks-millions"],"summary":"Create Pitch","description":"Public intake. Lands 'pending' — nothing appears on the board until a\nmoderator publishes it, and money only moves via a ledger entry.","operationId":"create_pitch_api_derricks_millions_pitches_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PitchCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["derricks-millions"],"summary":"List Pitches","description":"Public board. status=open → published + shortlisted, funded → the paid\nones, all → everything a moderator has made public.","operationId":"list_pitches_api_derricks_millions_pitches_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/derricks-millions/pitches/{pitch_id}/back":{"post":{"tags":["derricks-millions"],"summary":"Back Pitch","description":"Back a pitch — the board's only vote. One per hashed client, no account,\nno cookie. A repeat click is a no-op, not an error the UI has to explain.","operationId":"back_pitch_api_derricks_millions_pitches__pitch_id__back_post","parameters":[{"name":"pitch_id","in":"path","required":true,"schema":{"type":"integer","title":"Pitch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/derricks-millions/admin/pitches":{"get":{"tags":["derricks-millions"],"summary":"Admin List Pitches","description":"The full queue including contact details, filtered by status.","operationId":"admin_list_pitches_api_derricks_millions_admin_pitches_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/derricks-millions/admin/pitches/{pitch_id}/moderate":{"post":{"tags":["derricks-millions"],"summary":"Moderate Pitch","description":"Move a pitch along the ladder. Marking it 'funded' records the award on\nthe pitch — the money itself is a separate ledger entry, so the books can\nnever disagree with the board by accident.","operationId":"moderate_pitch_api_derricks_millions_admin_pitches__pitch_id__moderate_post","parameters":[{"name":"pitch_id","in":"path","required":true,"schema":{"type":"integer","title":"Pitch Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PitchModerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/derricks-millions/admin/ledger":{"get":{"tags":["derricks-millions"],"summary":"Admin Ledger","description":"The book including hidden drafts.","operationId":"admin_ledger_api_derricks_millions_admin_ledger_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["derricks-millions"],"summary":"Add Ledger Entry","description":"Record real money. Category is checked against the direction so a grant\ncan't be filed as income, and a grant must name the pitch it paid.","operationId":"add_ledger_entry_api_derricks_millions_admin_ledger_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LedgerCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/derricks-millions/admin/ledger/{entry_id}":{"delete":{"tags":["derricks-millions"],"summary":"Delete Ledger Entry","description":"Remove a mistyped entry outright. Corrections to *real* transactions\nshould be a new offsetting entry, not a deletion — the book is the record.","operationId":"delete_ledger_entry_api_derricks_millions_admin_ledger__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/catalog":{"get":{"tags":["bookstore"],"summary":"Catalog","operationId":"catalog_api_bookstore_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Catalog Api Bookstore Catalog Get"}}}}}}},"/api/bookstore/licenses":{"get":{"tags":["bookstore"],"summary":"Licenses","description":"The full terms, verbatim — the same record the storefront shows, the\nbuyer accepts, and the delivered file is stamped from.","operationId":"licenses_api_bookstore_licenses_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Licenses Api Bookstore Licenses Get"}}}}}}},"/api/bookstore/books/{slug}":{"get":{"tags":["bookstore"],"summary":"Book Detail","operationId":"book_detail_api_bookstore_books__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Book Detail Api Bookstore Books  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/orders":{"post":{"tags":["bookstore"],"summary":"Create Order","description":"Place an order — for yourself, or as a gift for someone else.","operationId":"create_order_api_bookstore_orders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bookstore__OrderIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Order Api Bookstore Orders Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/orders/{ref}":{"get":{"tags":["bookstore"],"summary":"Order Status","description":"Look up an order. Requires the reference *and* the email on it, so a\nguessed reference reveals nothing.","operationId":"order_status_api_bookstore_orders__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"email","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":200,"title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Order Status Api Bookstore Orders  Ref  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/orders/{ref}/resend":{"post":{"tags":["bookstore"],"summary":"Resend Download","description":"Lost the email? Mint a fresh token and send it to the address on file.\n\nOnly ever mails the licensee address already stored on the order, so this\ncannot be used to redirect a book to a new address.","operationId":"resend_download_api_bookstore_orders__ref__resend_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"email","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":200,"title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Resend Download Api Bookstore Orders  Ref  Resend Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/gifts/{code}":{"get":{"tags":["bookstore"],"summary":"Gift Preview","description":"What's behind a gift code, without spending it.","operationId":"gift_preview_api_bookstore_gifts__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Gift Preview Api Bookstore Gifts  Code  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/gifts/claim":{"post":{"tags":["bookstore"],"summary":"Claim Gift","description":"Redeem a gift code.\n\nThis mints the recipient their *own* order — zero-priced, kind='claim' —\nwhich is what the license page and the download grant are cut against. A\ngifted copy is therefore registered to the person actually reading it, not\nto whoever paid.","operationId":"claim_gift_api_bookstore_gifts_claim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bookstore__ClaimIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Claim Gift Api Bookstore Gifts Claim Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/download/{token}":{"get":{"tags":["bookstore"],"summary":"Download","description":"Hand over the file, once the grant says we may.\n\nFour gates, in order: the token must exist, not be revoked, not be expired,\nand not be over its download cap. Everything is checked against the grant\nrow rather than anything in the URL besides the token itself.","operationId":"download_api_bookstore_download__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/bookstore/admin/books":{"get":{"tags":["bookstore"],"summary":"Admin Books","description":"Catalog as the shop sees it, including drafts and file status.","operationId":"admin_books_api_bookstore_admin_books_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Books Api Bookstore Admin Books Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/books/{slug}/file":{"post":{"tags":["bookstore"],"summary":"Upload Master","description":"Put the master file on the archive volume.\n\nWritten to a .part file and renamed into place, so a download in flight\nnever sees a half-uploaded book.","operationId":"upload_master_api_bookstore_admin_books__slug__file_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_master_api_bookstore_admin_books__slug__file_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Master Api Bookstore Admin Books  Slug  File Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/orders":{"get":{"tags":["bookstore"],"summary":"Admin Orders","operationId":"admin_orders_api_bookstore_admin_orders_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Orders Api Bookstore Admin Orders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/orders/{ref}/mark-paid":{"post":{"tags":["bookstore"],"summary":"Admin Mark Paid","description":"Record that money arrived, and release the book.\n\nThis is the invoice lane's whole mechanism: a human confirms the funds\ncleared, and the same _handle_paid path the Stripe webhook uses takes over.","operationId":"admin_mark_paid_api_bookstore_admin_orders__ref__mark_paid_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bookstore__MarkPaidIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Mark Paid Api Bookstore Admin Orders  Ref  Mark Paid Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/orders/{ref}/approve":{"post":{"tags":["bookstore"],"summary":"Admin Approve","description":"Grant an educational / redistribution license application.\n\nThis is the human step the tier exists for: somebody confirms the applicant\nreally is a school, library, newsroom or community group before the shop\nhands over the right to copy the work and give it away. Approving a\nzero-priced application releases the file immediately; approving a priced\none just unblocks the normal payment path.","operationId":"admin_approve_api_bookstore_admin_orders__ref__approve_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Approve Api Bookstore Admin Orders  Ref  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/orders/{ref}/decline":{"post":{"tags":["bookstore"],"summary":"Admin Decline","description":"Turn down a license application, with a reason the applicant can be told.","operationId":"admin_decline_api_bookstore_admin_orders__ref__decline_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Decline Api Bookstore Admin Orders  Ref  Decline Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/orders/{ref}/cancel":{"post":{"tags":["bookstore"],"summary":"Admin Cancel","description":"Cancel or refund an order, revoking every download it handed out.","operationId":"admin_cancel_api_bookstore_admin_orders__ref__cancel_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bookstore__CancelIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Cancel Api Bookstore Admin Orders  Ref  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/gifts":{"post":{"tags":["bookstore"],"summary":"Admin Create Gift","description":"Send the book to a friend, free.\n\nWith a recipient email the claim link is mailed straight to them. Without\none you get the codes back to hand out however you like — text, print them\non a card, read them down the phone. `count` mints a batch in one call.\n\nComped gifts carry no order: nobody paid, and the ledger shouldn't pretend\notherwise. The claim still mints a real, registered order for whoever\nredeems it.","operationId":"admin_create_gift_api_bookstore_admin_gifts_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bookstore__GiftIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Create Gift Api Bookstore Admin Gifts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["bookstore"],"summary":"Admin Gifts","operationId":"admin_gifts_api_bookstore_admin_gifts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Gifts Api Bookstore Admin Gifts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/gifts/{gift_id}/revoke":{"post":{"tags":["bookstore"],"summary":"Admin Revoke Gift","operationId":"admin_revoke_gift_api_bookstore_admin_gifts__gift_id__revoke_post","parameters":[{"name":"gift_id","in":"path","required":true,"schema":{"type":"integer","title":"Gift Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Revoke Gift Api Bookstore Admin Gifts  Gift Id  Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/grants/{grant_id}/revoke":{"post":{"tags":["bookstore"],"summary":"Admin Revoke Grant","description":"Kill one download link — the move when a link turns up somewhere public.","operationId":"admin_revoke_grant_api_bookstore_admin_grants__grant_id__revoke_post","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"integer","title":"Grant Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Revoke Grant Api Bookstore Admin Grants  Grant Id  Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bookstore/admin/downloads":{"get":{"tags":["bookstore"],"summary":"Admin Downloads","description":"The audit trail: who pulled a file and when, by hashed address.","operationId":"admin_downloads_api_bookstore_admin_downloads_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Downloads Api Bookstore Admin Downloads Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/catalog":{"get":{"tags":["bodega"],"summary":"Catalog","description":"Everything the storefront needs to render itself, including which ways\nto pay are actually working right now.","operationId":"catalog_api_bodega_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Catalog Api Bodega Catalog Get"}}}}}}},"/api/bodega/products/{slug}":{"get":{"tags":["bodega"],"summary":"Product Detail","operationId":"product_detail_api_bodega_products__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Product Detail Api Bodega Products  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/quote":{"post":{"tags":["bodega"],"summary":"Quote","description":"Price a basket without committing to anything.\n\nThe cart drawer calls this instead of adding numbers up in JavaScript, so\nwhat a buyer sees and what the order is written for come from one place.","operationId":"quote_api_bodega_quote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bodega__QuoteIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Quote Api Bodega Quote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/orders":{"post":{"tags":["bodega"],"summary":"Create Order","description":"Place an order. Nothing here marks anything paid — that is the point.","operationId":"create_order_api_bodega_orders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bodega__OrderIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Order Api Bodega Orders Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/orders/{ref}":{"get":{"tags":["bodega"],"summary":"Order Status","description":"Look up an order. The reference alone is not enough.\n\nAn order carries a name and (for shipped orders) a home address, so the\nemail address on file is required to see it — a guessed reference number\ngets nothing back.","operationId":"order_status_api_bodega_orders__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"email","in":"query","required":false,"schema":{"type":"string","description":"The email address the order was placed with","default":"","title":"Email"},"description":"The email address the order was placed with"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Order Status Api Bodega Orders  Ref  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/download/{token}":{"get":{"tags":["bodega"],"summary":"Download","description":"Serve a digital item against a grant, and record that it happened.","operationId":"download_api_bodega_download__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/bodega/admin/orders":{"get":{"tags":["bodega"],"summary":"Admin Orders","operationId":"admin_orders_api_bodega_admin_orders_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Orders Api Bodega Admin Orders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/admin/orders/{ref}/mark-paid":{"post":{"tags":["bodega"],"summary":"Admin Mark Paid","description":"Record that money actually arrived — the PayPal/Venmo/Cash App/invoice/\ncash equivalent of the Stripe webhook.\n\nThere is no automatic confirmation for those lanes; someone looks at the\naccount, sees the order number in the payment note, and says so here. That\nis why `reference` is worth typing in: it is the whole audit trail.","operationId":"admin_mark_paid_api_bodega_admin_orders__ref__mark_paid_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bodega__MarkPaidIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Mark Paid Api Bodega Admin Orders  Ref  Mark Paid Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/admin/orders/{ref}/ship":{"post":{"tags":["bodega"],"summary":"Admin Ship","description":"Mark a paid order as gone, optionally with a tracking number.","operationId":"admin_ship_api_bodega_admin_orders__ref__ship_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShipIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Ship Api Bodega Admin Orders  Ref  Ship Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/admin/orders/{ref}/cancel":{"post":{"tags":["bodega"],"summary":"Admin Cancel","description":"Cancel an order, or record a refund.\n\nA refund revokes any download grants it issued at the same moment, because\na refunded digital item that still downloads is just a giveaway with extra\nsteps. Canceling releases the stock the order was holding.","operationId":"admin_cancel_api_bodega_admin_orders__ref__cancel_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bodega__CancelIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Cancel Api Bodega Admin Orders  Ref  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/admin/stock":{"get":{"tags":["bodega"],"summary":"Admin Stock","description":"What the catalog says exists vs what is already committed to orders.","operationId":"admin_stock_api_bodega_admin_stock_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Stock Api Bodega Admin Stock Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/admin/codes":{"post":{"tags":["bodega"],"summary":"Admin Mint Codes","description":"Mint one or a batch of give-away codes.\n\n**The plaintext codes come back exactly once, in this response.** They are\nstored hashed, so there is no endpoint that can show them again — if you\nlose them, revoke the batch and mint another. Print them, hand them out,\nread them down a phone.","operationId":"admin_mint_codes_api_bodega_admin_codes_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bodega__CodesIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Mint Codes Api Bodega Admin Codes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["bodega"],"summary":"Admin Codes","description":"Every code and what became of it — hints only, never the codes.","operationId":"admin_codes_api_bodega_admin_codes_get","parameters":[{"name":"active","in":"query","required":false,"schema":{"type":"boolean","description":"Only codes that would still redeem","default":false,"title":"Active"},"description":"Only codes that would still redeem"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Codes Api Bodega Admin Codes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/admin/codes/{code_id}/revoke":{"post":{"tags":["bodega"],"summary":"Admin Revoke Code","description":"Kill a code. Orders already placed with it are untouched — the goods\nwere given, and rewriting that record would be a lie.","operationId":"admin_revoke_code_api_bodega_admin_codes__code_id__revoke_post","parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"integer","title":"Code Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Revoke Code Api Bodega Admin Codes  Code Id  Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/admin/products/{slug}/file":{"post":{"tags":["bodega"],"summary":"Admin Upload Master","description":"Put a digital item's master file on the archive volume.\n\nWritten to a .part file and renamed into place, so a download in flight\nnever sees a half-uploaded file. The destination is outside every web root\nby construction — the only way back out is a grant.","operationId":"admin_upload_master_api_bodega_admin_products__slug__file_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_master_api_bodega_admin_products__slug__file_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Upload Master Api Bodega Admin Products  Slug  File Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bodega/admin/lanes":{"get":{"tags":["bodega"],"summary":"Admin Lanes","description":"Which payment lanes are live, and why the others aren't.\n\nUseful when a buyer says \"I can't see PayPal\": the answer is always either\na missing key or a channel that isn't flipped live in the donation\nswitchboard, and this says which.","operationId":"admin_lanes_api_bodega_admin_lanes_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Lanes Api Bodega Admin Lanes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/station":{"get":{"tags":["kussr"],"summary":"Get Station","description":"Everything the storefront needs to draw itself once: who the station is,\nwhat's on the rack, how you can pay, and which themes are installed.","operationId":"get_station_api_kussr_station_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Station Api Kussr Station Get"}}}}}}},"/api/kussr/episodes":{"get":{"tags":["kussr"],"summary":"List Episodes","operationId":"list_episodes_api_kussr_episodes_get","parameters":[{"name":"section","in":"query","required":false,"schema":{"type":"string","default":"","title":"Section"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Episodes Api Kussr Episodes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/episodes/{slug}":{"get":{"tags":["kussr"],"summary":"Episode Detail","operationId":"episode_detail_api_kussr_episodes__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Episode Detail Api Kussr Episodes  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/orders":{"post":{"tags":["kussr"],"summary":"Create Order","description":"Take a tape off the rack at whatever the listener named.","operationId":"create_order_api_kussr_orders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_kussr__OrderIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Order Api Kussr Orders Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/orders/{ref}":{"get":{"tags":["kussr"],"summary":"Order Status","description":"Look up an order. The reference alone is never enough.\n\nA paid order also hands back a fresh guest stream token, which is what lets\nsomebody who bought without an account play their tape straight from the\nreceipt page.","operationId":"order_status_api_kussr_orders__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"email","in":"query","required":false,"schema":{"type":"string","default":"","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Order Status Api Kussr Orders  Ref  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/verify":{"post":{"tags":["kussr"],"summary":"Verify Address","description":"Spend the proof token carried by a delivery link.\n\nCalled by the storefront when it sees ?verify=... in the URL. Deliberately\nforgiving: an already-verified member clicking their link a second time gets\na cheerful yes, not an error about a spent token, because from where they\nare standing nothing is wrong.","operationId":"verify_address_api_kussr_verify_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Verify Address Api Kussr Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/collection":{"get":{"tags":["kussr"],"summary":"Collection","description":"Every cassette this member owns, in acquisition order.\n\nSigning in is what makes a collection portable, so this is the one place\nthat insists on it — and it says why, rather than returning a bare 401 the\nstorefront would have to guess at.","operationId":"collection_api_kussr_collection_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Collection Api Kussr Collection Get"}}}}}}},"/api/kussr/tapes/{slug}/position":{"post":{"tags":["kussr"],"summary":"Save Position","description":"Remember where the listener stopped. That is what a cassette does.","operationId":"save_position_api_kussr_tapes__slug__position_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PositionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Save Position Api Kussr Tapes  Slug  Position Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/tapes/{slug}/heat":{"post":{"tags":["kussr"],"summary":"Record Heat","description":"Add to the most-replayed curve: \"these slices were actually listened to\".\n\nGated on owning the tape, which is what keeps the curve honest — it counts\nlistening, not crawling. Nothing about *who* is recorded: the row that comes\nout of this is (episode, bucket, count+1), with no id, no session and no\naddress attached, so the curve can never be turned back into a person's\nlistening history.\n\nThe client sends a slice once per pass and re-sends it if the listener\nrewinds over it again, which is exactly what makes this a *replay* count\nrather than a reach count.","operationId":"record_heat_api_kussr_tapes__slug__heat_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeatIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Record Heat Api Kussr Tapes  Slug  Heat Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/stream/{slug}":{"get":{"tags":["kussr"],"summary":"Stream","description":"The audio itself, for somebody who owns the tape.\n\nTwo proofs are accepted: a member session, or a guest token minted on a\nreceipt. Nothing else — the master never leaves the archive volume on the\nstrength of a guessed URL.","operationId":"stream_api_kussr_stream__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"t","in":"query","required":false,"schema":{"type":"string","description":"Guest stream token from a receipt","default":"","title":"T"},"description":"Guest stream token from a receipt"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/overview":{"get":{"tags":["kussr"],"summary":"Admin Overview","description":"The whole log as the console needs it, including drafts and benched\nepisodes, plus whether this box can actually save an edit.","operationId":"admin_overview_api_kussr_admin_overview_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Overview Api Kussr Admin Overview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/station":{"put":{"tags":["kussr"],"summary":"Admin Put Station","description":"Edit the station identity. Only keys the storefront reads are accepted —\nan unknown field is a typo, and silently storing it hides the mistake.","operationId":"admin_put_station_api_kussr_admin_station_put","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Put Station Api Kussr Admin Station Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/sections":{"post":{"tags":["kussr"],"summary":"Admin Add Section","description":"Open a new shelf — one topic, one series.","operationId":"admin_add_section_api_kussr_admin_sections_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_kussr__SectionIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Add Section Api Kussr Admin Sections Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/sections/{section_id}":{"put":{"tags":["kussr"],"summary":"Admin Edit Section","operationId":"admin_edit_section_api_kussr_admin_sections__section_id__put","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_kussr__SectionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Edit Section Api Kussr Admin Sections  Section Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["kussr"],"summary":"Admin Delete Section","description":"Close a shelf — but never while there are tapes standing on it.","operationId":"admin_delete_section_api_kussr_admin_sections__section_id__delete","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Delete Section Api Kussr Admin Sections  Section Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/episodes":{"post":{"tags":["kussr"],"summary":"Admin Add Episode","description":"Log a new tape. It arrives as a draft with no audio — uploading the\nmaster and setting it live are separate, deliberate acts.","operationId":"admin_add_episode_api_kussr_admin_episodes_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Add Episode Api Kussr Admin Episodes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/episodes/{slug}":{"put":{"tags":["kussr"],"summary":"Admin Edit Episode","operationId":"admin_edit_episode_api_kussr_admin_episodes__slug__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Edit Episode Api Kussr Admin Episodes  Slug  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["kussr"],"summary":"Admin Delete Episode","description":"Pull an episode out of the log entirely.\n\nRefused once anybody owns a copy. Somebody who bought a tape keeps it, and\nthe honest way to take a sold episode off the rack is to set it 'archived',\nwhich stops sales and leaves every existing tape playable.","operationId":"admin_delete_episode_api_kussr_admin_episodes__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Delete Episode Api Kussr Admin Episodes  Slug  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/episodes/{slug}/audio":{"post":{"tags":["kussr"],"summary":"Admin Upload Master","description":"Put the master audio on the archive volume and point the log at it.\n\nThis is the moment a benched episode becomes buyable: `buyable()` is status\nplus a real file on disk, so nothing can be sold that cannot be delivered.","operationId":"admin_upload_master_api_kussr_admin_episodes__slug__audio_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_master_api_kussr_admin_episodes__slug__audio_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Upload Master Api Kussr Admin Episodes  Slug  Audio Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/episodes/{slug}/preview":{"post":{"tags":["kussr"],"summary":"Admin Upload Preview","description":"Put a free clip in the web root and point the log at it.\n\nThe preview goes somewhere public on purpose. It is the part of the station\nanybody can hear, so it is served by Caddy as a plain file with no API, no\nsession, and no database between a stranger and the sound of the thing.","operationId":"admin_upload_preview_api_kussr_admin_episodes__slug__preview_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_preview_api_kussr_admin_episodes__slug__preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Upload Preview Api Kussr Admin Episodes  Slug  Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/orders":{"get":{"tags":["kussr"],"summary":"Admin Orders","operationId":"admin_orders_api_kussr_admin_orders_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Orders Api Kussr Admin Orders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/orders/{ref}/mark-paid":{"post":{"tags":["kussr"],"summary":"Admin Mark Paid","description":"Record that money actually arrived, and put the tape on the shelf.\n\nFor every lane but card this is the only way an order becomes paid, and the\nreference typed in here IS the audit trail — nothing tells us a Venmo\npayment landed except a person looking at an account.","operationId":"admin_mark_paid_api_kussr_admin_orders__ref__mark_paid_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_kussr__MarkPaidIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Mark Paid Api Kussr Admin Orders  Ref  Mark Paid Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/orders/{ref}/cancel":{"post":{"tags":["kussr"],"summary":"Admin Cancel","description":"Cancel a pending order, or refund a paid one and take the tape back.","operationId":"admin_cancel_api_kussr_admin_orders__ref__cancel_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_kussr__CancelIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Cancel Api Kussr Admin Orders  Ref  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/codes":{"post":{"tags":["kussr"],"summary":"Admin Mint Codes","description":"Mint cards to hand out in a room.\n\nThe plaintext codes come back exactly once, here. Only their hashes are\nstored, so losing this response means minting fresh ones — and a database\ndump hands out nothing.","operationId":"admin_mint_codes_api_kussr_admin_codes_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_kussr__CodesIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Mint Codes Api Kussr Admin Codes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["kussr"],"summary":"Admin Codes","operationId":"admin_codes_api_kussr_admin_codes_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Codes Api Kussr Admin Codes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/codes/{code_id}/revoke":{"post":{"tags":["kussr"],"summary":"Admin Revoke Code","operationId":"admin_revoke_code_api_kussr_admin_codes__code_id__revoke_post","parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"integer","title":"Code Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Revoke Code Api Kussr Admin Codes  Code Id  Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/comp":{"post":{"tags":["kussr"],"summary":"Admin Comp","description":"Put a tape directly in somebody's organizer, no code and no order form.\n\nFor the person who was in the room, or the reporter who asked. It still\nwrites a real order at zero so the ledger shows a tape given, not a tape\nthat appeared from nowhere.","operationId":"admin_comp_api_kussr_admin_comp_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_kussr__CompIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Comp Api Kussr Admin Comp Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kussr/admin/tapes":{"get":{"tags":["kussr"],"summary":"Admin Tapes","description":"Who is holding what. The circulation list.","operationId":"admin_tapes_api_kussr_admin_tapes_get","parameters":[{"name":"episode","in":"query","required":false,"schema":{"type":"string","default":"","title":"Episode"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Tapes Api Kussr Admin Tapes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/dial":{"get":{"tags":["air"],"summary":"Dial","description":"The whole band, in dial order.\n\nDark frequencies are included by default and that is the design: D's call\nwas \"full dial pre-seeded, dark until claimed\", and a dark slot is an\ninvitation rather than an absence. `include_dark=false` is there for a\ncompact \"what is actually playing\" view.","operationId":"dial_api_air_dial_get","parameters":[{"name":"band","in":"query","required":false,"schema":{"type":"string","pattern":"^(am|fm)?$","default":"","title":"Band"}},{"name":"include_dark","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Dark"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Dial Api Air Dial Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/formats":{"get":{"tags":["air"],"summary":"Formats","description":"The format wheels a DJ can programme to. Data, not a menu of branches —\nadding a format is a row in air.FORMATS.","operationId":"formats_api_air_formats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Formats Api Air Formats Get"}}}}}}},"/api/air/policy":{"get":{"tags":["air"],"summary":"Policy","description":"What this station says about its music, in public.\n\nGenerated from the same constants the gate runs on, so the promise and the\nenforcement cannot drift apart. A policy page maintained by hand is a\npolicy page that is eventually a lie.","operationId":"policy_api_air_policy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Policy Api Air Policy Get"}}}}}}},"/api/air/stations/{slug}":{"get":{"tags":["air"],"summary":"Station Detail","operationId":"station_detail_api_air_stations__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Station Detail Api Air Stations  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/now":{"get":{"tags":["air"],"summary":"Now Playing","description":"THE endpoint the player lives on.\n\nEverything needed to start playing comes back in one request: the file, how\nmany seconds into it we are, when it ends, and what is next. The client\nsets `audio.src` and `audio.currentTime` and is in sync with everybody else\non the frequency.\n\n`server_time` is included so a client can measure its own clock skew\nagainst ours rather than trusting the device — a phone whose clock is two\nminutes out would otherwise drift audibly on every track change.","operationId":"now_playing_api_air_stations__slug__now_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"ahead","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":0,"default":3,"title":"Ahead"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Now Playing Api Air Stations  Slug  Now Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/schedule":{"get":{"tags":["air"],"summary":"Schedule","description":"What is coming up, with wall-clock start times.","operationId":"schedule_api_air_stations__slug__schedule_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"count","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":12,"title":"Count"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Schedule Api Air Stations  Slug  Schedule Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/log":{"get":{"tags":["air"],"summary":"Public Log","description":"What this frequency has actually played. Public on purpose.\n\nA station whose whole pitch is \"we play original and public-domain music\"\nshould be checkable by anybody, not just by an auditor. The same rows are\nwhat a clearing service would be shown.","operationId":"public_log_api_air_stations__slug__log_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"default":6,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Public Log Api Air Stations  Slug  Log Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/desk":{"get":{"tags":["air"],"summary":"Station Desk","description":"What the DJ sees: the library, what cleared, and what did not — with\nthe gate's own reason on every refusal.\n\nThe refusals are the important half. A DJ whose upload is not playing needs\nto be told why in the words the gate used; silence is how a rights system\nbecomes a mystery and then becomes a support request.\n\nGATED PER FREQUENCY, not on station-wide moderator. It read\n`requires(\"moderator\", room=DESK)` until 2026-08-19, which contradicted the\nfirst line of this docstring: a DJ posted to 101.3 could upload to it, edit\nits profile, replace its art, delete its tracks and put it on the air — and\ngot a 403 asking for Moderator when they tried to SEE it. Nobody noticed\nbecause nothing called this endpoint; the whole DJ API had no UI until the\nbooth, and an unreachable endpoint's gate is untested by construction.\n\nThe gate is now EITHER — the frequency's DJ or the desk's staff — because\nswapping one for the other simply moves the exclusion: gating on the\nfrequency alone locks out a moderator scoped to [\"kussr\"], who is precisely\nthe person the role ladder exists to describe. A test caught that, acting as\nexactly that persona.\n\nHold/release stay moderator-gated on purpose — a hold is a cross-station\ntakedown that pulls a track from EVERY frequency carrying it, which is a\ndifferent power from running your own show.","operationId":"station_desk_api_air_stations__slug__desk_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Station Desk Api Air Stations  Slug  Desk Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/rebuild":{"post":{"tags":["air"],"summary":"Rebuild Rotation","description":"Put the station's current library on the air.\n\nCloses the running rotation and opens a new one at this instant. Everybody\nlistening moves to the new running order together — which is why this is an\nexplicit action rather than something that happens quietly whenever a track\nis uploaded.","operationId":"rebuild_rotation_api_air_stations__slug__rebuild_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RebuildIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Rebuild Rotation Api Air Stations  Slug  Rebuild Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/catch-up":{"post":{"tags":["air"],"summary":"Catch Up","description":"Materialise the spin log up to now.\n\nNormally a scheduled job's work. Exposed because being able to force it is\nwhat makes the log verifiable by hand, and because a report is worth\nnothing if you cannot prove it is current.","operationId":"catch_up_api_air_stations__slug__catch_up_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Catch Up Api Air Stations  Slug  Catch Up Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/tracks/{track_id}/hold":{"post":{"tags":["air"],"summary":"Hold","description":"Pull a track off the air everywhere, right now.\n\nA hold beats every basis including a valid license, and it rebuilds every\nstation carrying the track rather than waiting for a natural rebuild. When\nsomebody says \"that is mine and you may not play it\", the audio stops and\nthe paperwork happens afterwards.","operationId":"hold_api_air_tracks__track_id__hold_post","parameters":[{"name":"track_id","in":"path","required":true,"schema":{"type":"integer","title":"Track Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Hold Api Air Tracks  Track Id  Hold Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/tracks/{track_id}/release":{"post":{"tags":["air"],"summary":"Release","operationId":"release_api_air_tracks__track_id__release_post","parameters":[{"name":"track_id","in":"path","required":true,"schema":{"type":"integer","title":"Track Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Release Api Air Tracks  Track Id  Release Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/report":{"get":{"tags":["air"],"summary":"Report","description":"The report a clearing service asks for.\n\nAvailable NOW, while the band plays nothing but originals and public-domain\nmaterial, because the day it is needed is the day it is too late to start\nkeeping it. That is the entire argument for building the spin log before\nbuying a license.","operationId":"report_api_air_report_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":2160,"minimum":1,"default":24,"title":"Hours"}},{"name":"station","in":"query","required":false,"schema":{"type":"string","default":"","title":"Station"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Report Api Air Report Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/health":{"get":{"tags":["air"],"summary":"Health","description":"Is the band up, and is anything actually on the air?\n\nDeliberately counts stations whose CLOCK says on_air rather than stations\nwhose status column says so. A row claiming to be broadcasting with an\nempty rotation is exactly the failure this would otherwise hide.","operationId":"health_api_air_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Health Api Air Health Get"}}}}}}},"/api/air/mine":{"get":{"tags":["air"],"summary":"My Frequencies","description":"Which frequencies am I posted to?\n\nAnswers rather than refusing when signed out — this is what the DJ desk\ncalls to decide whether to show itself at all, and a 401 for the public is\na worse answer than an empty list.","operationId":"my_frequencies_api_air_mine_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My Frequencies Api Air Mine Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/profile":{"put":{"tags":["air"],"summary":"Put Profile","description":"The DJ's own controls: what the station is called, what it plays, and\nthe line that scrolls under the readout.\n\nA PARTIAL update on purpose — every field is optional and only what was\nsent is written. This is the opposite of the KUSSR episode PUT, which is a\nfull-object replace and blanked a live product's price band when somebody\nsent a partial body. A profile edited from a phone should not have to\nresend fields it is not showing.","operationId":"put_profile_api_air_stations__slug__profile_put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_air__ProfileIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Put Profile Api Air Stations  Slug  Profile Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/art":{"post":{"tags":["air"],"summary":"Upload Art","description":"The DJ's photo, and the skin pulled out of it.\n\nD: \"ask DJs to upload any photo so that you can use that as a skin overlay\nfor now. as long as we have a reference image logged, we can improve our\nskin builder over time.\"\n\nSo the ORIGINAL IS KEPT beside the rendered square. Every future\nimprovement to the skin builder wants the source, and a 320px thumbnail is\nnot it.\n\nNot a third image pipeline: `instag_media.spool_upload` / `render_avatar`\nalready do the careful parts — a header-only pixel budget check before\ndecode so a decompression bomb never allocates, format validated against\nthe DECODED image rather than the filename, and a re-encode carrying no\nEXIF, which matters most here because a station photo is exactly the file\nmost likely to be a phone picture with GPS in it.","operationId":"upload_art_api_air_stations__slug__art_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_art_api_air_stations__slug__art_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Art Api Air Stations  Slug  Art Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/upload-terms":{"get":{"tags":["air"],"summary":"Upload Terms","description":"What an uploader must be shown, and the exact words they will agree to.\n\nServed rather than hardcoded in the page so the wording and its version\nnumber travel together — a stored `True` against wording nobody kept is not\nan audit trail, and the front end must not be the place that decides what\nthe sentence was.","operationId":"upload_terms_api_air_upload_terms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Terms Api Air Upload Terms Get"}}}}}}},"/api/air/stations/{slug}/tracks":{"post":{"tags":["air"],"summary":"Upload Track","description":"A DJ's upload, from a phone, straight onto the air.\n\nD: \"This will allow Mantis Claw to upload mp3's from his phone or computer\nand immediately make the station come to life.\"\n\nTHE CHAIN, and none of it is new machinery:\n    spool (hard byte cap + free-disk guard)\n      -> MasterJob(deliver_to=\"kussr-air:<station>:<track>\")\n      -> the mastering worker normalizes to -16 LUFS and ffprobes duration\n      -> the track goes `ready` and the rights gate decides if it airs\n\nMastering is not a nicety. Sixty-six frequencies of member uploads at\nwhatever level their phone recorded is a dial you cannot scan without\nreaching for the volume every third station. The queue already exists, is\nthread-capped and runs one job at a time so it cannot starve the API.","operationId":"upload_track_api_air_stations__slug__tracks_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_track_api_air_stations__slug__tracks_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Track Api Air Stations  Slug  Tracks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["air"],"summary":"List Tracks","description":"The DJ's own library, with the gate's verdict on every row.","operationId":"list_tracks_api_air_stations__slug__tracks_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Tracks Api Air Stations  Slug  Tracks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/tracks/{track_id}":{"delete":{"tags":["air"],"summary":"Delete Track","description":"Pull a track from the library.\n\nThe row goes; the AUDIT TRAIL DOES NOT. The attestation and any spins that\nalready aired are deliberately left behind — a licensing report has to be\nable to say what was on the air last Tuesday whether or not the DJ has\nsince tidied their library.","operationId":"delete_track_api_air_stations__slug__tracks__track_id__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"track_id","in":"path","required":true,"schema":{"type":"integer","title":"Track Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Track Api Air Stations  Slug  Tracks  Track Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/air/stations/{slug}/go-live":{"post":{"tags":["air"],"summary":"Go Live","description":"Put the station on the air — and, the first time, tell the town.\n\nThe launch broadcast is idempotent on the station's FIRST-AIR timestamp,\nso a rebuild, a retry, or a station that went quiet for a week and came\nback does not announce itself as new. And it is wrapped: a station going\nlive is the good news, and a broken Tweeter must never be the thing that\nkeeps a frequency off the air.","operationId":"go_live_api_air_stations__slug__go_live_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Go Live Api Air Stations  Slug  Go Live Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/register/":{"get":{"tags":["register"],"summary":"Listing","operationId":"listing_api_register__get","parameters":[{"name":"after","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"After"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}},{"name":"subject","in":"query","required":false,"schema":{"type":"string","default":"","title":"Subject"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Listing Api Register  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/register":{"get":{"tags":["register"],"summary":"Listing","operationId":"listing_api_register_get","parameters":[{"name":"after","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"After"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}},{"name":"subject","in":"query","required":false,"schema":{"type":"string","default":"","title":"Subject"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Listing Api Register Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/register/export.json":{"get":{"tags":["register"],"summary":"Export","description":"The whole register as one archivable file.\n\nDeliberately downloadable and deliberately self-describing: it carries the\nverification recipe, so a copy saved today can still be checked years from\nnow by somebody who has never heard of this API.","operationId":"export_api_register_export_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/register/verify":{"get":{"tags":["register"],"summary":"Verify","description":"Walk the chain and report the first break. Public, because a promise\nonly we can check is not a promise.","operationId":"verify_api_register_verify_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Verify Api Register Verify Get"}}}}}}},"/api/register/head":{"get":{"tags":["register"],"summary":"Head","operationId":"head_api_register_head_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Head Api Register Head Get"}}}}}}},"/api/register/confirm":{"get":{"tags":["register"],"summary":"Confirm Show","description":"What is being asked, for the page the holder lands on.\n\nA DEAD OR EXPIRED TOKEN IS NOT AN ERROR HERE. The person following this\nlink did not ask to be involved, and a 404 would tell them nothing. They\nget a plain answer and a way to reach a human.","operationId":"confirm_show_api_register_confirm_get","parameters":[{"name":"t","in":"query","required":true,"schema":{"type":"string","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Confirm Show Api Register Confirm Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["register"],"summary":"Confirm Answer","description":"Yes or no, from the rights holder, recorded in the public register.\n\nNO ACCOUNT REQUIRED, and that is the design: the person answering is\nprecisely the person who is not one of our members. The one-time token IS\nthe authentication, and it is burned either way — a link that still works\nafter it was answered is a link somebody else can press later.","operationId":"confirm_answer_api_register_confirm_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Confirm Answer Api Register Confirm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/register/anchor":{"post":{"tags":["register"],"summary":"Anchor","description":"Publish the head hash somewhere we cannot edit, and record that we did.\n\nThis is the step that makes a single-publisher chain worth anything. The\nchain stops somebody editing entry 400 in place; it does not stop US\nrewriting 400 onwards and republishing. An anchor already sitting in the\nTweeter band's archive is a witness to what the chain said at that moment,\nand every anchor is one more thing a rewrite would have to also rewrite.","operationId":"anchor_api_register_anchor_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnchorIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Anchor Api Register Anchor Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/register/pending":{"get":{"tags":["register"],"summary":"Pending","description":"Every permission still waiting on a real answer.\n\nStaff-only, unlike the rest of this router, because it lists what has NOT\nbeen confirmed yet against named people — which is a to-do list, not a\nfinding.","operationId":"pending_api_register_pending_get","parameters":[{"name":"station","in":"query","required":false,"schema":{"type":"string","default":"","title":"Station"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Pending Api Register Pending Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/register/sweep":{"post":{"tags":["register"],"summary":"Sweep","description":"Pull anything whose confirmation window has run out.\n\nNormally a scheduled job. Exposed so it can be forced and, more usefully,\nso a human can see it do nothing on a day when nothing is due.","operationId":"sweep_api_register_sweep_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Sweep Api Register Sweep Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/catalog":{"get":{"tags":["trading-post"],"summary":"The price list, and which rails are open right now","operationId":"catalog_api_trading_post_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Catalog Api Trading Post Catalog Get"}}}}}}},"/api/trading-post/ledger":{"get":{"tags":["trading-post"],"summary":"Totals only — the public book","operationId":"ledger_api_trading_post_ledger_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Ledger Api Trading Post Ledger Get"}}}}}}},"/api/trading-post/exports":{"get":{"tags":["trading-post"],"summary":"Export manifests: counts, sizes, hashes, build times (free)","operationId":"exports_index_api_trading_post_exports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"object"},"type":"array","title":"Response Exports Index Api Trading Post Exports Get"}}}}}}},"/api/trading-post/convert":{"get":{"tags":["trading-post"],"summary":"The price of a conversion (a probe — never charges)","operationId":"convert_probe_api_trading_post_convert_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Payment required. Every open rail is offered at once: `WWW-Authenticate: Payment …` (cards via Stripe MPP) and/or `PAYMENT-REQUIRED` (x402 USDC on Base). Retry with `Authorization: Payment …` or `PAYMENT-SIGNATURE`."},"409":{"description":"That credential was already presented (replay)."},"503":{"description":"The till is not open, no rail can carry this price, the facilitator is unreachable, or the resource is not built yet. Nothing was charged."}}},"post":{"tags":["trading-post"],"summary":"Convert one legacy file (multipart field `file`)","operationId":"convert_api_trading_post_convert_post","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"json | text | csv | bundle","default":"json","title":"Format"},"description":"json | text | csv | bundle"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Payment required. Every open rail is offered at once: `WWW-Authenticate: Payment …` (cards via Stripe MPP) and/or `PAYMENT-REQUIRED` (x402 USDC on Base). Retry with `Authorization: Payment …` or `PAYMENT-SIGNATURE`."},"409":{"description":"That credential was already presented (replay)."},"503":{"description":"The till is not open, no rail can carry this price, the facilitator is unreachable, or the resource is not built yet. Nothing was charged."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/notarize":{"post":{"tags":["trading-post"],"summary":"Pin a SHA-256 to the Public Register","operationId":"notarize_api_trading_post_notarize_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Payment required. Every open rail is offered at once: `WWW-Authenticate: Payment …` (cards via Stripe MPP) and/or `PAYMENT-REQUIRED` (x402 USDC on Base). Retry with `Authorization: Payment …` or `PAYMENT-SIGNATURE`."},"409":{"description":"That credential was already presented (replay)."},"503":{"description":"The till is not open, no rail can carry this price, the facilitator is unreachable, or the resource is not built yet. Nothing was charged."}}}},"/api/trading-post/exports/{dataset}":{"get":{"tags":["trading-post"],"summary":"One whole dataset as jsonl.gz","operationId":"export_download_api_trading_post_exports__dataset__get","parameters":[{"name":"dataset","in":"path","required":true,"schema":{"type":"string","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Payment required. Every open rail is offered at once: `WWW-Authenticate: Payment …` (cards via Stripe MPP) and/or `PAYMENT-REQUIRED` (x402 USDC on Base). Retry with `Authorization: Payment …` or `PAYMENT-SIGNATURE`."},"409":{"description":"That credential was already presented (replay)."},"503":{"description":"The till is not open, no rail can carry this price, the facilitator is unreachable, or the resource is not built yet. Nothing was charged."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/exports/{dataset}/{token}":{"get":{"tags":["trading-post"],"summary":"Re-download a bought export against its grant","operationId":"export_redownload_api_trading_post_exports__dataset___token__get","parameters":[{"name":"dataset","in":"path","required":true,"schema":{"type":"string","title":"Dataset"}},{"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/trading-post/tip/{tier}":{"post":{"tags":["trading-post"],"summary":"A gift. Tiers: 0.10 (USDC only), 0.50, 1, 5, 25","operationId":"tip_api_trading_post_tip__tier__post","parameters":[{"name":"tier","in":"path","required":true,"schema":{"type":"string","title":"Tier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Payment required. Every open rail is offered at once: `WWW-Authenticate: Payment …` (cards via Stripe MPP) and/or `PAYMENT-REQUIRED` (x402 USDC on Base). Retry with `Authorization: Payment …` or `PAYMENT-SIGNATURE`."},"409":{"description":"That credential was already presented (replay)."},"503":{"description":"The till is not open, no rail can carry this price, the facilitator is unreachable, or the resource is not built yet. Nothing was charged."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/records-requests":{"post":{"tags":["trading-post"],"summary":"Pay us to file a New Mexico public-records request (a person approves each one)","operationId":"records_request_api_trading_post_records_requests_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Payment required. Every open rail is offered at once: `WWW-Authenticate: Payment …` (cards via Stripe MPP) and/or `PAYMENT-REQUIRED` (x402 USDC on Base). Retry with `Authorization: Payment …` or `PAYMENT-SIGNATURE`."},"409":{"description":"That credential was already presented (replay)."},"503":{"description":"The till is not open, no rail can carry this price, the facilitator is unreachable, or the resource is not built yet. Nothing was charged."}}}},"/api/trading-post/orders/{ref}":{"get":{"tags":["trading-post"],"summary":"What happened to a records or goods order","operationId":"order_status_api_trading_post_orders__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Order Status Api Trading Post Orders  Ref  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/orders":{"post":{"tags":["trading-post"],"summary":"Buy Bodega goods in one call; the server prices the basket","operationId":"goods_order_api_trading_post_orders_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Payment required. Every open rail is offered at once: `WWW-Authenticate: Payment …` (cards via Stripe MPP) and/or `PAYMENT-REQUIRED` (x402 USDC on Base). Retry with `Authorization: Payment …` or `PAYMENT-SIGNATURE`."},"409":{"description":"That credential was already presented (replay)."},"503":{"description":"The till is not open, no rail can carry this price, the facilitator is unreachable, or the resource is not built yet. Nothing was charged."}}}},"/api/trading-post/batch/preflight":{"post":{"tags":["trading-post"],"summary":"FREE: what a batch would cost and what we can actually read (never charges)","description":"The eligibility summary the brief requires BEFORE any money moves.\n\nSniffs every file, says per file whether we can give you tables, text,\npartial content or only a name, enforces every limit, refuses a batch we\ncannot read at all, and points a small job at the cheaper single-file\nlane. Nothing here is charged and nothing here is a promise to pay.","operationId":"batch_preflight_api_trading_post_batch_preflight_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_batch_preflight_api_trading_post_batch_preflight_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Batch Preflight Api Trading Post Batch Preflight Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/batch/{ref}/pay":{"post":{"tags":["trading-post"],"summary":"Pay a quoted batch and queue it ($49)","operationId":"batch_pay_api_trading_post_batch__ref__pay_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-batch-claim","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Batch-Claim"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Payment required. Every open rail is offered at once: `WWW-Authenticate: Payment …` (cards via Stripe MPP) and/or `PAYMENT-REQUIRED` (x402 USDC on Base). Retry with `Authorization: Payment …` or `PAYMENT-SIGNATURE`."},"409":{"description":"That credential was already presented (replay)."},"503":{"description":"The till is not open, no rail can carry this price, the facilitator is unreachable, or the resource is not built yet. Nothing was charged."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/batch/{ref}":{"get":{"tags":["trading-post"],"summary":"What happened to a batch (needs the claim token)","operationId":"batch_status_api_trading_post_batch__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-batch-claim","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Batch-Claim"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Batch Status Api Trading Post Batch  Ref  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/batch/{ref}/result/{token}":{"get":{"tags":["trading-post"],"summary":"Download a delivered batch bundle","operationId":"batch_result_api_trading_post_batch__ref__result__token__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"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/trading-post/evidence/capacity":{"get":{"tags":["trading-post"],"summary":"FREE: is the desk taking new Evidence Packs today?","operationId":"evidence_capacity_api_trading_post_evidence_capacity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Evidence Capacity Api Trading Post Evidence Capacity Get"}}}}}}},"/api/trading-post/evidence/scope":{"post":{"tags":["trading-post"],"summary":"FREE: submit one question for review (never charges)","description":"Intake. A person, not this endpoint, decides whether we take the work.","operationId":"evidence_scope_api_trading_post_evidence_scope_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScopeIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Evidence Scope Api Trading Post Evidence Scope Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/evidence/{ref}":{"get":{"tags":["trading-post"],"summary":"What happened to an Evidence Pack (needs the claim token)","operationId":"evidence_status_api_trading_post_evidence__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-pack-claim","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pack-Claim"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Evidence Status Api Trading Post Evidence  Ref  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/evidence/{ref}/pay":{"post":{"tags":["trading-post"],"summary":"Pay an ACCEPTED Evidence Pack ($149)","operationId":"evidence_pay_api_trading_post_evidence__ref__pay_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-pack-claim","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pack-Claim"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"402":{"description":"Payment required. Every open rail is offered at once: `WWW-Authenticate: Payment …` (cards via Stripe MPP) and/or `PAYMENT-REQUIRED` (x402 USDC on Base). Retry with `Authorization: Payment …` or `PAYMENT-SIGNATURE`."},"409":{"description":"That credential was already presented (replay)."},"503":{"description":"The till is not open, no rail can carry this price, the facilitator is unreachable, or the resource is not built yet. Nothing was charged."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/evidence/{ref}/result/{token}":{"get":{"tags":["trading-post"],"summary":"Download a delivered pack (.pdf or .json)","operationId":"evidence_result_api_trading_post_evidence__ref__result__token__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(pdf|json)$","default":"pdf","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/evidence/{ref}/correction":{"post":{"tags":["trading-post"],"summary":"Use the one included correction round","operationId":"evidence_correction_api_trading_post_evidence__ref__correction_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-pack-claim","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pack-Claim"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_trading_post__CorrectionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Evidence Correction Api Trading Post Evidence  Ref  Correction Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/text/stats":{"get":{"tags":["documents"],"summary":"How much of the archive has extracted text","operationId":"text_stats_api_documents_text_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Text Stats Api Documents Text Stats Get"}}}}}}},"/api/documents/{document_id}/text":{"get":{"tags":["documents"],"summary":"Extracted text of an archived document","operationId":"document_text_api_documents__document_id__text_get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{document_id}/text.json":{"get":{"tags":["documents"],"summary":"Extracted text with the document's metadata","operationId":"document_text_json_api_documents__document_id__text_json_get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Document Text Json Api Documents  Document Id  Text Json Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trading-post/traffic":{"get":{"tags":["trading-post"],"summary":"Till and MCP traffic: 402s issued vs paid, by product, rail, tool and day (counts only)","operationId":"traffic_summary_api_trading_post_traffic_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Traffic Summary Api Trading Post Traffic Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/membership/me":{"get":{"tags":["membership"],"summary":"Read Card","operationId":"read_card_api_membership_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Read Card Api Membership Me Get"}}}}}},"put":{"tags":["membership"],"summary":"Write Card","description":"Save the card. Refuses to PUBLISH without proof; saves everything else.\n\nThe split matters: somebody filling in their details should never be told\n\"no\" wholesale because they have not opened a tape email yet. The card\nsaves, the switches simply do not come on, and the response says why in a\nsentence they can act on.","operationId":"write_card_api_membership_me_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_membership__CardIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Write Card Api Membership Me Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/membership/me/unlist":{"post":{"tags":["membership"],"summary":"Unlist","description":"Take both entries down now, in one move.\n\nSeparate from the card save because somebody who wants out should not have\nto hunt for two checkboxes among a dozen fields.","operationId":"unlist_api_membership_me_unlist_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Unlist Api Membership Me Unlist Post"}}}}}}},"/api/membership/directory":{"get":{"tags":["membership"],"summary":"Directory","description":"The membership list. Master view, or one town's.\n\nOPT-IN ONLY, and that is not a policy this endpoint applies -- it is the\nonly thing it can do. Entries are built by `membership.listing_preview`,\nthe SAME function that shows a member their own preview, so the public list\ncannot drift from what they were shown they were agreeing to. Two\nprojections would eventually disagree, and the one that leaks would be this\none.\n\nThree things follow from reusing it, none of which need remembering here:\n  * `postal` is never emitted. It is the most precise thing on the card and\n    no branch of the preview returns it. D's ruling 2026-08-19: the ZIP sets\n    the market and is never shown.\n  * `phone`, `city` and `about` appear only where the member switched them\n    on, individually.\n  * A member who never switched `listed_white` on has no white entry at\n    all, so they cannot appear here however the query is written.\n\n`market` filters to one Town Square, using the market DERIVED from the\ncard's city+region -- where they receive mail -- not a free-text field\nsomebody could type anything into.\n\nA FOURTH thing follows from the loop below, and it is the reason this\nendpoint now takes a reader at all: members the CALLER has silenced drop\nout of it. Because the filtering and the paging both happen in Python,\n`total`, the page slice and the market counts stay honest for free -- had\nany of the three been done in SQL, filtering rows without also fixing the\ncount would give short pages and a total that lies.\n\nStill ANONYMOUS-SAFE. `silence.screen` depends on `security.current_user`,\nwhich returns None rather than raising, so a signed-out reader gets an\nempty Screen and the unfiltered list, exactly as before.","operationId":"directory_api_membership_directory_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","default":"","title":"Market"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Directory Api Membership Directory Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/presence/online":{"get":{"tags":["presence"],"summary":"Online","description":"The line of names at the bottom of the page.\n\n`market` narrows to one Town Square using the market DERIVED from the\nmember's card (city + region), the same derivation the directory uses — not\na free-text field, and not wherever they happen to be browsing.\n\n`you` reports the caller's own state so the panel can offer the switch to\nsomebody who is invisible, rather than showing them an empty room with no\nhint that they could be in it. It is only ever about the CALLER: an\nanonymous reader gets `signed_in: false` and a 200, never a 401 — this is\ndrawn at the foot of ordinary pages and a 401 there would red-line the\nconsole for every signed-out visitor.","operationId":"online_api_presence_online_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","default":"","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Online Api Presence Online Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/presence/count":{"get":{"tags":["presence"],"summary":"Count","description":"How many members are about, and how many of them chose to be named.\n\nBoth numbers, deliberately. `here` counts every signed-in member inside the\nwindow; `listed` counts the subset who switched the lamp on. Publishing\nonly the second would make a busy site look dead, and publishing only the\nfirst would invite \"who are the other four?\" — which is precisely the\nquestion the opt-in exists to leave unanswered.\n\n`here` is a count of PEOPLE, not sessions (`online_user_ids` returns a set),\nso a member on a phone and a laptop is one.","operationId":"count_api_presence_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Count Api Presence Count Get"}}}}}}},"/api/silence/config":{"get":{"tags":["silence"],"summary":"Config","description":"The levels and the sentence, so the button, the undo screen and the\ndocs are one string rather than three that drift apart.\n\nPublic: it describes the feature, not anybody's use of it.","operationId":"config_api_silence_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Config Api Silence Config Get"}}}}}}},"/api/silence":{"get":{"tags":["silence"],"summary":"My List","description":"Everyone I have turned down — the undo screen.\n\nShows the name, because this is a list the member wrote about people they\nchose, and a list of anonymous cards is one nobody can maintain. It is\nserved only to its owner.","operationId":"my_list_api_silence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My List Api Silence Get"}}}}}}},"/api/silence/{user_id}":{"put":{"tags":["silence"],"summary":"Set Level","description":"Turn somebody down, or change the level. Idempotent.","operationId":"set_level_api_silence__user_id__put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SilenceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Level Api Silence  User Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["silence"],"summary":"Undo","description":"Undo it.\n\nA real DELETE, unlike almost everything else on this platform, which\nretires rather than removes. The difference is that a silence is a live\nPREFERENCE and not a record of anything: there is nothing here anybody\ncould need to appeal, audit or reconstruct, and a tombstone row would only\nbe a list of people a member used to dislike — which is a worse thing to\nhold than the row it replaced.\n\nIdempotent: undoing a silence that is not there is a 200, because the\nmember's intent (\"I do not want this\") is satisfied either way and a 404\nwould only be a puzzle on a double-click.","operationId":"undo_api_silence__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Undo Api Silence  User Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pegboard/config":{"get":{"tags":["pegboard"],"summary":"Config","description":"The dropdown and what the board does with it. Public.","operationId":"config_api_pegboard_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Config Api Pegboard Config Get"}}}}}}},"/api/pegboard/disclosure":{"get":{"tags":["pegboard"],"summary":"Disclosure","description":"What the board tells its readers about itself, generated from the rules\nthat actually run — GOVERNANCE.md §7's requirement, because a\nhand-maintained policy drifts from the implementation within a month.","operationId":"disclosure_api_pegboard_disclosure_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Disclosure Api Pegboard Disclosure Get"}}}}}}},"/api/pegboard":{"get":{"tags":["pegboard"],"summary":"Board","description":"The board. Public, and a leaf — nothing here reaches a member.\n\nAnonymous on purpose: a notice board behind a login is a notice board\nnobody reads, and every notice on it has already been stripped of anything\nthat would identify a person by name or by link.","operationId":"board_api_pegboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Board Api Pegboard Get"}}}}}}},"/api/pegboard/notices/{notice_id}/photo":{"get":{"tags":["pegboard"],"summary":"Notice Photo","description":"The mugshot on one notice, served through the NOTICE.\n\nThis route is the whole reason `photo_name` holds a filename rather than a\nURL. The member's own avatar path is \"/avatars/<their id>/<name>.jpg\", so\nputting it on the board would republish the id the notice exists not to\ncarry — and an id is one request away from the name. Here the id is\nresolved server-side from `subject_id`, which the API knows and the reader\ndoes not.\n\n404 rather than a placeholder when there is no photograph, so a Google-hosted\navatar (which this deliberately does not proxy) is a card with no picture\nrather than a broken image or an outbound fetch.","operationId":"notice_photo_api_pegboard_notices__notice_id__photo_get","parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"integer","title":"Notice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pegboard/me":{"get":{"tags":["pegboard"],"summary":"My Standing","description":"What the board is saying about YOU.\n\nGOVERNANCE.md §7.3 asks of any field: does this tell you how the system\nbehaved, or only who it happened to? A notice published to every reader\nthat its subject cannot read is the second thing — quiet capture, which is\nwhat the append-only record and the whole Watershed exist to make hard. And\nthe subject already knows it is them: their own photograph is on the card.\nWithholding it from them while showing it to their neighbors is strictly\nworse than showing them.\n\nEXACTLY WHAT THE PUBLIC SEES, AND NOTHING MORE.\n\nNot who flagged them — that is the one thing a subject must never be handed,\nbecause the first use of that list is retaliation and the second is the end\nof anybody flagging anything.\n\nNot the free text. Those are other members' words about them, and writing\nstyle identifies people; it reaches the subject only if a panel is ever\nconvened and they have a case to answer.\n\nNot a running tally BELOW the line. That is deliberate and it is the same\nrefusal the flagger gets: a count nobody has published yet is a private\naccusation with no notice attached, and handing it over turns a threshold\ninto a scoreboard for the person most motivated to work out who is on it.\nBefore a notice exists there is genuinely nothing to see, because nothing\nhas been said out loud.","operationId":"my_standing_api_pegboard_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My Standing Api Pegboard Me Get"}}}}}}},"/api/pegboard/flags/mine/{user_id}":{"get":{"tags":["pegboard"],"summary":"My Flag","description":"Have I already raised a hand about this member?\n\nSo the button can say \"you flagged this\" rather than silently no-opping.\nAnswers only about the CALLER's own row — there is no endpoint here that\ntells anybody how many hands are up on a member who has no notice, because\nthat is a tally in progress and publishing it early is the whole thing\nthis design is trying not to do.","operationId":"my_flag_api_pegboard_flags_mine__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My Flag Api Pegboard Flags Mine  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pegboard/flags":{"post":{"tags":["pegboard"],"summary":"Raise Hand","description":"Raise a hand about a member.\n\n`security.require_user`, NOT `roles.requires(\"member\")` — `member` is rank\n0 and `user_rank(None)` is also 0, so that gate lets a signed-out visitor\nstraight through. A tally anonymous callers can add to is not a tally.\n\nIDEMPOTENT, and that is the anti-stuffing design working with the unique\nconstraint rather than against it: a second flag on the same member returns\n`duplicate: true` and changes no count. Swap Meet's report endpoint settled\nthis shape first, and it is better than a 409 because the member's intent\nis satisfied either way.\n\nThe per-day cap is NOT what protects the threshold, and it should not be\ndescribed as though it were. It stops one member filing forty flags in an\nafternoon; it does nothing at all against fifty people each filing one,\nwhich is exactly what brigading looks like. The real defenses are the\nunique constraint, the window, `spread_days` on the notice, and the fact\nthat nothing happens.","operationId":"raise_hand_api_pegboard_flags_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Raise Hand Api Pegboard Flags Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pegboard/flags/{user_id}":{"delete":{"tags":["pegboard"],"summary":"Lower Hand","description":"Put a raised hand back down.\n\nWithdrawn, never deleted, so a count can be recomputed from history and so\n\"I changed my mind\" is distinguishable from \"I never said anything\".\n\nA withdrawal can retire a notice. It cannot un-draw a panel — see the\n`latch` block in pegboard/RULES.json, which argues that out where it can\nbe amended rather than here where it cannot.","operationId":"lower_hand_api_pegboard_flags__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Lower Hand Api Pegboard Flags  User Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/members/{user_id}":{"get":{"tags":["members"],"summary":"Profile","description":"One member, as much of them as they chose to publish.\n\n404 for a member who does not exist. NOT 404 for a member who is unlisted:\nthey still have a name, a join date and a post count, all of which are\nreadable off any post they have written, and pretending otherwise would\nmake the page lie about who is on the platform. What an unlisted member\ndoes not have is a phone book entry — `listing` comes back empty and the\npage says the plain true thing.","operationId":"profile_api_members__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Profile Api Members  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages":{"get":{"tags":["messages"],"summary":"Inbox","description":"Every conversation I am in, newest first, with what is unread.\n\nUnread is a COUNT against the watermark on my own membership row, not a\nper-message receipts table — see the model docstring. One integer answers\nit, and \"mark read\" stays unambiguous.","operationId":"inbox_api_messages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Inbox Api Messages Get"}}}}}}},"/api/messages/with/{user_id}":{"get":{"tags":["messages"],"summary":"Thread With","description":"Is there already a conversation with this member, and may I start one?\n\nRead-only, so the profile page can draw the right button without a write.\nReturns `thread_id: null` when none exists yet.","operationId":"thread_with_api_messages_with__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Thread With Api Messages With  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/to/{user_id}":{"post":{"tags":["messages"],"summary":"Write To","description":"Start (or continue) the one conversation with this member, and send.","operationId":"write_to_api_messages_to__user_id__post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_messages__SendIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Write To Api Messages To  User Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/{thread_id}":{"get":{"tags":["messages"],"summary":"Read Thread","description":"One conversation. Reading it marks it read.","operationId":"read_thread_api_messages__thread_id__get","parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"integer","title":"Thread Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Read Thread Api Messages  Thread Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["messages"],"summary":"Reply","description":"Reply into a conversation I am already in.","operationId":"reply_api_messages__thread_id__post","parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"integer","title":"Thread Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_messages__SendIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Reply Api Messages  Thread Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/{thread_id}/messages/{message_id}":{"delete":{"tags":["messages"],"summary":"Unsend","description":"Take back something I sent. Mine only, and it leaves a gap, not a hole.\n\n`is_removed` rather than a delete: the other person saw it, and quietly\nerasing it from their copy would let a conversation be rewritten after the\nfact. They see that something was withdrawn.","operationId":"unsend_api_messages__thread_id__messages__message_id__delete","parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"integer","title":"Thread Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Unsend Api Messages  Thread Id  Messages  Message Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/config":{"get":{"tags":["member-admin"],"summary":"Config","description":"The vocabulary, served rather than duplicated.\n\nThe panel renders the buttons this returns and nothing else, so the reason\nlist, the durations and — most importantly — which actions this particular\nmoderator may take all have exactly one definition, in `moderation.py`.\nA second copy in the HTML would be a second policy, and the stale one would\nbe the one showing a moderator a Ban button that 403s.","operationId":"config_api_member_admin_config_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Config Api Member Admin Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/overview":{"get":{"tags":["member-admin"],"summary":"Overview","description":"The numbers a moderator opens the desk to see.","operationId":"overview_api_member_admin_overview_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Overview Api Member Admin Overview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/members":{"get":{"tags":["member-admin"],"summary":"List Members","description":"Search the membership.\n\nPaginated because the old endpoint was not: a station with a thousand\nmembers should not send a thousand rows to draw the first twenty, and the\nmoment it does, the panel becomes the thing nobody opens.","operationId":"list_members_api_member_admin_members_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Status"}},{"name":"role","in":"query","required":false,"schema":{"type":"string","default":"","title":"Role"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Sort"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Members Api Member Admin Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/members/{user_id}":{"get":{"tags":["member-admin"],"summary":"Dossier","description":"Everything about one member, on one screen.\n\nDeliberately one request rather than six: a moderator deciding whether to\nmute somebody should see the strikes, the notes, the card and what they\nhave actually written at the same moment, not after four more clicks. The\ncost is a handful of counts on an admin screen, which is the cheapest thing\nin this codebase to spend.","operationId":"dossier_api_member_admin_members__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Dossier Api Member Admin Members  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/members/{user_id}/actions":{"post":{"tags":["member-admin"],"summary":"Act","description":"Apply one action to one member.\n\nA single endpoint rather than fifteen, because the things that must be true\nof EVERY moderator action — rank reaches it, target is below you, it lands\nin the log, the log commits in the same transaction as the consequence —\nshould be written once. Fifteen endpoints means fifteen chances to forget\nthe log line, and the log is the half that matters in six months.","operationId":"act_api_member_admin_members__user_id__actions_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Act Api Member Admin Members  User Id  Actions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/bulk":{"post":{"tags":["member-admin"],"summary":"Bulk","description":"The same action across a selection — the answer to a spam wave.\n\nRefuses the irreversible ones. A bulk delete is one mis-click away from\nerasing a page of real people, and nothing about a spam wave is urgent\nenough to be worth that; the loop below stops rather than continues on the\nfirst refusal only per-member, so one protected target does not silently\nswallow the rest.","operationId":"bulk_api_member_admin_bulk_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_member_admin__BulkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Bulk Api Member Admin Bulk Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/members/{user_id}/notes":{"post":{"tags":["member-admin"],"summary":"Add Note","operationId":"add_note_api_member_admin_members__user_id__notes_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Add Note Api Member Admin Members  User Id  Notes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/notes/{note_id}":{"delete":{"tags":["member-admin"],"summary":"Delete Note","operationId":"delete_note_api_member_admin_notes__note_id__delete","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Note Api Member Admin Notes  Note Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/queue":{"get":{"tags":["member-admin"],"summary":"Queue","description":"Every report on the station, newest first.","operationId":"queue_api_member_admin_queue_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Queue Api Member Admin Queue Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/queue/{source}/{report_id}":{"post":{"tags":["member-admin"],"summary":"Resolve","operationId":"resolve_api_member_admin_queue__source___report_id__post","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_member_admin__ResolveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Resolve Api Member Admin Queue  Source   Report Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/log":{"get":{"tags":["member-admin"],"summary":"Log","description":"Who did what. Readable by every moderator, editable by nobody.\n\nDeliberately not admin-only: a record only the people it could incriminate\ncan read is not much of a record, and a moderator seeing how colleagues\nhandle the same situation is how a house style forms.","operationId":"log_api_member_admin_log_get","parameters":[{"name":"action","in":"query","required":false,"schema":{"type":"string","default":"","title":"Action"}},{"name":"actor_id","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Actor Id"}},{"name":"target_id","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Target Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":3650,"minimum":1,"default":90,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Log Api Member Admin Log Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/member-admin/me":{"get":{"tags":["member-admin"],"summary":"My Standing","operationId":"my_standing_api_member_admin_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My Standing Api Member Admin Me Get"}}}}}}},"/api/member-admin/me/acknowledge":{"post":{"tags":["member-admin"],"summary":"Acknowledge","description":"The member says they have seen it, and may say why they disagree.\n\nThe appeal lands as a note on their own dossier and a line in the log —\nwhere a moderator is already looking — rather than in an inbox somebody\nhas to remember to check.","operationId":"acknowledge_api_member_admin_me_acknowledge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AckIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Acknowledge Api Member Admin Me Acknowledge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jailbird/state":{"get":{"tags":["jailbird"],"summary":"State","description":"Is the station booked? Public, because every page render needs it.\n\nCheap on purpose — one primary-key lookup on a table with a handful of\nrows. This is read on the way to drawing any member anywhere, so it must\nnever become the thing that makes the Town Square slow.","operationId":"state_api_jailbird_state_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response State Api Jailbird State Get"}}}}}},"put":{"tags":["jailbird"],"summary":"Set State","description":"Throw the switch. Co-admin and up — this restyles every member at once.\n\nIt lands in the moderation log beside suspensions and bans, which is not a\njoke about the log: turning the entire membership into suspects IS a\nmoderation action, and the record should be able to say who did it and\nwhen. \"Derrick booked 1,006 members at 16:41\" is a real audit line.","operationId":"set_state_api_jailbird_state_put","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set State Api Jailbird State Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jailbird/card/{user_id}":{"get":{"tags":["jailbird"],"summary":"Card","description":"The facts one card is built from — and only the ones a stranger may see.\n\nReturns the plain record. The relabeling into booking language happens in\nthe browser (`web/lib/jailbird.mjs`), on purpose: the API should never be\nthe thing that decided to call somebody's join date a booking date. Turn\nthe feature off and this endpoint still describes a member accurately.","operationId":"card_api_jailbird_card__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Card Api Jailbird Card  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/line":{"get":{"tags":["payphone"],"summary":"Get Line","description":"Your line, or the blank one you have not made yet.\n\nNever creates a row. A GET that writes would mint a line for anybody who\nmerely loaded the page, and `key_digits` is unique — a member who never\nfinished setup would be silently holding a claim on an empty string.","operationId":"get_line_api_payphone_line_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Line Api Payphone Line Get"}}}}}},"put":{"tags":["payphone"],"summary":"Put Line","description":"Create or update your line. The key is your own phone number.","operationId":"put_line_api_payphone_line_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_payphone__LineIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Put Line Api Payphone Line Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/entries":{"get":{"tags":["payphone"],"summary":"Get Entries","operationId":"get_entries_api_payphone_entries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Entries Api Payphone Entries Get"}}}}}},"post":{"tags":["payphone"],"summary":"Add Entry","operationId":"add_entry_api_payphone_entries_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_payphone__EntryIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Add Entry Api Payphone Entries Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/entries/{entry_id}":{"put":{"tags":["payphone"],"summary":"Edit Entry","operationId":"edit_entry_api_payphone_entries__entry_id__put","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_payphone__EntryIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Edit Entry Api Payphone Entries  Entry Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["payphone"],"summary":"Drop Entry","operationId":"drop_entry_api_payphone_entries__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Drop Entry Api Payphone Entries  Entry Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/entries/reorder":{"post":{"tags":["payphone"],"summary":"Reorder","operationId":"reorder_api_payphone_entries_reorder_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Reorder Api Payphone Entries Reorder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/script":{"get":{"tags":["payphone"],"summary":"Get Script","description":"EXACTLY what the phone would say, and how long it takes to say it.\n\nThe dry run in the browser plays this. The IVR builds from the same\nfunction. If those two ever disagree, the member rehearsed a call that\ndoes not exist — so they read one projection, not two.","operationId":"get_script_api_payphone_script_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Script Api Payphone Script Get"}}}}}}},"/api/payphone/calls":{"get":{"tags":["payphone"],"summary":"Get Calls","description":"Who has been dialling your line. The receipt for `live` defaulting on.","operationId":"get_calls_api_payphone_calls_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Calls Api Payphone Calls Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/messages":{"get":{"tags":["payphone"],"summary":"Get Messages","operationId":"get_messages_api_payphone_messages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Messages Api Payphone Messages Get"}}}}}}},"/api/payphone/messages/{message_id}":{"put":{"tags":["payphone"],"summary":"Set Message","description":"Seal a message, or release a held one.\n\nA SENT message cannot be moved. It has already reached somebody's phone,\nand a state that claims otherwise would be the record lying about the\nworld — Moving Day's rule, same reason.","operationId":"set_message_api_payphone_messages__message_id__put","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Message Api Payphone Messages  Message Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/card":{"get":{"tags":["payphone"],"summary":"Get Card","description":"The wallet card: the two numbers, and whether the line can answer yet.\n\n`did` empty means no number is provisioned, and the card says so in plain\nwords rather than printing a blank. A card that looks complete and does not\nring is worse than no card.","operationId":"get_card_api_payphone_card_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Card Api Payphone Card Get"}}}}}}},"/api/payphone/rehearse":{"post":{"tags":["payphone"],"summary":"Rehearse","description":"Walk your own tree exactly as the phone would read it.\n\nTHIS IS NOT A MOCK. It calls `routes_payphone_voice.do_incoming` /\n`do_gather` — the same functions the carrier lane calls — and returns the\nsame XML document a phone company would be handed. A rehearsal built as a\nsecond implementation of the menu would drift from the real one, and the\nmember would practise a call that does not exist. The one thing this file\nsupplies is a different DOOR: a session instead of a request signature.\n\nThree containments, because this endpoint takes no signature:\n\n  1. `only_line_id` is always the caller's own line, so no path through the\n     IVR can reach anybody else's — including the keyed stage, where you\n     are free to type a neighbor's number and will get exactly what a\n     stranger gets.\n  2. `log` is left as the default no-op. A practice run must not appear in\n     \"who has been dialling your line\", which is a record of OTHER people\n     reaching you.\n  3. It works with the voice lane dark, because it never touches\n     `telephony.configured()` — which is the entire point today.","operationId":"rehearse_api_payphone_rehearse_post","parameters":[{"name":"leg","in":"query","required":false,"schema":{"type":"string","default":"incoming","title":"Leg"}},{"name":"stage","in":"query","required":false,"schema":{"type":"string","default":"key","title":"Stage"}},{"name":"line","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Line"}},{"name":"slot","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Slot"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RehearseIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Rehearse Api Payphone Rehearse Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/voice/{secret}/incoming":{"post":{"tags":["payphone-voice"],"summary":"Incoming","operationId":"incoming_api_payphone_voice__secret__incoming_post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/voice/{secret}/gather":{"post":{"tags":["payphone-voice"],"summary":"Gather","operationId":"gather_api_payphone_voice__secret__gather_post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}},{"name":"stage","in":"query","required":false,"schema":{"type":"string","default":"key","title":"Stage"}},{"name":"line","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Line"}},{"name":"slot","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Slot"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/voice/{secret}/record":{"post":{"tags":["payphone-voice"],"summary":"Record","description":"Tier 2's message desk. Store it, then deliver AFTER the call ends.","operationId":"record_api_payphone_voice__secret__record_post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}},{"name":"line","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Line"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payphone/voice/{secret}/status":{"post":{"tags":["payphone-voice"],"summary":"Status","description":"The call ended. Stamp the duration onto the row we already wrote.","operationId":"status_api_payphone_voice__secret__status_post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}},{"name":"line","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Line"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stars/pledge":{"get":{"tags":["stars"],"summary":"Pledge","description":"The words, and whether this member has agreed to them.","operationId":"pledge_api_stars_pledge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PledgeOut"}}}}}},"post":{"tags":["stars"],"summary":"Sign","description":"Agree to be a good human. One star, and the catch-up in the same breath.\n\nThe version check is StayAgreement's: a member must not be able to accept\nwords they were never shown, which happens for real when a tab sits open\nacross a deploy that reworded the pledge.","operationId":"sign_api_stars_pledge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_stars__SignIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stars/me":{"get":{"tags":["stars"],"summary":"Me","description":"Everything about my own stars. Recounts first, so it is never stale.","operationId":"me_api_stars_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeOut"}}}}}}},"/api/stars/card/{user_id}":{"get":{"tags":["stars"],"summary":"Card","description":"The count for one member — what the booking card prints.\n\nA NUMBER FOR EVERYBODY, THE LIST FOR THE MEMBER AND STAFF. See the module\ndocstring: \"deleted Meta entirely\" is a fact about somebody's life off\nthis platform, and a public itemisation of it is a disclosure the member\nmade to us, not to the room.","operationId":"card_api_stars_card__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Card Api Stars Card  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stars/claims/{key}":{"get":{"tags":["stars"],"summary":"Claim Offer","description":"What this claim is worth, what it asks of you, and whether you may.","operationId":"claim_offer_api_stars_claims__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Claim Offer Api Stars Claims  Key  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["stars"],"summary":"Make Claim","description":"Claim a platform you have left.","operationId":"make_claim_api_stars_claims__key__post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_stars__ClaimIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Make Claim Api Stars Claims  Key  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["stars"],"summary":"Drop Claim","description":"I went back. Honest, and it costs the stars.\n\nDeliberately available to the MEMBER, not only to staff: the only way an\nhonesty-based claim stays honest is if changing your mind is a button\nrather than a confession.","operationId":"drop_claim_api_stars_claims__key__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Drop Claim Api Stars Claims  Key  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stars/state":{"get":{"tags":["stars"],"summary":"State","description":"Is the gate armed? Public and cheap — every creator page reads it.","operationId":"state_api_stars_state_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_stars__StateOut"}}}}}},"put":{"tags":["stars"],"summary":"Set State","description":"Arm or disarm the gate. Co-admin and up.\n\nARMING THIS SHUTS A DOOR ON EVERY MEMBER BELOW THE THRESHOLD AT ONCE, so\nthe log line says how many that is. Run `python -m app.stars backfill`\nfirst and read that number before pressing it — \"1,006 members, 4 of whom\ncould still publish\" is a thing you want to know beforehand.","operationId":"set_state_api_stars_state_put","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_stars__StateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stars/revoke":{"post":{"tags":["stars"],"summary":"Take It Back","description":"Take a star back — for a claim that turns out to be false.\n\nRevocation is permanent by design: `stars.grant` refuses to re-issue a key\nthe member has ever held, so no sweep hands it straight back. A member who\ngenuinely left after a false start has to talk to a person, which is the\ncorrect amount of friction for undoing a fraud finding.","operationId":"take_it_back_api_stars_revoke_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_stars__RevokeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Take It Back Api Stars Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/overview":{"get":{"tags":["account"],"summary":"Overview","description":"Who you are and what is protecting you — or `signed_in: false`.\n\nDeliberately 200-for-anonymous rather than 401. This is the endpoint the\nglobal account chip calls on EVERY page in the hub, signed in or not; an\nerror status for the ordinary case of a logged-out visitor would put a red\nline in the console of all 43 modules and teach everyone to ignore it.","operationId":"overview_api_account_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Overview Api Account Overview Get"}}}}}}},"/api/account/quick-nav":{"get":{"tags":["account"],"summary":"Quick Nav","description":"Everything the editor needs: what is on, and what could be.\n\nSeparate from /overview on purpose. Overview is called on every page load\nof all 48 modules; this is called when a member opens the editor, which is\napproximately never. Bundling the catalogue into the hot call to save a\nround trip on the cold one is the wrong way round.","operationId":"quick_nav_api_account_quick_nav_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Quick Nav Api Account Quick Nav Get"}}}}}},"put":{"tags":["account"],"summary":"Set Quick Nav","description":"Save the member's wallet.\n\nAn unknown id is REFUSED rather than dropped. Nothing a member can do in\nthe pane produces one — the editor renders the catalogue this file served\nit — so an unknown id means the client and the server disagree about what\nexists, and silently swallowing that would hide the disagreement until\nsomebody wondered why a row never came back.","operationId":"set_quick_nav_api_account_quick_nav_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickNavIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Quick Nav Api Account Quick Nav Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["account"],"summary":"Clear Quick Nav","description":"Back to the defaults — by DELETING the row, not by writing the defaults\ninto it. A member who resets today should get whatever the defaults are\ntomorrow; a copy of today's defaults frozen in their row would quietly\nbecome a personal choice they never made.","operationId":"clear_quick_nav_api_account_quick_nav_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Clear Quick Nav Api Account Quick Nav Delete"}}}}}}},"/api/account/password":{"post":{"tags":["account"],"summary":"Set Password","description":"Set or change the password, and drop every other session.\n\nTwo cases, and the difference is not cosmetic. An account that HAS a\npassword must prove the old one — otherwise a borrowed unlocked laptop is a\npermanent account takeover. An account that has none (signed up with Google)\nis *adding* a second way in, and there is no old secret to ask for; the\nsession cookie is the proof, which is the same standard Google itself\napplies when you add a password.","operationId":"set_password_api_account_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Password Api Account Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/sessions":{"get":{"tags":["account"],"summary":"List Sessions","description":"Every live sign-in on this account, newest first, with yours marked.","operationId":"list_sessions_api_account_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Sessions Api Account Sessions Get"}}}}}}},"/api/account/sessions/{session_id}":{"delete":{"tags":["account"],"summary":"Revoke Session","description":"Sign one device out.\n\nScoped to the caller's OWN sessions by the WHERE clause, not by trusting\nthe id: session ids are sequential integers, so an unscoped lookup would\nlet anybody sign out any member on the platform by counting.","operationId":"revoke_session_api_account_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Revoke Session Api Account Sessions  Session Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/sessions/revoke-others":{"post":{"tags":["account"],"summary":"Revoke Others","description":"Sign out everywhere but here — the button for a lost phone.","operationId":"revoke_others_api_account_sessions_revoke_others_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Revoke Others Api Account Sessions Revoke Others Post"}}}}}}},"/api/account/export":{"get":{"tags":["account"],"summary":"Export Account","description":"Download everything, as one JSON file.\n\nA single file rather than Meta's zip-of-folders because the whole point is\nthat a person can open it and read it. Served as an attachment so the\nbrowser saves it instead of rendering a wall of JSON.","operationId":"export_account_api_account_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/delete/preview":{"get":{"tags":["account"],"summary":"Delete Preview","operationId":"delete_preview_api_account_delete_preview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Preview Api Account Delete Preview Get"}}}}}}},"/api/account/delete":{"post":{"tags":["account"],"summary":"Delete Account","description":"Delete the account for real.\n\nTwo gates, doing different jobs. Typing the email is the one thing a stray\nclick or a mis-aimed curl cannot produce. The password is the one thing a\nborrowed unlocked laptop does not know — and it is required whenever the\naccount has one, which is why a Google-only member is asked only for the\nemail.","operationId":"delete_account_api_account_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/avatar":{"post":{"tags":["account"],"summary":"Upload Avatar","description":"Replace your picture.\n\nOrdering is deliberate and is the same ordering InstaG arrived at: write the\nnew file, point the row at it, and only THEN delete the old one. Deleting\nfirst would leave a broken image on every comment the member ever wrote for\nas long as the render took — and forever, if the render failed.","operationId":"upload_avatar_api_account_avatar_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_avatar_api_account_avatar_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Avatar Api Account Avatar Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["account"],"summary":"Remove Avatar","description":"Go back to the generated initials tile.\n\nAlso the way to drop a Google profile picture: the column is cleared either\nway, and the unlink simply finds nothing of ours to remove.","operationId":"remove_avatar_api_account_avatar_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Remove Avatar Api Account Avatar Delete"}}}}}}},"/api/payments/channels":{"get":{"tags":["payments"],"summary":"Public Channels","description":"Every way somebody can actually pay right now.\n\nStorefronts render this verbatim. A channel that is configured but not\nusable never appears here — absent beats a dead button.","operationId":"public_channels_api_payments_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Public Channels Api Payments Channels Get"}}}}}}},"/api/payments/admin/channels":{"get":{"tags":["payments"],"summary":"Admin Channels","description":"The full roster: what exists, what is set, what is wrong with it.","operationId":"admin_channels_api_payments_admin_channels_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Channels Api Payments Admin Channels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/admin/channels/{channel_id}":{"put":{"tags":["payments"],"summary":"Set Channel","description":"Set one channel's credential and whether it is published.\n\nRefuses to publish something a buyer could not act on: the check that gates\nrendering is the same one that gates saving, so the console cannot leave the\nswitchboard in a state the storefronts will silently ignore. Saving an empty\nvalue is how a channel is turned back off.","operationId":"set_channel_api_payments_admin_channels__channel_id__put","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Channel Api Payments Admin Channels  Channel Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/health":{"get":{"tags":["hoodmail"],"summary":"Health","operationId":"health_api_hoodmail_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Health Api Hoodmail Health Get"}}}}}}},"/api/hoodmail/unread":{"get":{"tags":["hoodmail"],"summary":"Unread","description":"The badge on the account chip.\n\n**200 for a signed-out visitor, never 401.** This is fetched on every page\nof every module by `static/hub/account.js`; answering 401 would put a red\nline in the console of the whole site for the ordinary case of nobody\nbeing signed in. `/api/account/overview` made the same call for the same\nreason. Everything else in this file requires a session.","operationId":"unread_api_hoodmail_unread_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Unread Api Hoodmail Unread Get"}}}}}}},"/api/hoodmail/me":{"get":{"tags":["hoodmail"],"summary":"Me","description":"This member's mailbox, or what they need to open one.","operationId":"me_api_hoodmail_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Me Api Hoodmail Me Get"}}}}}}},"/api/hoodmail/addresses/check":{"get":{"tags":["hoodmail"],"summary":"Address Check","description":"Is this address free, and is it even allowed? One answer, both questions\n— a picker that says \"taken\" for a reserved word teaches nothing.","operationId":"address_check_api_hoodmail_addresses_check_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"type":"string","default":"","title":"Address"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Address Check Api Hoodmail Addresses Check Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/box":{"post":{"tags":["hoodmail"],"summary":"Claim Box","operationId":"claim_box_api_hoodmail_box_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodmail__ClaimIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Claim Box Api Hoodmail Box Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["hoodmail"],"summary":"Edit Box","description":"Settings. Note what is NOT here: the address. See `hoodmail.open_box`.","operationId":"edit_box_api_hoodmail_box_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoxIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Edit Box Api Hoodmail Box Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/directory":{"get":{"tags":["hoodmail"],"summary":"Directory","description":"Members you can look up by name — the phone book, nothing else.\n\n**Only members who switched `listed_white` on appear here**, which is the\nsame bargain the printed book struck and the same one `routes_messages`\nenforces: being findable is a thing somebody chose. An unlisted member is\nstill perfectly reachable by anyone they gave their address to — the\naddress is the permission — they simply are not in a list strangers can\nscroll.","operationId":"directory_api_hoodmail_directory_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":80,"default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Directory Api Hoodmail Directory Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/messages":{"get":{"tags":["hoodmail"],"summary":"List Messages","description":"One folder, newest first, with search and label filters folded in.","operationId":"list_messages_api_hoodmail_messages_get","parameters":[{"name":"folder","in":"query","required":false,"schema":{"type":"string","default":"inbox","title":"Folder"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Q"}},{"name":"label","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Label"}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","default":"","title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":0,"default":0,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["hoodmail"],"summary":"Send Message","description":"Send a letter. The one write path; drafts and attachments feed into it.\n\nDelivery is PER RECIPIENT, the way mail has always worked: a full mailbox\non one address does not hold up the other four. What does not happen is a\nsilent partial success — every refusal comes back named, and the sender's\ncopy keeps the note so the answer to \"did that go?\" survives a refresh.","operationId":"send_message_api_hoodmail_messages_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodmail__SendIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Send Message Api Hoodmail Messages Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/messages/{message_id}":{"get":{"tags":["hoodmail"],"summary":"Read Message","operationId":"read_message_api_hoodmail_messages__message_id__get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}},{"name":"mark_read","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Mark Read"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["hoodmail"],"summary":"Set Flags","operationId":"set_flags_api_hoodmail_messages__message_id__patch","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Flags Api Hoodmail Messages  Message Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["hoodmail"],"summary":"Delete Forever","operationId":"delete_forever_api_hoodmail_messages__message_id__delete","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Forever Api Hoodmail Messages  Message Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/threads/{thread_id}":{"get":{"tags":["hoodmail"],"summary":"Read Thread","description":"Every copy this box holds of one conversation, oldest first.\n\nScoped to the box, so a thread shows what this member was actually part\nof — not the messages in it that went to somebody else.","operationId":"read_thread_api_hoodmail_threads__thread_id__get","parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"integer","title":"Thread Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Read Thread Api Hoodmail Threads  Thread Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/bulk":{"post":{"tags":["hoodmail"],"summary":"Bulk","description":"Do one thing to several messages — what a mail client's checkboxes are\nfor. Unknown ids are skipped rather than failing the batch: a stale tab\nselecting something already deleted should not refuse the other nine.","operationId":"bulk_api_hoodmail_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodmail__BulkIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Bulk Api Hoodmail Bulk Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/trash/empty":{"post":{"tags":["hoodmail"],"summary":"Empty Trash","description":"The one way space comes back — which is why the quota bar links here.","operationId":"empty_trash_api_hoodmail_trash_empty_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Empty Trash Api Hoodmail Trash Empty Post"}}}}}}},"/api/hoodmail/labels":{"get":{"tags":["hoodmail"],"summary":"List Labels","operationId":"list_labels_api_hoodmail_labels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Labels Api Hoodmail Labels Get"}}}}}},"post":{"tags":["hoodmail"],"summary":"Create Label","operationId":"create_label_api_hoodmail_labels_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Label Api Hoodmail Labels Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/labels/{label_id}":{"patch":{"tags":["hoodmail"],"summary":"Edit Label","operationId":"edit_label_api_hoodmail_labels__label_id__patch","parameters":[{"name":"label_id","in":"path","required":true,"schema":{"type":"integer","title":"Label Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Edit Label Api Hoodmail Labels  Label Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["hoodmail"],"summary":"Delete Label","operationId":"delete_label_api_hoodmail_labels__label_id__delete","parameters":[{"name":"label_id","in":"path","required":true,"schema":{"type":"integer","title":"Label Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Label Api Hoodmail Labels  Label Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/messages/{message_id}/labels":{"post":{"tags":["hoodmail"],"summary":"Apply Label","operationId":"apply_label_api_hoodmail_messages__message_id__labels_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyLabelIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Apply Label Api Hoodmail Messages  Message Id  Labels Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/blocks":{"get":{"tags":["hoodmail"],"summary":"List Blocks","operationId":"list_blocks_api_hoodmail_blocks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Blocks Api Hoodmail Blocks Get"}}}}}},"post":{"tags":["hoodmail"],"summary":"Add Block","description":"Mail from here goes to Spam from now on — it is not turned away.\n\nA silent drop is how a blocked contractor's quote disappears and nobody can\nprove it ever arrived. Blocking yourself is refused because it would be a\ntrap with no error message.","operationId":"add_block_api_hoodmail_blocks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Add Block Api Hoodmail Blocks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/blocks/{block_id}":{"delete":{"tags":["hoodmail"],"summary":"Remove Block","operationId":"remove_block_api_hoodmail_blocks__block_id__delete","parameters":[{"name":"block_id","in":"path","required":true,"schema":{"type":"integer","title":"Block Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Remove Block Api Hoodmail Blocks  Block Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/drafts":{"post":{"tags":["hoodmail"],"summary":"Create Draft","operationId":"create_draft_api_hoodmail_drafts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Draft Api Hoodmail Drafts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/drafts/{draft_id}":{"patch":{"tags":["hoodmail"],"summary":"Save Draft","operationId":"save_draft_api_hoodmail_drafts__draft_id__patch","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Save Draft Api Hoodmail Drafts  Draft Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["hoodmail"],"summary":"Read Draft","operationId":"read_draft_api_hoodmail_drafts__draft_id__get","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Read Draft Api Hoodmail Drafts  Draft Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/drafts/{draft_id}/attachments":{"post":{"tags":["hoodmail"],"summary":"Upload Attachment","operationId":"upload_attachment_api_hoodmail_drafts__draft_id__attachments_post","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_attachment_api_hoodmail_drafts__draft_id__attachments_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Attachment Api Hoodmail Drafts  Draft Id  Attachments Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/drafts/{draft_id}/photostream":{"post":{"tags":["hoodmail"],"summary":"Attach Photostream","description":"Put one of your own InstaG posts in the letter. Free on every tier.","operationId":"attach_photostream_api_hoodmail_drafts__draft_id__photostream_post","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotostreamIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Attach Photostream Api Hoodmail Drafts  Draft Id  Photostream Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/photostream":{"get":{"tags":["hoodmail"],"summary":"My Photostream","description":"The sender's own recent posts, for the composer's picker.\n\nReads InstaG's tables directly rather than calling its API, because this\nis the author looking at their own posts — the visibility question\n`instag_guard` exists to answer does not arise.","operationId":"my_photostream_api_hoodmail_photostream_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My Photostream Api Hoodmail Photostream Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/drafts/{draft_id}/attachments/{attachment_id}":{"delete":{"tags":["hoodmail"],"summary":"Remove Attachment","operationId":"remove_attachment_api_hoodmail_drafts__draft_id__attachments__attachment_id__delete","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}},{"name":"attachment_id","in":"path","required":true,"schema":{"type":"integer","title":"Attachment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Remove Attachment Api Hoodmail Drafts  Draft Id  Attachments  Attachment Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/attachments/{attachment_id}":{"get":{"tags":["hoodmail"],"summary":"Download Attachment","description":"Served BY THE API, never off a public root.\n\nInstaG can put public photos behind Caddy because a public post is public.\nMail is not: every byte here goes through this handler so that \"who is\nholding a copy of this letter\" is asked on every single request, and a URL\nthat leaks buys nothing without the session cookie that goes with it.","operationId":"download_attachment_api_hoodmail_attachments__attachment_id__get","parameters":[{"name":"attachment_id","in":"path","required":true,"schema":{"type":"integer","title":"Attachment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/attachments/{attachment_id}/thumb":{"get":{"tags":["hoodmail"],"summary":"Attachment Thumb","operationId":"attachment_thumb_api_hoodmail_attachments__attachment_id__thumb_get","parameters":[{"name":"attachment_id","in":"path","required":true,"schema":{"type":"integer","title":"Attachment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/upgrade":{"get":{"tags":["hoodmail"],"summary":"Upgrade State","description":"Everything the upgrade page needs, in one call.\n\nIncluding the honest answer when no card processor is configured: the\nswitchboard's live channels, which is how somebody can pay TODAY.","operationId":"upgrade_state_api_hoodmail_upgrade_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upgrade State Api Hoodmail Upgrade Get"}}}}}}},"/api/hoodmail/upgrade/checkout":{"post":{"tags":["hoodmail"],"summary":"Upgrade Checkout","description":"One click from the price to somewhere money can actually be sent.\n\nWith Stripe configured this is a Checkout Session URL. Without it, this is\na reference and the live channels — which is not a worse experience so\nmuch as a slower one, and it is the truth about what the station can take\ntoday.","operationId":"upgrade_checkout_api_hoodmail_upgrade_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upgrade Checkout Api Hoodmail Upgrade Checkout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/upgrade/orders":{"get":{"tags":["hoodmail"],"summary":"My Orders","operationId":"my_orders_api_hoodmail_upgrade_orders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response My Orders Api Hoodmail Upgrade Orders Get"}}}}}}},"/api/hoodmail/admin/subscriptions":{"get":{"tags":["hoodmail"],"summary":"Admin Subscriptions","operationId":"admin_subscriptions_api_hoodmail_admin_subscriptions_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Subscriptions Api Hoodmail Admin Subscriptions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/admin/subscriptions/{reference}/mark-paid":{"post":{"tags":["hoodmail"],"summary":"Admin Mark Paid","description":"Settle a term somebody paid through a lane that cannot tell us itself.\n\nThe note is the transfer reference, and typing it in IS the audit trail —\nthe same rule the Bodega and the Book Store keep.","operationId":"admin_mark_paid_api_hoodmail_admin_subscriptions__reference__mark_paid_post","parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodmail__MarkPaidIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Mark Paid Api Hoodmail Admin Subscriptions  Reference  Mark Paid Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/admin/comp":{"post":{"tags":["hoodmail"],"summary":"Admin Comp","description":"Give somebody a Big Box for nothing.\n\nThis exists because of what the upgrade is FOR. The money is here to keep\nthe platform able to guarantee storage, not to decide who deserves a\nmailbox — so there has to be a lane for a member who cannot pay, and it\nhas to be one line rather than a favor somebody has to invent.","operationId":"admin_comp_api_hoodmail_admin_comp_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodmail__CompIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Comp Api Hoodmail Admin Comp Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/admin/boxes/{address}/recompute":{"post":{"tags":["hoodmail"],"summary":"Admin Recompute","description":"Re-derive a box's usage counter from the copies that actually exist.\n\nA counter with no way to be re-derived is a counter you cannot trust. This\nis that way; it reports the drift rather than hiding it.","operationId":"admin_recompute_api_hoodmail_admin_boxes__address__recompute_post","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Recompute Api Hoodmail Admin Boxes  Address  Recompute Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/admin/overview":{"get":{"tags":["hoodmail"],"summary":"Admin Overview","description":"What the mail system is costing and carrying.","operationId":"admin_overview_api_hoodmail_admin_overview_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Overview Api Hoodmail Admin Overview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/imports":{"get":{"tags":["hoodmail"],"summary":"List Imports","description":"Every account this member has brought in, and what is still on their\ncomputer.","operationId":"list_imports_api_hoodmail_imports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Imports Api Hoodmail Imports Get"}}}}}},"post":{"tags":["hoodmail"],"summary":"Start Import","operationId":"start_import_api_hoodmail_imports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportStartIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Start Import Api Hoodmail Imports Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/imports/{import_id}/messages":{"post":{"tags":["hoodmail"],"summary":"Import Messages","description":"One batch of parsed messages.\n\nAnswers 200 with `full: true` rather than an error when the mailbox runs\nout of room mid-batch: a partly-imported account is a real state the member\ncan act on (buy room, resume — `source_ref` makes the resume skip what\nalready landed), and calling it a failure would throw away the thousands of\nletters that did land.","operationId":"import_messages_api_hoodmail_imports__import_id__messages_post","parameters":[{"name":"import_id","in":"path","required":true,"schema":{"type":"integer","title":"Import Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportBatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Import Messages Api Hoodmail Imports  Import Id  Messages Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/imports/{import_id}/finish":{"post":{"tags":["hoodmail"],"summary":"Finish Import","operationId":"finish_import_api_hoodmail_imports__import_id__finish_post","parameters":[{"name":"import_id","in":"path","required":true,"schema":{"type":"integer","title":"Import Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportFinishIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Finish Import Api Hoodmail Imports  Import Id  Finish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/imports/{import_id}/held":{"get":{"tags":["hoodmail"],"summary":"Import Held","description":"What was left on the member's computer, with the Message-ID and part\nnumber the browser needs to find each one again in the same export.","operationId":"import_held_api_hoodmail_imports__import_id__held_get","parameters":[{"name":"import_id","in":"path","required":true,"schema":{"type":"integer","title":"Import Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Import Held Api Hoodmail Imports  Import Id  Held Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/imports/{import_id}/attachments/{attachment_id}":{"post":{"tags":["hoodmail"],"summary":"Restore Attachment","description":"Fill in one held attachment from the member's own copy of the export.\n\nThe Big Box gate is the same one the composer uses, and it is checked\nbefore a byte is read: this is the promise the import made — \"buy room and\nyou can have these back\" — being kept, not a different feature.","operationId":"restore_attachment_api_hoodmail_imports__import_id__attachments__attachment_id__post","parameters":[{"name":"import_id","in":"path","required":true,"schema":{"type":"integer","title":"Import Id"}},{"name":"attachment_id","in":"path","required":true,"schema":{"type":"integer","title":"Attachment Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_restore_attachment_api_hoodmail_imports__import_id__attachments__attachment_id__post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Restore Attachment Api Hoodmail Imports  Import Id  Attachments  Attachment Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/imports/{import_id}":{"delete":{"tags":["hoodmail"],"summary":"Remove Import","description":"Take a whole account back out, and give the space back.\n\nAn import is the one operation here that can put twenty thousand rows in a\nmailbox on a misunderstanding. Being able to undo it is what makes trying\nit safe.","operationId":"remove_import_api_hoodmail_imports__import_id__delete","parameters":[{"name":"import_id","in":"path","required":true,"schema":{"type":"integer","title":"Import Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Remove Import Api Hoodmail Imports  Import Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/external-accounts":{"get":{"tags":["hoodmail"],"summary":"List External Accounts","operationId":"list_external_accounts_api_hoodmail_external_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List External Accounts Api Hoodmail External Accounts Get"}}}}}},"post":{"tags":["hoodmail"],"summary":"Add External Account","operationId":"add_external_account_api_hoodmail_external_accounts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalAccountIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Add External Account Api Hoodmail External Accounts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/external-accounts/{account_id}/test":{"post":{"tags":["hoodmail"],"summary":"Test External Account","description":"One fetch cycle, run right now, so a bad password shows up here rather\nthan silently in the next poll.","operationId":"test_external_account_api_hoodmail_external_accounts__account_id__test_post","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"integer","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Test External Account Api Hoodmail External Accounts  Account Id  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/external-accounts/{account_id}":{"patch":{"tags":["hoodmail"],"summary":"Update External Account","description":"Just `enabled` and `delete_after_fetch` — the two things worth\nflipping without re-entering a password. Anything else is delete-and-\nre-add, which is also the only way to change a wrong password.","operationId":"update_external_account_api_hoodmail_external_accounts__account_id__patch","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"integer","title":"Account Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update External Account Api Hoodmail External Accounts  Account Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["hoodmail"],"summary":"Remove External Account","operationId":"remove_external_account_api_hoodmail_external_accounts__account_id__delete","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"integer","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Remove External Account Api Hoodmail External Accounts  Account Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/admin/outbound":{"get":{"tags":["hoodmail"],"summary":"Admin Outbound","description":"Is the door open, and what is behind it?","operationId":"admin_outbound_api_hoodmail_admin_outbound_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Outbound Api Hoodmail Admin Outbound Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/admin/outbound/drain":{"post":{"tags":["hoodmail"],"summary":"Admin Outbound Drain","description":"Drain the queue now rather than waiting for the worker's next poll.\n\nFor proving a newly-pasted relay credential works without watching logs\nfor thirty seconds. The worker keeps running either way — this takes the\nsame code path, so a pass here IS a pass there.","operationId":"admin_outbound_drain_api_hoodmail_admin_outbound_drain_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Outbound Drain Api Hoodmail Admin Outbound Drain Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodmail/branch/{market_slug}":{"get":{"tags":["hoodmail"],"summary":"Branch","description":"The post office counter, seen from one town.","operationId":"branch_api_hoodmail_branch__market_slug__get","parameters":[{"name":"market_slug","in":"path","required":true,"schema":{"type":"string","title":"Market Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Branch Api Hoodmail Branch  Market Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mastering/profiles":{"get":{"tags":["mastering"],"summary":"Profiles","description":"What the desk can do, and the spec it delivers to.","operationId":"profiles_api_mastering_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Profiles Api Mastering Profiles Get"}}}}}}},"/api/mastering/jobs":{"post":{"tags":["mastering"],"summary":"Create Job","description":"Queue a recording for mastering.\n\nThe upload is streamed to the archive volume and the SOURCE IS KEPT. A\nmaster can always be re-cut with different settings, and deleting the only\ncopy of a public recording to reclaim disk would be indefensible — there is\n127 GB free and 5.59 TB of transfer, so there is no reason to.","operationId":"create_job_api_mastering_jobs_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_job_api_mastering_jobs_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Job Api Mastering Jobs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["mastering"],"summary":"List Jobs","operationId":"list_jobs_api_mastering_jobs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Jobs Api Mastering Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mastering/jobs/{ref}":{"get":{"tags":["mastering"],"summary":"Job Status","operationId":"job_status_api_mastering_jobs__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Job Status Api Mastering Jobs  Ref  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mastering/jobs/{ref}/file":{"get":{"tags":["mastering"],"summary":"Download","operationId":"download_api_mastering_jobs__ref__file_get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mastering/jobs/{ref}/retry":{"post":{"tags":["mastering"],"summary":"Retry","description":"Re-queue a failed job. The source was kept, so this costs nothing.","operationId":"retry_api_mastering_jobs__ref__retry_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Retry Api Mastering Jobs  Ref  Retry Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/studio/access":{"get":{"tags":["studio"],"summary":"Access","description":"The door. Safe to call signed out — it answers rather than refusing.\n\nThe console asks this before drawing itself, so the answer has to explain\na refusal instead of just being one.","operationId":"access_api_studio_access_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_studio__AccessOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/studio/agents":{"get":{"tags":["studio"],"summary":"Agents","description":"Who is posted to the studio right now. Admin-only, on REAL rank.","operationId":"agents_api_studio_agents_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentOut"},"title":"Response Agents Api Studio Agents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/studio/ping":{"get":{"tags":["studio"],"summary":"Ping","description":"Cheapest possible proof the grant is doing its job.\n\nAnyone the door would admit gets 200 here; everyone else gets 401/403\nfrom the gate itself.","operationId":"ping_api_studio_ping_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/control-room/access":{"get":{"tags":["control-room"],"summary":"Access","description":"The door. Safe to call signed out — it answers rather than refusing.","operationId":"access_api_control_room_access_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_controlroom__AccessOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/control-room/console-key":{"get":{"tags":["control-room"],"summary":"Console Key","description":"Hand the console key to somebody the door already admitted.\n\nSame idea as `/api/news/console-key`: the operator has already proved who\nthey are by signing in, so making them find and type a key again buys\nnothing and costs time in a room where time is the whole point.\n\nThe key is only meaningful when the room's server is bound to something\nother than loopback; on loopback, being at the desk is the gate.","operationId":"console_key_api_control_room_console_key_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/control-room/operators":{"get":{"tags":["control-room"],"summary":"Operators","description":"Who is posted to the control room. Admin-only, on REAL rank.","operationId":"operators_api_control_room_operators_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OperatorOut"},"title":"Response Operators Api Control Room Operators Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/control-room/ping":{"get":{"tags":["control-room"],"summary":"Ping","description":"Cheapest possible proof the grant is doing its job.","operationId":"ping_api_control_room_ping_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/admin/meetings/{meeting_id}/minutes":{"post":{"tags":["redline"],"summary":"Upload Minutes","description":"Store the city's official minutes for a meeting.\n\nRe-uploading is not an error, it is the point: if the bytes differ from the\ncopy we already hold, the previous text is preserved as a revision and the\nchange is recorded. That history is what makes a later edit provable.","operationId":"upload_minutes_api_redline_admin_meetings__meeting_id__minutes_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}},{"name":"remote_url","in":"query","required":false,"schema":{"type":"string","description":"Where this copy came from — provenance","default":"","title":"Remote Url"},"description":"Where this copy came from — provenance"},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_minutes_api_redline_admin_meetings__meeting_id__minutes_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/admin/meetings/{meeting_id}/cues":{"post":{"tags":["redline"],"summary":"Upload Cues","description":"Store the caption timing index for a meeting's recording.\n\nThe stored transcript is flattened prose with the timings stripped. Keeping\na separate cue index is what turns a finding into \"watch it at 1:42:07\"\ninstead of \"somewhere in the third hour\".","operationId":"upload_cues_api_redline_admin_meetings__meeting_id__cues_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_cues_api_redline_admin_meetings__meeting_id__cues_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/admin/meetings/{meeting_id}/audit":{"post":{"tags":["redline"],"summary":"Audit Meeting","operationId":"audit_meeting_api_redline_admin_meetings__meeting_id__audit_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/admin/markets/{slug}/audit":{"post":{"tags":["redline"],"summary":"Audit Market","description":"Audit every meeting in a market that has both records on file.","operationId":"audit_market_api_redline_admin_markets__slug__audit_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/markets/{slug}/audits":{"get":{"tags":["redline"],"summary":"List Audits","description":"Audited meetings, worst-scoring first by default — the reading order that\nputs the meetings most worth a human's time at the top.","operationId":"list_audits_api_redline_markets__slug__audits_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","pattern":"^(worst|recent)$","default":"worst","title":"Order"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuditListItem"},"title":"Response List Audits Api Redline Markets  Slug  Audits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/meetings/{meeting_id}":{"get":{"tags":["redline"],"summary":"Get Audit","description":"One meeting's audit.\n\nDefaults to serious findings only. The full set stays in the database and is\none query parameter away — but a page that leads with a dozen \"the minutes\nsummarised this\" notes buries the handful that actually matter.","operationId":"get_audit_api_redline_meetings__meeting_id__get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}},{"name":"severity","in":"query","required":false,"schema":{"type":"string","pattern":"^(high|all)$","description":"'high' (default) shows only the differences that cannot be explained by ordinary summarising","default":"high","title":"Severity"},"description":"'high' (default) shows only the differences that cannot be explained by ordinary summarising"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/meetings/{meeting_id}/minutes.txt":{"get":{"tags":["redline"],"summary":"Minutes Text","description":"The official minutes as text — the document a finding is quoting from.","operationId":"minutes_text_api_redline_meetings__meeting_id__minutes_txt_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/markets/{slug}/revisions":{"get":{"tags":["redline"],"summary":"List Revisions","description":"Official documents whose published bytes changed after we first saw them.","operationId":"list_revisions_api_redline_markets__slug__revisions_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RevisionOut"},"title":"Response List Revisions Api Redline Markets  Slug  Revisions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/markets/{slug}/stats":{"get":{"tags":["redline"],"summary":"Market Stats","operationId":"market_stats_api_redline_markets__slug__stats_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/meetings/{meeting_id}/corrections":{"post":{"tags":["redline"],"summary":"File Correction","description":"File what was actually said. Held for review; never auto-published.\n\nA machine can only say two documents differ. Someone who was in the room\ncan say which one is right, and this is where that goes on the record.","operationId":"file_correction_api_redline_meetings__meeting_id__corrections_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_redline__CorrectionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["redline"],"summary":"List Corrections","description":"Accepted corrections for a meeting — the community's own record.","operationId":"list_corrections_api_redline_meetings__meeting_id__corrections_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CorrectionOut"},"title":"Response List Corrections Api Redline Meetings  Meeting Id  Corrections Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/admin/findings/{finding_id}/review":{"post":{"tags":["redline"],"summary":"Review Finding","description":"Record a human's verdict on a finding. The engine never sets this.","operationId":"review_finding_api_redline_admin_findings__finding_id__review_post","parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","title":"Finding Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_redline__ReviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/admin/corrections/{correction_id}/review":{"post":{"tags":["redline"],"summary":"Review Correction","operationId":"review_correction_api_redline_admin_corrections__correction_id__review_post","parameters":[{"name":"correction_id","in":"path","required":true,"schema":{"type":"integer","title":"Correction Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionReviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/admin/corrections":{"get":{"tags":["redline"],"summary":"Pending Corrections","operationId":"pending_corrections_api_redline_admin_corrections_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(pending|accepted|rejected)$","default":"pending","title":"Status"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/meetings/{meeting_id}/claim":{"post":{"tags":["redline"],"summary":"Claim Meeting","description":"Claim a meeting to cover — one shift on the record.\n\nThe start of the jobs programme: a member takes responsibility for one\nmeeting, files a clean record afterwards, and the hours stand publicly.","operationId":"claim_meeting_api_redline_meetings__meeting_id__claim_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/markets/{slug}/bureau":{"get":{"tags":["redline"],"summary":"Bureau Board","description":"Where the record is thinnest — the assignment board for the records corps.\n\nRanked by what is actually missing rather than by date: a meeting with no\nrecording on file at all is a worse hole in the public record than one whose\nminutes merely summarise heavily, and it is the one worth sending a person to.","operationId":"bureau_board_api_redline_markets__slug__bureau_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redline/markets/{slug}/assignments":{"get":{"tags":["redline"],"summary":"List Assignments","description":"Who is covering what — the public account of the programme's work.","operationId":"list_assignments_api_redline_markets__slug__assignments_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobilizer/overview":{"get":{"tags":["mobilizer"],"summary":"Overview","operationId":"overview_api_mobilizer_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Overview"}}}}}}},"/api/mobilizer/campaigns":{"get":{"tags":["mobilizer"],"summary":"List Campaigns","operationId":"list_campaigns_api_mobilizer_campaigns_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"active","title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"momentum","title":"Sort"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":12,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mobilizer"],"summary":"Create Campaign","operationId":"create_campaign_api_mobilizer_campaigns_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobilizer/campaigns/{slug}":{"get":{"tags":["mobilizer"],"summary":"Campaign Detail","operationId":"campaign_detail_api_mobilizer_campaigns__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["mobilizer"],"summary":"Edit Campaign","operationId":"edit_campaign_api_mobilizer_campaigns__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mobilizer"],"summary":"Delete Campaign","operationId":"delete_campaign_api_mobilizer_campaigns__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobilizer/campaigns/{slug}/support":{"post":{"tags":["mobilizer"],"summary":"Support Campaign","operationId":"support_campaign_api_mobilizer_campaigns__slug__support_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mobilizer"],"summary":"Withdraw Support","operationId":"withdraw_support_api_mobilizer_campaigns__slug__support_delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobilizer/campaigns/{slug}/updates":{"post":{"tags":["mobilizer"],"summary":"Post Update","operationId":"post_update_api_mobilizer_campaigns__slug__updates_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobilizer/campaigns/{slug}/roster":{"get":{"tags":["mobilizer"],"summary":"Roster","description":"Organizer view of every supporter — display name, note, ZIP, RSVP.\nDeliberately NO emails: the tally proves the numbers; contact stays inside\nthe platform (post an update instead of scraping a mailing list).","operationId":"roster_api_mobilizer_campaigns__slug__roster_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RosterEntry"},"title":"Response Roster Api Mobilizer Campaigns  Slug  Roster Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobilizer/campaigns/{slug}/calendar.ics":{"get":{"tags":["mobilizer"],"summary":"Campaign Ics","description":"Minimal RFC 5545 event so 'add to calendar' works from any phone.","operationId":"campaign_ics_api_mobilizer_campaigns__slug__calendar_ics_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobilizer/mine":{"get":{"tags":["mobilizer"],"summary":"Mine","operationId":"mine_api_mobilizer_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinePage"}}}}}}},"/api/mobilizer/templates":{"get":{"tags":["mobilizer"],"summary":"Templates","operationId":"templates_api_mobilizer_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateShelf"}}}}}},"post":{"tags":["mobilizer"],"summary":"Save Template","operationId":"save_template_api_mobilizer_templates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mobilizer/templates/{template_id}":{"delete":{"tags":["mobilizer"],"summary":"Delete Template","operationId":"delete_template_api_mobilizer_templates__template_id__delete","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watershed":{"get":{"tags":["watershed"],"summary":"Watershed State","operationId":"watershed_state_api_watershed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Watershed State Api Watershed Get"}}}}}}},"/api/watershed/waterline":{"get":{"tags":["watershed"],"summary":"Waterline State","operationId":"waterline_state_api_watershed_waterline_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Waterline State Api Watershed Waterline Get"}}}}}}},"/api/watershed/proposals":{"get":{"tags":["watershed"],"summary":"List Proposals","operationId":"list_proposals_api_watershed_proposals_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response List Proposals Api Watershed Proposals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["watershed"],"summary":"Create Proposal","description":"Any member may propose (§6.2). A DRAFT may be saved without a water\nfinding — the gate is on opening the vote, so an author can still be\nwriting. It is checked again, hard, at /open-vote.","operationId":"create_proposal_api_watershed_proposals_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposalIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Proposal Api Watershed Proposals Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watershed/proposals/{slug}":{"get":{"tags":["watershed"],"summary":"Get Proposal","operationId":"get_proposal_api_watershed_proposals__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Proposal Api Watershed Proposals  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watershed/proposals/{slug}/open":{"post":{"tags":["watershed"],"summary":"Open Deliberation","description":"Start the 30-day clock. §0.4 is enforced HERE as well as at /open-vote,\nso a proposal cannot even enter deliberation without answering the water\nquestion — the point is that the question is asked early enough to change\nthe proposal, not as a formality on the way to a vote.","operationId":"open_deliberation_api_watershed_proposals__slug__open_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Open Deliberation Api Watershed Proposals  Slug  Open Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watershed/proposals/{slug}/open-vote":{"post":{"tags":["watershed"],"summary":"Open Vote","description":"§6.3. There is no `force` parameter and there must never be one.\n\nThe window cannot be shortened by a curator, the board, unanimous consent,\nor the founder. A genuine emergency is §2.6 — immediate action that expires\nby itself in 14 days. An emergency gets you action; it never gets you a\npermanent rule.","operationId":"open_vote_api_watershed_proposals__slug__open_vote_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Open Vote Api Watershed Proposals  Slug  Open Vote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watershed/proposals/{slug}/vote":{"post":{"tags":["watershed"],"summary":"Cast Vote","description":"One member, one vote (§1.1). No delegation, ever (§1.2) — there is no\n`on_behalf_of` and adding one would be an amendment, not a feature.","operationId":"cast_vote_api_watershed_proposals__slug__vote_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Cast Vote Api Watershed Proposals  Slug  Vote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watershed/proposals/{slug}/roll":{"get":{"tags":["watershed"],"summary":"Roll Call","description":"§3.4 / §5.2 — who voted, which way, and why. Published permanently.\n\nDisplay name only. No email leaves this API, here or anywhere else, which\nis the same rule the Mobilizer follows and the one the Bill of Rights says\nto check against the schema.","operationId":"roll_call_api_watershed_proposals__slug__roll_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response Roll Call Api Watershed Proposals  Slug  Roll Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watershed/juries":{"post":{"tags":["watershed"],"summary":"Draw Jury","description":"Draw seven by lot (§4.1), from a seed that is published (§4.3).","operationId":"draw_jury_api_watershed_juries_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JuryIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Draw Jury Api Watershed Juries Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watershed/record":{"get":{"tags":["watershed"],"summary":"Read Record","operationId":"read_record_api_watershed_record_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response Read Record Api Watershed Record Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watershed/override":{"post":{"tags":["watershed"],"summary":"Owner Override","description":"The reserve power, and the mechanism that takes it away.\n\nBelow the Waterline this succeeds AND is written to the record — §6.5\npermits it there and requires the log. At or above the Waterline it returns\n403, because the handover is mechanical rather than a promise anyone has to\nkeep on schedule.\n\nThis endpoint exists mainly so that the transition is a real, testable code\npath instead of a sentence in a document.","operationId":"owner_override_api_watershed_override_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverrideIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Owner Override Api Watershed Override Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tv/status":{"get":{"tags":["tv"],"summary":"Tv Status","description":"Everything the landing page needs in one call: is the channel live, and\nhow many tapes are on the shelf (per market).","operationId":"tv_status_api_tv_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Tv Status Api Tv Status Get"}}}}}}},"/api/tv/tapes":{"get":{"tags":["tv"],"summary":"Tv Tapes","description":"The shelf: only meetings whose recording we host ourselves, so every row\nthe TV shows is a row the TV can actually play.","operationId":"tv_tapes_api_tv_tapes_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Market slug filter","title":"Market"},"description":"Market slug filter"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search titles and transcript text","title":"Q"},"description":"Search titles and transcript text"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Tv Tapes Api Tv Tapes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tv/tape/{meeting_id}":{"get":{"tags":["tv"],"summary":"Tv Tape","description":"One tape, with its bonus materials and transcript state. 404s for a\nmeeting we hold no playable copy of — the TV never offers a dead play.","operationId":"tv_tape_api_tv_tape__meeting_id__get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Tv Tape Api Tv Tape  Meeting Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/health":{"get":{"tags":["instag"],"summary":"Health","description":"Liveness for this desk specifically.\n\nWorth having its own route because a 200 from the hub proves nothing: an\nunrouted path 307s to the landing page, which also returns 200. Pair any\ncheck of this with a path that cannot exist.","operationId":"health_api_instag_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthOut"}}}}}}},"/api/instag/config":{"get":{"tags":["instag"],"summary":"Config","operationId":"config_api_instag_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigOut"}}}}}}},"/api/instag/feed":{"get":{"tags":["instag"],"summary":"Feed","operationId":"feed_api_instag_feed_get","parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/markets/{slug}/feed":{"get":{"tags":["instag"],"summary":"Market Feed","description":"One place's posts. The public front door — this is what a logged-out\nvisitor sees, and what a new member sees before following anybody.","operationId":"market_feed_api_instag_markets__slug__feed_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/me":{"get":{"tags":["instag"],"summary":"Me","description":"Your own profile, created on the spot if this is your first visit.","operationId":"me_api_instag_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileOut"}}}}}},"patch":{"tags":["instag"],"summary":"Edit Me","operationId":"edit_me_api_instag_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfilePatch"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/me/avatar":{"post":{"tags":["instag"],"summary":"Upload Avatar","description":"Replace your profile picture.\n\nWritten under a freshly generated name and the old file deleted, rather\nthan overwritten in place. Two reasons: the URL changes, so nobody is\nserved a year-old picture out of a cache that was told the path was\nimmutable; and a failed render can never leave the previous avatar\nhalf-rewritten.","operationId":"upload_avatar_api_instag_me_avatar_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_avatar_api_instag_me_avatar_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["instag"],"summary":"Remove Avatar","description":"Go back to the generated initials tile.","operationId":"remove_avatar_api_instag_me_avatar_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileOut"}}}}}}},"/api/instag/handles/check":{"get":{"tags":["instag"],"summary":"Handle Check","description":"Live availability for the settings form. Members only, so this is not a\npublic oracle for enumerating who exists.\n\nAvailability and the cooldown are reported separately on purpose: \"that\nname is free but you cannot move until the 14th\" and \"that name is taken\"\nare different problems, and collapsing them sends people hunting for a new\nhandle when the one they want was fine.","operationId":"handle_check_api_instag_handles_check_get","parameters":[{"name":"handle","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":30,"title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Handle Check Api Instag Handles Check Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/profiles/{handle}":{"get":{"tags":["instag"],"summary":"Profile","operationId":"profile_api_instag_profiles__handle__get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/profiles/{handle}/posts":{"get":{"tags":["instag"],"summary":"Profile Posts","description":"The grid. A private account's grid is empty to a non-follower rather\nthan forbidden — the clause does that on its own, no branch here.","operationId":"profile_posts_api_instag_profiles__handle__posts_get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/posts":{"post":{"tags":["instag"],"summary":"Create Post","description":"Post one photo, or several as a carousel.\n\nPhotos are rendered in-request because a photo that is not visible the\ninstant you post it feels broken. Video is accepted and left pending for\nthe transcoder — that arrives in phase 3; until then video uploads are\nrefused rather than silently stored.","operationId":"create_post_api_instag_posts_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_post_api_instag_posts_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/posts/{post_id}":{"get":{"tags":["instag"],"summary":"Get Post","operationId":"get_post_api_instag_posts__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["instag"],"summary":"Delete Post","operationId":"delete_post_api_instag_posts__post_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/posts/{post_id}/like":{"get":{"tags":["instag"],"summary":"Like State","operationId":"like_state_api_instag_posts__post_id__like_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LikeState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["instag"],"summary":"Toggle Like","operationId":"toggle_like_api_instag_posts__post_id__like_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LikeState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/follow/{handle}":{"post":{"tags":["instag"],"summary":"Follow","description":"Follow, or ask to. A public account accepts immediately; a private one\ngets a request it can approve.","operationId":"follow_api_instag_follow__handle__post","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FollowState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["instag"],"summary":"Unfollow","operationId":"unfollow_api_instag_follow__handle__delete","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FollowState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/feed-sources":{"get":{"tags":["instag"],"summary":"List Feed Sources","operationId":"list_feed_sources_api_instag_feed_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FeedSourceOut"},"type":"array","title":"Response List Feed Sources Api Instag Feed Sources Get"}}}}}},"post":{"tags":["instag"],"summary":"Add Feed Source","operationId":"add_feed_source_api_instag_feed_sources_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedSourceIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedSourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/feed-sources/{source_id}":{"delete":{"tags":["instag"],"summary":"Remove Feed Source","operationId":"remove_feed_source_api_instag_feed_sources__source_id__delete","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instag/reports":{"post":{"tags":["instag"],"summary":"File Report","description":"Anyone signed in can flag something; moderators work the queue.","operationId":"file_report_api_instag_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_instag__ReportIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response File Report Api Instag Reports Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ticker":{"get":{"tags":["ticker"],"summary":"Ticker","description":"One payload for the front-door ticker: local news plus conditions.\n\nPublic and unauthenticated on purpose — it is the shop window. Nothing here\nis per-viewer, which is exactly why one cache entry serves everybody.","operationId":"ticker_api_ticker_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Ticker Api Ticker Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ticker/settings":{"get":{"tags":["ticker"],"summary":"Read Settings","description":"What this scope says, what it actually resolves to, and the vocabulary.\n\nAll three, because a desk that shows only the stored patch cannot answer\n\"so what will Las Cruces do?\" — the question the person is actually asking\nwhen they open it.","operationId":"read_settings_api_ticker_settings_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Market"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Read Settings Api Ticker Settings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["ticker"],"summary":"Write Settings","operationId":"write_settings_api_ticker_settings_put","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Market"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Write Settings Api Ticker Settings Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks":{"get":{"tags":["bigstacks"],"summary":"Discover","description":"The public directory: listed, unsuspended publications only.\n\nA stack the moderators have not listed is absent from here and from\neverything built on here. It is still readable at its own URL — that is\nwhat \"unlisted\" means, and it is deliberately not a privacy control.","operationId":"discover_api_bigstacks_stacks_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Market"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","maxLength":2,"default":"","title":"State"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":24,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StackPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["bigstacks"],"summary":"Create Stack","description":"Anybody signed in may start a publication — D's ruling. It is born\nunlisted, so it is readable at its own address from the first minute and\njoins the public directory when a moderator lists it.\n\nAMENDED: \"anybody signed in\" now means anybody signed in who has cleared\nthe gold-star gate, which is D's later ruling and narrows this one. The\ncheck is INERT until an admin arms the gate (`stars.armed`), so on the day\nthis ships the sentence above is still true of everybody. Reading a stack\nis not gated and never will be — this is the door onto PUBLISHING.","operationId":"create_stack_api_bigstacks_stacks_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StackCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StackDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}":{"get":{"tags":["bigstacks"],"summary":"Stack Detail","operationId":"stack_detail_api_bigstacks_stacks__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StackDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["bigstacks"],"summary":"Edit Stack","operationId":"edit_stack_api_bigstacks_stacks__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StackEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StackDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/posts":{"get":{"tags":["bigstacks"],"summary":"Stack Archive","description":"The archive. Drafts and scheduled issues only for whoever runs it.","operationId":"stack_archive_api_bigstacks_stacks__slug__posts_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Per Page"}},{"name":"include_drafts","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Drafts"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["bigstacks"],"summary":"Create Post","operationId":"create_post_api_bigstacks_stacks__slug__posts_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostWrite"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostBrief"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/posts/{post_slug}":{"get":{"tags":["bigstacks"],"summary":"Read Post","description":"One issue.\n\n`blocks` is the whole body, or ONLY the free preview when `locked` is\ntrue. The locked remainder is not in this response under another name and\nis not hidden behind a CSS class — it never leaves the process. That is\nwhat makes the server-rendered page safe: the page cannot leak what it was\nnever sent.","operationId":"read_post_api_bigstacks_stacks__slug__posts__post_slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"post_slug","in":"path","required":true,"schema":{"type":"string","title":"Post Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bigstacks__PostDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/posts/{post_id}/body":{"get":{"tags":["bigstacks"],"summary":"Post Body","description":"The full body of a paywalled issue, for a reader who is entitled to it.\n\nThis exists because the web tree renders issues server-side, and a server\nrender carries no cookie — so the SSR fetch can only ever ask for the\npublic representation. The unlocked remainder is fetched from the browser,\nwhere the session cookie rides along and this check actually runs.","operationId":"post_body_api_bigstacks_posts__post_id__body_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/preview":{"post":{"tags":["bigstacks"],"summary":"Preview Markdown","description":"Render Markdown to blocks without saving anything — the editor's live\npreview. Signed-in only, because it is a writer's tool and an open\ntext-processing endpoint is a free CPU sink.","operationId":"preview_markdown_api_bigstacks_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/me/subscriptions":{"get":{"tags":["bigstacks"],"summary":"My Subscriptions","operationId":"my_subscriptions_api_bigstacks_me_subscriptions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SubscriptionOut"},"type":"array","title":"Response My Subscriptions Api Bigstacks Me Subscriptions Get"}}}}}}},"/api/bigstacks/me/reading":{"get":{"tags":["bigstacks"],"summary":"Reading Inbox","description":"Every issue from every publication you subscribe to, newest first.\n\nThat is the entire ranking rule, and it is the point: the thing this\nreplaces decides what you see, and this does not.","operationId":"reading_inbox_api_bigstacks_me_reading_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/subscribe":{"post":{"tags":["bigstacks"],"summary":"Subscribe","description":"Subscribe free. Paid tiers go through /pledge — this never grants one.","operationId":"subscribe_api_bigstacks_stacks__slug__subscribe_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["bigstacks"],"summary":"Unsubscribe","description":"Cancel, keeping the row. A lapsed reader who comes back keeps whatever\npaid time they had left, and the writer's history does not lie about who\nwas ever there.","operationId":"unsubscribe_api_bigstacks_stacks__slug__subscribe_delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/address":{"get":{"tags":["bigstacks"],"summary":"Suggest Address","description":"Turn a name into an address that is actually free.\n\nThe new-publication form pre-fills the address from whichever byline the\nwriter is using, which means it is derived from `users.display_name` — and\ndisplay_name is NOT unique. Two members called Derrick Pacheco would both\nbe handed `derrick-pacheco` and the second would learn about it only when\nthe create call came back 409. So the suffix is applied here, before they\nhave typed anything, and the form shows them what they will actually get.\n\n`available` is reported separately from `slug` so a writer who typed their\nown address is told it is taken rather than silently given a different one.","operationId":"suggest_address_api_bigstacks_address_get","parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/desk":{"get":{"tags":["bigstacks"],"summary":"Desk","description":"Everything the writer has, drafts and scheduled issues included.","operationId":"desk_api_bigstacks_stacks__slug__desk_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":30,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/posts/{post_id}":{"patch":{"tags":["bigstacks"],"summary":"Edit Post","operationId":"edit_post_api_bigstacks_posts__post_id__patch","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bigstacks__PostEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostBrief"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["bigstacks"],"summary":"Delete Post","operationId":"delete_post_api_bigstacks_posts__post_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/posts/{post_id}/source":{"get":{"tags":["bigstacks"],"summary":"Post Source","description":"The raw Markdown of an issue, for its own writer.\n\nOwner-only, and separate from every read path a reader can reach. The\neditor needs the SOURCE to reopen a draft; the public representation\ncarries rendered blocks and, for a paywalled issue, only the free ones —\nso without this the editor would either open empty and overwrite the piece\non save, or would have to be handed a body the paywall exists to withhold.","operationId":"post_source_api_bigstacks_posts__post_id__source_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/posts/{post_id}/publish":{"post":{"tags":["bigstacks"],"summary":"Publish Post","description":"Publish, or schedule by passing a future `published_at`.\n\nScheduling is the same write with a later timestamp — which is exactly why\nevery public query filters on the clock and not on this status alone.","operationId":"publish_post_api_bigstacks_posts__post_id__publish_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bigstacks__PublishIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostBrief"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/posts/{post_id}/unpublish":{"post":{"tags":["bigstacks"],"summary":"Unpublish Post","operationId":"unpublish_post_api_bigstacks_posts__post_id__unpublish_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostBrief"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/subscribers":{"get":{"tags":["bigstacks"],"summary":"Subscribers","description":"Who reads this, for the person who writes it. Addresses included —\nthe writer is the data controller for their own list — but nothing here\nis reachable by anybody else, and it is never part of a public response.","operationId":"subscribers_api_bigstacks_stacks__slug__subscribers_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/posts/{post_id}/comments":{"get":{"tags":["bigstacks"],"summary":"List Comments","operationId":"list_comments_api_bigstacks_posts__post_id__comments_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_bigstacks__CommentOut"},"title":"Response List Comments Api Bigstacks Posts  Post Id  Comments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["bigstacks"],"summary":"Add Comment","description":"Comment on an issue. Locked issues are for the people who can read them:\na subscriber-only piece is a subscriber-only conversation.","operationId":"add_comment_api_bigstacks_posts__post_id__comments_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bigstacks__CommentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/comments/{comment_id}":{"patch":{"tags":["bigstacks"],"summary":"Edit Comment","operationId":"edit_comment_api_bigstacks_comments__comment_id__patch","parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bigstacks__CommentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["bigstacks"],"summary":"Delete Comment","description":"The author, the site admins, and the writer whose issue it is on.","operationId":"delete_comment_api_bigstacks_comments__comment_id__delete","parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/posts/{post_id}/like":{"get":{"tags":["bigstacks"],"summary":"Like State","operationId":"like_state_api_bigstacks_posts__post_id__like_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LikeState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["bigstacks"],"summary":"Toggle Like","operationId":"toggle_like_api_bigstacks_posts__post_id__like_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LikeState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/tiers":{"get":{"tags":["bigstacks"],"summary":"Tiers","description":"What this publication charges, and how a reader can actually settle it.\n\nLanes come from the shared switchboard (payments.live_channels()), the same\nroster /support, the Bodega and KUSSR read. A channel that is configured\nbut not usable is absent, never a dead button — so a stack with prices and\nno lit lane offers an emailed invoice, exactly like the storefronts.","operationId":"tiers_api_bigstacks_stacks__slug__tiers_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/pledge":{"post":{"tags":["bigstacks"],"summary":"Pledge","description":"Start a paid subscription: mint a reference the reader quotes when they\npay. THIS DOES NOT GRANT ANYTHING. The entitlement arrives when a human\nmarks the payment received — which is the honest shape while there is no\nStripe key on the box, and the exact seam a webhook drops into later.","operationId":"pledge_api_bigstacks_stacks__slug__pledge_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PledgeIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/payments":{"get":{"tags":["bigstacks"],"summary":"List Payments","description":"The writer's till: who has said they will pay, and who has.","operationId":"list_payments_api_bigstacks_stacks__slug__payments_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/payments/{ref}/mark-paid":{"post":{"tags":["bigstacks"],"summary":"Mark Paid","description":"The write that actually grants a paid subscription.\n\nExtends from whichever is later, the current expiry or now — so a reader\nwho renews early keeps the time they already bought instead of donating it\nback. Idempotent: marking an already-paid reference twice does nothing.","operationId":"mark_paid_api_bigstacks_payments__ref__mark_paid_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_bigstacks__MarkPaidIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/payments/{ref}/cancel":{"post":{"tags":["bigstacks"],"summary":"Cancel Payment","description":"Void an intent that never settled. The reader may also void their own.","operationId":"cancel_payment_api_bigstacks_payments__ref__cancel_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/admin/stacks":{"get":{"tags":["bigstacks"],"summary":"Admin Stacks","description":"The listing queue. `listed=false` is the review pile.","operationId":"admin_stacks_api_bigstacks_admin_stacks_get","parameters":[{"name":"listed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Listed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/admin/stacks/{slug}/list":{"post":{"tags":["bigstacks"],"summary":"List Stack","operationId":"list_stack_api_bigstacks_admin_stacks__slug__list_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/admin/stacks/{slug}/unlist":{"post":{"tags":["bigstacks"],"summary":"Unlist Stack","operationId":"unlist_stack_api_bigstacks_admin_stacks__slug__unlist_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/admin/stacks/{slug}/suspend":{"post":{"tags":["bigstacks"],"summary":"Suspend Stack","description":"The stop button: hides the publication from everyone but its owner and\nthe admins, and blocks writing to it.","operationId":"suspend_stack_api_bigstacks_admin_stacks__slug__suspend_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"suspended","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Suspended"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/admin/comments/{comment_id}/hide":{"post":{"tags":["bigstacks"],"summary":"Hide Comment","operationId":"hide_comment_api_bigstacks_admin_comments__comment_id__hide_post","parameters":[{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}},{"name":"hidden","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Hidden"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/feed.xml":{"get":{"tags":["bigstacks"],"summary":"Stack Feed","description":"RSS 2.0 for one publication.\n\nRendered here rather than in the web tree so there is exactly ONE escaping\nimplementation and it is the one under test. The Next route at\n/bigstacks/<slug>/rss.xml serves this body verbatim; a feed reader sees a\nclean URL and we do not maintain a second XML writer in TypeScript.\n\nTwo rules this feed cannot get wrong, because a feed carries no cookie and\ntherefore has exactly one reader — the public:\n\n  * only published issues, at or before now — the clock gate, same as\n    every other public query;\n  * a paywalled issue contributes its FREE PREVIEW and a link, never its\n    body. There is no such thing as a subscriber-only feed here yet, so\n    anything that reaches this function reaches everybody.\n\nEscaping is xml.sax.saxutils, not CDATA. CDATA looks simpler right up\nuntil a writer types \"]]>\" in a title and closes the section early; plain\nentity escaping has no terminator to collide with.","operationId":"stack_feed_api_bigstacks_stacks__slug__feed_xml_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/import/substack":{"post":{"tags":["bigstacks"],"summary":"Import Substack","description":"Import a Substack export zip into this publication.\n\n**`dry_run` defaults to TRUE.** Uploading shows the writer what would land\nand changes nothing; importing for real is a second, deliberate request.\nAn archive is somebody's entire working life and the shape of the export\nis not something they can inspect themselves, so the preview is the\nfeature, not a nicety.\n\nEverything arrives as a DRAFT unless `publish` is set. Substack's own\n`is_published` is carried through as a flag on the preview, but a piece\nthat was live somewhere else is not automatically live here — the writer\npresses publish, the same as for anything they type.\n\nRe-running is safe: a post already imported (same `import_ref`) is\nUPDATED, not duplicated. That is what makes it usable as a sync while\nsomebody winds down over on the other platform.\n\nWhat this deliberately does NOT import: the subscriber list. Those\naddresses belong to people who agreed to hear from a publication on\nSubstack, and moving them here without asking is exactly the thing this\nplatform exists not to do. The delivers/opens CSVs are never opened at all.","operationId":"import_substack_api_bigstacks_stacks__slug__import_substack_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_substack_api_bigstacks_stacks__slug__import_substack_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/stacks/{slug}/images":{"post":{"tags":["bigstacks"],"summary":"Upload Image","description":"Upload a picture for this publication's issues.\n\nReturns the Markdown to paste, not just a URL, because the writer's next\naction is always the same and the link shape has to satisfy\n`safe_image_src` — a relative path under our own origin. Handing back a\nbare URL would invite somebody to paste an absolute one, which the renderer\nwould then demote to a link and look broken for no visible reason.\n\nEXIF is not scrubbed, it is never written: render_photo re-encodes and the\nupload is deleted in the `finally`, because the original is the copy with\nthe GPS in it.","operationId":"upload_image_api_bigstacks_stacks__slug__images_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_image_api_bigstacks_stacks__slug__images_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["bigstacks"],"summary":"List Images","description":"The writer's own library, for the picker in the editor.","operationId":"list_images_api_bigstacks_stacks__slug__images_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bigstacks/images/{image_id}":{"get":{"tags":["bigstacks"],"summary":"Serve Image","description":"Serve a rendition.\n\nPublic and unauthenticated on purpose. These are illustrations inside\nissues, and an issue's own text is already public or previewed — putting\nthe picture behind a check the surrounding paragraph does not have would\nbuy nothing and break every cache. A paywalled issue's pictures sit below\nthe wall in the body the reader never receives, so they are not linked to\nanybody who cannot read them.","operationId":"serve_image_api_bigstacks_images__image_id__get","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}},{"name":"size","in":"query","required":false,"schema":{"type":"string","default":"full","title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["bigstacks"],"summary":"Delete Image","description":"Remove a picture and its bytes.\n\nThe row goes whether or not the files do. A directory that cannot be\nremoved is a storage problem to chase later; a row pointing at nothing is\na broken image in a published issue right now.","operationId":"delete_image_api_bigstacks_images__image_id__delete","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/config":{"get":{"tags":["tweeter"],"summary":"Config","description":"Everything a page needs before it renders anything.\n\n`push_configured` is the honest answer to \"can this box ring a phone at\nall\" — false when no VAPID keys are set, which the control panel says in\nplain words instead of showing a switch that silently does nothing.","operationId":"config_api_tweeter_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tweeter/me":{"get":{"tags":["tweeter"],"summary":"Me","operationId":"me_api_tweeter_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tweeter/profile":{"post":{"tags":["tweeter"],"summary":"Claim","description":"Claim a handle. Idempotent for the member who already has one.","operationId":"claim_api_tweeter_profile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_tweeter__ClaimIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["tweeter"],"summary":"Edit Profile","operationId":"edit_profile_api_tweeter_profile_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_tweeter__ProfileIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/mix":{"get":{"tags":["tweeter"],"summary":"Mix","description":"The timeline.\n\n  mix     — the people you follow + your stations + your places. The\n            default, and the only one that is personal.\n  all     — everything public, newest first. What a logged-out visitor\n            sees, and the room's front door.\n  station — one station's broadcasts.\n  market  — one town's tweets.\n\nNo ranking, anywhere, in any of them.","operationId":"mix_api_tweeter_mix_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","pattern":"^(mix|all|station|market)$","default":"mix","title":"Scope"}},{"name":"value","in":"query","required":false,"schema":{"type":"string","maxLength":60,"default":"","title":"Value"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":0,"default":0,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/posts":{"post":{"tags":["tweeter"],"summary":"Compose","operationId":"compose_api_tweeter_posts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/posts/{post_id}":{"delete":{"tags":["tweeter"],"summary":"Remove","description":"Delete your own; a moderator may delete anyone's.\n\nSoft, because a thread with a hole in it is unreadable and because a\nmoderator has to be able to see what they actioned. The row keeps the\nbody; `is_removed` takes it out of every query in this file.","operationId":"remove_api_tweeter_posts__post_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tweeter"],"summary":"Thread","description":"One tweet with its parents above and its replies below.\n\nThis endpoint did not consult `_hidden_author_ids` at all until Silence\nlanded, so a muted or blocked author's replies rendered here even though\n`/mix` had dropped them — a permalink was a way around a block. Fixed\nalongside rather than left, because a hole in the old block is a hole in\nthe new one: they read the same set.\n\nA tweet BY a hidden author is 404, matching the module's rule that an\ninvisible thing is not found rather than forbidden.","operationId":"thread_api_tweeter_posts__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/posts/{post_id}/applaud":{"post":{"tags":["tweeter"],"summary":"Applaud","operationId":"applaud_api_tweeter_posts__post_id__applaud_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tweeter"],"summary":"Unapplaud","operationId":"unapplaud_api_tweeter_posts__post_id__applaud_delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/posts/{post_id}/amplify":{"post":{"tags":["tweeter"],"summary":"Amplify","description":"Put somebody else's tweet in front of the people who follow you.\n\nAn amplify is a ROW in the same table, not a counter, so it lands in\nfollowers' mixes by the same query everything else uses — and the\npartial unique index makes a second one impossible.","operationId":"amplify_api_tweeter_posts__post_id__amplify_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tweeter"],"summary":"Unamplify","operationId":"unamplify_api_tweeter_posts__post_id__amplify_delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/posts/{post_id}/report":{"post":{"tags":["tweeter"],"summary":"Report","operationId":"report_api_tweeter_posts__post_id__report_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_tweeter__ReportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/search":{"get":{"tags":["tweeter"],"summary":"Search","description":"Search the band: tweets, people, or one hashtag.\n\nA LEADING '#' ROUTES ITSELF. Somebody typing \"#flock\" means the tag, not\nthe substring, and making them pick a mode first is the kind of friction\nthat stops people searching at all.\n\nTag search is an indexed equality test against tweeter_tags. Text search\nis ILIKE, which cannot use an index — honest about its ceiling: it is\nright for a corpus this size and the upgrade is a tsvector column plus a\nGIN index, with this endpoint's shape unchanged. It is bounded by\nSEARCH_MAX and by keyset paging so it cannot become a table scan somebody\ncan trigger from a URL.\n\nBlocks, mutes and removals apply exactly as they do in the mix — search is\nnot a side door around somebody you blocked, which is the mistake that\nmakes a block feel worthless.","operationId":"search_api_tweeter_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|posts|people|tag)$","default":"all","title":"Kind"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":0,"default":0,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/tags":{"get":{"tags":["tweeter"],"summary":"Trending","description":"What the town is talking about — a GROUP BY, not a ranking model.\n\nDeliberately the dumbest possible version: count of tweets carrying each\ntag in a window, most first. No velocity, no personalisation, no\nweighting. That keeps it explainable to the person looking at it, which\nis the only property a trends list on a civic site should have.","operationId":"trending_api_tweeter_tags_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":12,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/posts/{post_id}/bookmark":{"post":{"tags":["tweeter"],"summary":"Bookmark","description":"Save for later. Private: no count on the post, no way to read anybody\nelse's, because a visible save count is just a second applause.","operationId":"bookmark_api_tweeter_posts__post_id__bookmark_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tweeter"],"summary":"Unbookmark","operationId":"unbookmark_api_tweeter_posts__post_id__bookmark_delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/bookmarks":{"get":{"tags":["tweeter"],"summary":"Bookmarks","operationId":"bookmarks_api_tweeter_bookmarks_get","parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":0,"default":0,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/posts/{post_id}/pin":{"post":{"tags":["tweeter"],"summary":"Pin","description":"Hold one of your own tweets at the top of your profile.\n\nOne per member, enforced by the schema: it is a column on the profile, so\npinning a second tweet moves the pin rather than creating a state where\ntwo are pinned and some endpoint has to break the tie.","operationId":"pin_api_tweeter_posts__post_id__pin_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tweeter"],"summary":"Unpin","operationId":"unpin_api_tweeter_posts__post_id__pin_delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/u/{handle}":{"get":{"tags":["tweeter"],"summary":"Person","operationId":"person_api_tweeter_u__handle__get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/u/{handle}/follow":{"post":{"tags":["tweeter"],"summary":"Follow","operationId":"follow_api_tweeter_u__handle__follow_post","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tweeter"],"summary":"Unfollow","operationId":"unfollow_api_tweeter_u__handle__follow_delete","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/u/{handle}/mute":{"post":{"tags":["tweeter"],"summary":"Mute","operationId":"mute_api_tweeter_u__handle__mute_post","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tweeter"],"summary":"Unmute","operationId":"unmute_api_tweeter_u__handle__mute_delete","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/u/{handle}/block":{"post":{"tags":["tweeter"],"summary":"Block","description":"Block, and drop any follow in BOTH directions in the same transaction.\nA block that leaves a stale follow row behind is a leak, not an\ninconsistency — the follow would keep feeding them the mix.","operationId":"block_api_tweeter_u__handle__block_post","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tweeter"],"summary":"Unblock","operationId":"unblock_api_tweeter_u__handle__block_delete","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/crossover":{"get":{"tags":["tweeter"],"summary":"Crossover","operationId":"crossover_api_tweeter_crossover_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["tweeter"],"summary":"Save Crossover","operationId":"save_crossover_api_tweeter_crossover_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrossoverIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/places":{"post":{"tags":["tweeter"],"summary":"Add Place","operationId":"add_place_api_tweeter_places_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/places/{place_id}":{"delete":{"tags":["tweeter"],"summary":"Drop Place","operationId":"drop_place_api_tweeter_places__place_id__delete","parameters":[{"name":"place_id","in":"path","required":true,"schema":{"type":"integer","title":"Place Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/push/key":{"get":{"tags":["tweeter"],"summary":"Push Key","description":"The applicationServerKey a browser needs to subscribe.","operationId":"push_key_api_tweeter_push_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tweeter/push/subscribe":{"post":{"tags":["tweeter"],"summary":"Push Subscribe","description":"Register this browser to be rung.\n\nThe endpoint is the device's identity, so a browser re-subscribing with\nthe same endpoint UPDATES the row (possibly moving it to a different\nmember, if two people share a phone) rather than adding a second one.","operationId":"push_subscribe_api_tweeter_push_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/push/unsubscribe":{"post":{"tags":["tweeter"],"summary":"Push Unsubscribe","operationId":"push_unsubscribe_api_tweeter_push_unsubscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/push/devices/{device_id}":{"delete":{"tags":["tweeter"],"summary":"Forget Device","operationId":"forget_device_api_tweeter_push_devices__device_id__delete","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"integer","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/push/test":{"post":{"tags":["tweeter"],"summary":"Push Test","description":"Ring this member's own devices. The only way to find out whether the\nwhole chain works BEFORE the night it matters — and it deliberately runs\ninline, so the member sees the count rather than a hopeful message.","operationId":"push_test_api_tweeter_push_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tweeter/notifications":{"get":{"tags":["tweeter"],"summary":"Notifications","operationId":"notifications_api_tweeter_notifications_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/notifications/read":{"post":{"tags":["tweeter"],"summary":"Mark Read","operationId":"mark_read_api_tweeter_notifications_read_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tweeter/admin/stations":{"get":{"tags":["tweeter"],"summary":"Admin Stations","description":"Every station, listed or not, with its staff. Admin and up.","operationId":"admin_stations_api_tweeter_admin_stations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tweeter/admin/stations/{slug}":{"patch":{"tags":["tweeter"],"summary":"Admin Patch Station","description":"Put a station on display, take it off, or change how loudly it lands.","operationId":"admin_patch_station_api_tweeter_admin_stations__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StationPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/admin/stations/{slug}/staff":{"post":{"tags":["tweeter"],"summary":"Admin Hire","description":"Hire somebody onto one station, or take them off it.\n\nADDITIVE, unlike /api/roles/assign, which replaces the whole scope list —\nusing that to grant KUSSR would quietly strip every other room the member\nholds. Here a grant adds one entry and a revoke removes one entry, so a\n\"double agent\" on two stations is just two grants.\n\nGranting also lifts a plain member to `moderator`, because a rank below\nthat cannot broadcast anywhere. It does NOT widen them: scopes narrow, and\nthe station gate requires the station to be NAMED, so a moderator hired for\nKUSSR reaches KUSSR and nothing else.","operationId":"admin_hire_api_tweeter_admin_stations__slug__staff_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HireIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tweeter/broadcast":{"post":{"tags":["tweeter"],"summary":"Broadcast","description":"Post as a station, by hand, from the desk that owns it.\n\nTHE ONE ENDPOINT HERE THAT ASKS FOR A CODE. Everything else on this desk is\nordinary chatter and must stay frictionless — naming `tweeter` in\n`roles.MFA_STEPUP_DESKS` would put a prompt in front of every tweet, and a\nprompt people resent is a prompt they click through without reading. This\none reaches every subscriber's phone, so a session cookie stolen an hour\nago is not enough on its own.\n\n`room` is deliberately left OFF the dependency: it enforces the rank floor\nand the freshness, while the real scoping happens below against the\nstation's own desk — a moderator scoped to [\"kussr\"] must still be able to\nspeak for the radio station, and a door keyed to room=\"tweeter\" would have\nturned them away before we ever knew which station they meant.\n\nAutomated posts (the newscast going live) go through tweeter_bus\ndirectly — the desk that raised the event has already decided who may.\nThis door is for a human typing, so it checks the ladder: the station's\nown `desk` room at moderator, which a station-scoped moderator holds and\na member does not.","operationId":"broadcast_api_tweeter_broadcast_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/config":{"get":{"tags":["scanner"],"summary":"Config","description":"What the panel needs to render itself, so the vocabulary lives in one\nplace and the UI never carries a second copy of the taxonomy.","operationId":"config_api_scanner_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/scanner/disclosure":{"get":{"tags":["scanner"],"summary":"Disclosure","description":"Public. No account, no key — an accountability page behind a login is\nnot one.","operationId":"disclosure_api_scanner_disclosure_get","parameters":[{"name":"slug","in":"query","required":false,"schema":{"type":"string","default":"","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/markets/{slug}/incidents":{"get":{"tags":["scanner"],"summary":"Board","operationId":"board_api_scanner_markets__slug__incidents_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","default":"","title":"Category"}},{"name":"min_severity","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Min Severity"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"default":72,"title":"Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/markets/{slug}/summary":{"get":{"tags":["scanner"],"summary":"Summary","description":"Counts by category — and the number that matters most, which is how\nmany published alerts turned out to be nothing.\n\nThat figure is on the board on purpose. A radar that only ever reports\nalarms teaches a town it is under siege; publishing the unfounded rate is\nthe cheapest available correction, and no competitor ships it.","operationId":"summary_api_scanner_markets__slug__summary_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"default":168,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/markets/{slug}/reports":{"post":{"tags":["scanner"],"summary":"File Report","description":"A member reports something. It lands PENDING and it stays there.\n\nThere is no verified-reporter tier that skips the queue, and no\nauto-publish threshold on report volume. Ten neighbors reporting the\nsame rumor is ten pending rows, not a published incident — a crowd is\nnot a source, and a module that treated it as one would be exactly the\nfear machine this one exists not to be.","operationId":"file_report_api_scanner_markets__slug__reports_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_scanner__ReportIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/queue":{"get":{"tags":["scanner"],"summary":"Queue","operationId":"queue_api_scanner_queue_get","parameters":[{"name":"slug","in":"query","required":false,"schema":{"type":"string","default":"","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/incidents/{incident_id}/publish":{"post":{"tags":["scanner"],"summary":"Publish","operationId":"publish_api_scanner_incidents__incident_id__publish_post","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"integer","title":"Incident Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/incidents/{incident_id}/reject":{"post":{"tags":["scanner"],"summary":"Reject","operationId":"reject_api_scanner_incidents__incident_id__reject_post","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"integer","title":"Incident Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/incidents/{incident_id}/resolve":{"post":{"tags":["scanner"],"summary":"Resolve","description":"Say how it turned out. See scanner_bus.resolve.","operationId":"resolve_api_scanner_incidents__incident_id__resolve_post","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"integer","title":"Incident Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_scanner__ResolveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/squelch":{"get":{"tags":["scanner"],"summary":"Squelch","operationId":"squelch_api_scanner_squelch_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["scanner"],"summary":"Save Squelch","description":"One PUT, the whole panel. See this file's docstring.","operationId":"save_squelch_api_scanner_squelch_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SquelchIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["scanner"],"summary":"Forget Squelch","description":"Delete the row entirely — back to never-asked, not to off-by-choice.\n\nWorth a separate verb from `mode: off`. A member who wants the module to\nhold no opinions about them at all should be able to get that, and it is\nthe only state from which a future default could ever apply to them.","operationId":"forget_squelch_api_scanner_squelch_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/scanner/inbox":{"get":{"tags":["scanner"],"summary":"Inbox","operationId":"inbox_api_scanner_inbox_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/inbox/read":{"post":{"tags":["scanner"],"summary":"Mark Read","operationId":"mark_read_api_scanner_inbox_read_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/scanner/markets/{slug}/sources":{"get":{"tags":["scanner"],"summary":"List Sources","operationId":"list_sources_api_scanner_markets__slug__sources_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["scanner"],"summary":"Upsert Source","operationId":"upsert_source_api_scanner_markets__slug__sources_put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_scanner__SourceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scanner/sources/probe":{"post":{"tags":["scanner"],"summary":"Probe","description":"Dry-run a feed before saving it, so a wrong field mapping is found\nhere rather than as an empty board a week later.","operationId":"probe_api_scanner_sources_probe_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/meta":{"get":{"tags":["hoodbnb"],"summary":"Meta","description":"The vocabularies, so the forms and the filters cannot drift from the\nserver's idea of what a couch is.","operationId":"meta_api_hoodbnb_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__Meta"}}}}}}},"/api/hoodbnb/agreement":{"get":{"tags":["hoodbnb"],"summary":"Agreement","description":"The Good Neighbor Agreement, and whether this member has signed THIS\nversion of it. Readable signed-out — somebody deciding whether to join\nshould be able to read what they would be agreeing to first.","operationId":"agreement_api_hoodbnb_agreement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__AgreementOut"}}}}}},"post":{"tags":["hoodbnb"],"summary":"Sign Agreement","operationId":"sign_agreement_api_hoodbnb_agreement_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__SignIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__AgreementOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/listings":{"get":{"tags":["hoodbnb"],"summary":"Browse","description":"The shelf. Local first, then the state, then the country.\n\nScope is a widening, not a filter: `nationwide` includes the local ones and\nthe page says how many of each there are, so a member in a town with two\ncouches can see that the reason the page looks empty is that it IS empty,\nnot that they searched wrong.","operationId":"browse_api_hoodbnb_listings_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","description":"Market slug to centre on","default":"","title":"Market"},"description":"Market slug to centre on"},{"name":"scope","in":"query","required":false,"schema":{"type":"string","pattern":"^(local|state|nationwide)$","default":"local","title":"Scope"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}},{"name":"terms","in":"query","required":false,"schema":{"type":"string","default":"","title":"Terms"}},{"name":"sleeps","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Sleeps"}},{"name":"welcomes","in":"query","required":false,"schema":{"type":"string","default":"","title":"Welcomes"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["hoodbnb"],"summary":"Create Listing","operationId":"create_listing_api_hoodbnb_listings_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/listings/{slug}":{"get":{"tags":["hoodbnb"],"summary":"Listing Detail","operationId":"listing_detail_api_hoodbnb_listings__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["hoodbnb"],"summary":"Edit Listing","operationId":"edit_listing_api_hoodbnb_listings__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["hoodbnb"],"summary":"Delete Listing","description":"Delete a listing that never hosted anybody. Retire the ones that did.\n\nDeleting cascades to the requests, and the requests cascade to the REVIEWS\non them — so a host who had been hosting badly could delete the room, post\nit again, and be new. That is reputation laundering, and it is available to\nexactly the people it should not be. A listing with a completed stay is\ntherefore retired (`is_active = false`), which removes it from every public\nsurface and leaves the record of how they hosted attached to them.\n\nDiscovered by tests/test_hoodbnb.py — \"but the MEMBER's reputation\nsurvives the listing\" failed against the first version of this endpoint,\nwhich claimed in this docstring that it did.","operationId":"delete_listing_api_hoodbnb_listings__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/listings/{slug}/postcard.svg":{"get":{"tags":["hoodbnb"],"summary":"Postcard","description":"The deterministic sleeve art. Cached hard — it is a pure function of the\nslug and cannot change unless the listing is deleted.","operationId":"postcard_api_hoodbnb_listings__slug__postcard_svg_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/hosts/{user_id}":{"get":{"tags":["hoodbnb"],"summary":"Host Card","description":"A member's HoodBnB record, for the profile surfaces elsewhere in the\nhub. Deliberately the same card the boards would draw, with the stay\nnumbers added — not a separate host identity.","operationId":"host_card_api_hoodbnb_hosts__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__MemberCard"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/stats":{"get":{"tags":["hoodbnb"],"summary":"Stats","description":"Counters for the Town Square landing. Cheap enough to call on a page that\nalso renders the boards.\n\nReader-aware for the same reason `browse` is: a landing that says \"3\ncouches nearby\" and a shelf that shows two is a bug report, and the shelf\nis the one telling the truth.","operationId":"stats_api_hoodbnb_stats_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","default":"","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__Stats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/listings/{slug}/hide":{"patch":{"tags":["hoodbnb"],"summary":"Hide Listing","description":"A moderator takes a listing off the shelf. Separate from the host's own\n`is_active` switch so that a host toggling theirs cannot un-hide it.","operationId":"hide_listing_api_hoodbnb_listings__slug__hide_patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__HideIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/listings/{slug}/requests":{"post":{"tags":["hoodbnb"],"summary":"Ask","operationId":"ask_api_hoodbnb_listings__slug__requests_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StayIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StayOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/requests/{stay_id}":{"get":{"tags":["hoodbnb"],"summary":"Read Stay","description":"The only endpoint in the module that can emit a street address, and only\nfor the host or a CONFIRMED guest. See `hoodbnb.address_visible_to`.","operationId":"read_stay_api_hoodbnb_requests__stay_id__get","parameters":[{"name":"stay_id","in":"path","required":true,"schema":{"type":"integer","title":"Stay Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StayOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["hoodbnb"],"summary":"Decide","description":"Move a request along. Who may do what is the whole function:\n\n    host   confirm, decline, cancel, complete\n    guest  withdraw, cancel\n\n`cancel` is deliberately available to both and only after a confirmation —\nplans fall through on both sides, and forcing the guest to reach the host\noff-platform to release a bed would leave the calendar lying.","operationId":"decide_api_hoodbnb_requests__stay_id__patch","parameters":[{"name":"stay_id","in":"path","required":true,"schema":{"type":"integer","title":"Stay Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__DecisionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StayOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/desk":{"get":{"tags":["hoodbnb"],"summary":"Desk","description":"Everything HoodBnB owes this member, on one page.\n\nAnswers 200 for a signed-out visitor with `signed_in: false` rather than\n401, for the same reason `/api/account/overview` does: the Town Square\nrenders this panel for everybody, and a 401 on every page load is a red line\nin the console of a page that is working correctly.","operationId":"desk_api_hoodbnb_desk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__Desk"}}}}}}},"/api/hoodbnb/requests/{stay_id}/review":{"post":{"tags":["hoodbnb"],"summary":"Review","operationId":"review_api_hoodbnb_requests__stay_id__review_post","parameters":[{"name":"stay_id","in":"path","required":true,"schema":{"type":"integer","title":"Stay Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ReviewIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ReviewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodbnb/listings/{slug}/report":{"post":{"tags":["hoodbnb"],"summary":"Report","description":"File a listing with the moderators. Lands in the one merged queue in\n`routes_member_admin.QUEUE_SOURCES`, not in a table nobody reads.","operationId":"report_api_hoodbnb_listings__slug__report_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodbnb__ReportIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/meta":{"get":{"tags":["hoodride"],"summary":"Meta","description":"Everything the form needs to draw itself. One source, so the web form,\na phone client and the tests cannot drift from what the server accepts.","operationId":"meta_api_hoodride_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__Meta"}}}}}}},"/api/hoodride/agreement":{"get":{"tags":["hoodride"],"summary":"Agreement","description":"The agreement, and whether this member has signed THIS version of it.","operationId":"agreement_api_hoodride_agreement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__AgreementOut"}}}}}},"post":{"tags":["hoodride"],"summary":"Sign Agreement","description":"Accept the current agreement.\n\nThe version is sent BY THE CLIENT and checked against ours, so a member\nsigning a page that has been open in a tab since the words changed is\nrefused rather than silently recorded as agreeing to text they never saw.","operationId":"sign_agreement_api_hoodride_agreement_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__SignIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__AgreementOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/listings":{"get":{"tags":["hoodride"],"summary":"Browse","description":"The board. Local first, then the state, then the country.\n\nScope is a WIDENING, not a filter: `nationwide` includes the local ones and\nthe page carries all three counts, so a member in a town with two cars can\nsee that the page is empty because the town is, not because they searched\nwrong.\n\nNationwide is worth more here than it is on the Swap Meet. Nobody drives\nthree states for a chair; people absolutely drive three states for a\nrust-free body shell or the last manual-transmission one of something.","operationId":"browse_api_hoodride_listings_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","description":"Market slug to center on","default":"","title":"Market"},"description":"Market slug to center on"},{"name":"scope","in":"query","required":false,"schema":{"type":"string","pattern":"^(local|state|nationwide)$","default":"local","title":"Scope"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}},{"name":"body","in":"query","required":false,"schema":{"type":"string","default":"","title":"Body"}},{"name":"runs","in":"query","required":false,"schema":{"type":"string","default":"","title":"Runs"}},{"name":"transmission","in":"query","required":false,"schema":{"type":"string","default":"","title":"Transmission"}},{"name":"analog","in":"query","required":false,"schema":{"type":"string","description":"One ANALOG key","default":"","title":"Analog"},"description":"One ANALOG key"},{"name":"drivable","in":"query","required":false,"schema":{"type":"boolean","description":"Only cars that move under their own power","default":false,"title":"Drivable"},"description":"Only cars that move under their own power"},{"name":"title_clear","in":"query","required":false,"schema":{"type":"boolean","description":"Only clean/rebuilt/bonded titles","default":false,"title":"Title Clear"},"description":"Only clean/rebuilt/bonded titles"},{"name":"year_min","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Year Min"}},{"name":"year_max","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Year Max"}},{"name":"max_price","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Cents; 0 means no ceiling","default":0,"title":"Max Price"},"description":"Cents; 0 means no ceiling"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(newest|price|year|analog|miles)$","default":"newest","title":"Sort"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}},{"name":"include_taken","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Taken"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ListingPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["hoodride"],"summary":"Create Listing","operationId":"create_listing_api_hoodride_listings_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ListingIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/listings/{slug}":{"get":{"tags":["hoodride"],"summary":"Listing Detail","description":"One car.\n\nA hidden listing is a 404 to everybody but its seller and a moderator: a\n403 would confirm the listing exists, which is the whole thing a hidden\nlisting is not supposed to do.","operationId":"listing_detail_api_hoodride_listings__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["hoodride"],"summary":"Edit Listing","description":"Edit. The SLUG never changes, so a link somebody sent a friend still\nworks after the seller fixes a typo in the year.","operationId":"edit_listing_api_hoodride_listings__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ListingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["hoodride"],"summary":"Delete Listing","description":"The seller taking their own car back off the board.\n\nRefused while a CONFIRMED ask is live. Not paternalism: deleting the\nlisting cascades the ask, and the buyer would lose the meeting spot,\nthe message thread and any way of reaching the person they arranged to\nmeet — from their side it would look identical to being stood up. Cancel\nthe ask first, which tells them.","operationId":"delete_listing_api_hoodride_listings__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/listings/{slug}/card.svg":{"get":{"tags":["hoodride"],"summary":"Card Art","description":"The deterministic card. Cached hard — the same slug always draws the\nsame picture, so it can never change under a seller.","operationId":"card_art_api_hoodride_listings__slug__card_svg_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/sellers/{user_id}":{"get":{"tags":["hoodride"],"summary":"Seller Card","operationId":"seller_card_api_hoodride_sellers__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__MemberCard"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/stats":{"get":{"tags":["hoodride"],"summary":"Stats","description":"The numbers the Town Square card shows. Cheap enough to call on a\nlanding page.","operationId":"stats_api_hoodride_stats_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","default":"","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__Stats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/listings/{slug}/hide":{"patch":{"tags":["hoodride"],"summary":"Hide Listing","description":"Moderators only. Hide, never delete — a car with a confirmed ask carries\nsomebody's Saturday and their drive across town, and hiding takes it off\nevery public surface while leaving both sides able to finish or cancel what\nthey already agreed.","operationId":"hide_listing_api_hoodride_listings__slug__hide_patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__HideIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/listings/{slug}/photos":{"post":{"tags":["hoodride"],"summary":"Add Photos","description":"Add photographs to a car. The seller's, and only the seller's.\n\nRendered in-request, because a photo that is not visible the moment you\nadd it feels broken. A moderator is refused here on purpose — they may\nHIDE a listing and may not add to somebody's advert.","operationId":"add_photos_api_hoodride_listings__slug__photos_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_add_photos_api_hoodride_listings__slug__photos_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/photos/{storage_key}/{variant}":{"get":{"tags":["hoodride"],"summary":"Photo","description":"Serve one derivative.\n\nPublic, because a car nobody can see is not for sale — but served by THIS\nAPI rather than rooted in the Caddyfile, which is what lets a hidden or\ndeleted listing take its photographs dark with it. Caddy does not know what\n`is_hidden` means; this endpoint does.","operationId":"photo_api_hoodride_photos__storage_key___variant__get","parameters":[{"name":"storage_key","in":"path","required":true,"schema":{"type":"string","title":"Storage Key"}},{"name":"variant","in":"path","required":true,"schema":{"type":"string","title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/photos/{photo_id}":{"patch":{"tags":["hoodride"],"summary":"Edit Photo","description":"Caption it, or move it. The lowest `sort_order` is the cover.","operationId":"edit_photo_api_hoodride_photos__photo_id__patch","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"integer","title":"Photo Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["hoodride"],"summary":"Delete Photo","description":"Remove a photograph. Seller, or a moderator taking down something that\nshould not be on the board.\n\nThe FILES go too, not just the row — see `hr.forget_photo_files`.","operationId":"delete_photo_api_hoodride_photos__photo_id__delete","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"integer","title":"Photo Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/listings/{slug}/asks":{"post":{"tags":["hoodride"],"summary":"Ask","description":"\"I'll take it\", or \"can I come and look at it\".","operationId":"ask_api_hoodride_listings__slug__asks_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__AskIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__AskOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/asks/{ask_id}":{"get":{"tags":["hoodride"],"summary":"Read Ask","description":"THE ONLY DOOR the meeting spot and the payment handle come out of.\n\nBoth parties may read the ask; `hr.meet_visible_to` decides whether the\nspot rides along, and it says no to a pending buyer, a declined one, a\nmoderator and an admin alike.","operationId":"read_ask_api_hoodride_asks__ask_id__get","parameters":[{"name":"ask_id","in":"path","required":true,"schema":{"type":"integer","title":"Ask Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__AskOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["hoodride"],"summary":"Decide","description":"Move an ask along. Who may set what is the whole content of this\nendpoint:\n\n* the SELLER may confirm, decline, cancel, and mark it sold\n* the BUYER may withdraw, and cancel after it was confirmed\n\n`sold` is the seller's to set because the seller is the one who knows\nwhether anybody turned up with the money. It is also the only status that\ntakes the car off the board permanently, which is why a buyer cannot\nreach it.","operationId":"decide_api_hoodride_asks__ask_id__patch","parameters":[{"name":"ask_id","in":"path","required":true,"schema":{"type":"integer","title":"Ask Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__DecisionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__AskOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/desk":{"get":{"tags":["hoodride"],"summary":"Desk","description":"One member's whole HoodRide: their cars, what they have asked about, and\nwho has asked about theirs.\n\nThe meeting spot rides on the asks here exactly as it does on\n`GET /asks/{id}` — same function, same answer. A desk that quietly used a\nlooser rule would be a second gate to keep in step with the first.","operationId":"desk_api_hoodride_desk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__Desk"}}}}}}},"/api/hoodride/listings/{slug}/report":{"post":{"tags":["hoodride"],"summary":"Report","description":"File a listing with the moderators.","operationId":"report_api_hoodride_listings__slug__report_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ReportIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/reports":{"get":{"tags":["hoodride"],"summary":"Read Reports","description":"The moderator's queue for this board. See `hr.RideReport` for why it is\nhere rather than in the merged queue.\n\nTHE EXCERPT IS WHAT A STRANGER WOULD READ. The meeting spot and the payment\nhandle are not in it, and must not be: `hr.meet_visible_to` has no\nmoderator exception, and a queue that quietly carried the address would be\nthat exception.","operationId":"read_reports_api_hoodride_reports_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(open|actioned|dismissed|all)$","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride/reports/{report_id}":{"patch":{"tags":["hoodride"],"summary":"Resolve Report","description":"Close a report. Hiding the listing is a separate, deliberate act —\n`PATCH /listings/{slug}/hide` — so that \"I have read this\" and \"I have\ntaken it down\" are never the same click.","operationId":"resolve_report_api_hoodride_reports__report_id__patch","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride__ResolveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/meta":{"get":{"tags":["hoodride-bicycles"],"summary":"Meta","operationId":"meta_api_hoodride_bicycles_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__Meta"}}}}}}},"/api/hoodride-bicycles/agreement":{"get":{"tags":["hoodride-bicycles"],"summary":"Agreement","operationId":"agreement_api_hoodride_bicycles_agreement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__AgreementOut"}}}}}},"post":{"tags":["hoodride-bicycles"],"summary":"Sign Agreement","operationId":"sign_agreement_api_hoodride_bicycles_agreement_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__SignIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__AgreementOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/listings":{"get":{"tags":["hoodride-bicycles"],"summary":"Browse","description":"The board. Same local-then-state-then-country widening as HoodRide's,\nand the same reason it is a widening rather than a filter: an empty local\nscope should read as \"nothing in this town yet\", not as a broken search.","operationId":"browse_api_hoodride_bicycles_listings_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","description":"Market slug to center on","default":"","title":"Market"},"description":"Market slug to center on"},{"name":"scope","in":"query","required":false,"schema":{"type":"string","pattern":"^(local|state|nationwide)$","default":"local","title":"Scope"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}},{"name":"bike_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Bike Type"}},{"name":"condition","in":"query","required":false,"schema":{"type":"string","default":"","title":"Condition"}},{"name":"max_price","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Cents; 0 means no ceiling","default":0,"title":"Max Price"},"description":"Cents; 0 means no ceiling"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(newest|price)$","default":"newest","title":"Sort"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}},{"name":"include_taken","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Taken"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["hoodride-bicycles"],"summary":"Create Listing","operationId":"create_listing_api_hoodride_bicycles_listings_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/listings/{slug}":{"get":{"tags":["hoodride-bicycles"],"summary":"Listing Detail","description":"A hidden listing 404s for everybody but its seller and a moderator —\nsame reasoning as `hoodride.listing_detail`: a 403 would confirm the\nlisting exists, which a hidden listing must not do.","operationId":"listing_detail_api_hoodride_bicycles_listings__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["hoodride-bicycles"],"summary":"Edit Listing","description":"Edit. The serial is untouched here regardless of what the body\ncontains — see the module docstring and `_apply_editable`.","operationId":"edit_listing_api_hoodride_bicycles_listings__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["hoodride-bicycles"],"summary":"Delete Listing","operationId":"delete_listing_api_hoodride_bicycles_listings__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/listings/{slug}/card.svg":{"get":{"tags":["hoodride-bicycles"],"summary":"Card Art","operationId":"card_art_api_hoodride_bicycles_listings__slug__card_svg_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/stats":{"get":{"tags":["hoodride-bicycles"],"summary":"Stats","operationId":"stats_api_hoodride_bicycles_stats_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","default":"","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Stats Api Hoodride Bicycles Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/listings/{slug}/hide":{"patch":{"tags":["hoodride-bicycles"],"summary":"Hide Listing","description":"Moderators only. Hide, never delete — same reasoning as HoodRide's own:\na bike with a confirmed ask carries somebody's plan to go and get it.","operationId":"hide_listing_api_hoodride_bicycles_listings__slug__hide_patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__HideIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/listings/{slug}/asks":{"post":{"tags":["hoodride-bicycles"],"summary":"Ask","operationId":"ask_api_hoodride_bicycles_listings__slug__asks_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__AskIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__AskOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/asks/{ask_id}":{"get":{"tags":["hoodride-bicycles"],"summary":"Read Ask","operationId":"read_ask_api_hoodride_bicycles_asks__ask_id__get","parameters":[{"name":"ask_id","in":"path","required":true,"schema":{"type":"integer","title":"Ask Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__AskOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["hoodride-bicycles"],"summary":"Decide","operationId":"decide_api_hoodride_bicycles_asks__ask_id__patch","parameters":[{"name":"ask_id","in":"path","required":true,"schema":{"type":"integer","title":"Ask Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__DecisionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__AskOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/desk":{"get":{"tags":["hoodride-bicycles"],"summary":"Desk","operationId":"desk_api_hoodride_bicycles_desk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__Desk"}}}}}}},"/api/hoodride-bicycles/chain/{serial}":{"get":{"tags":["hoodride-bicycles"],"summary":"Chain","description":"A serial's whole public history: every listing event, every flag and\nclear, oldest first — plus whatever is currently listed under it.\n\nTHIS IS A THIN JOIN, NOT A SECOND LEDGER. `register.entries()` is the\nexact function `GET /api/register?subject=` already calls; this endpoint\nexists so the bicycles UI doesn't have to know the register's shape, and\nso it can attach the live listing card. Anybody who wants the raw,\nindependently-verifiable register entries can read them at\n`/register/` with no dependency on this module at all — that's the\npoint of chaining onto a platform-wide ledger instead of a private one.","operationId":"chain_api_hoodride_bicycles_chain__serial__get","parameters":[{"name":"serial","in":"path","required":true,"schema":{"type":"string","title":"Serial"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/report-stolen":{"post":{"tags":["hoodride-bicycles"],"summary":"Report Stolen","description":"Flag a serial on the public chain. Any signed-in, proven-email member —\nNOT limited to the current seller or a moderator, because the person best\nplaced to know a bike is stolen is usually its original owner, who may\nhave no listing on this board at all.\n\nWrites ONE `bicycle.flagged` register entry. The reporter's identity is\nnever on the public half — see `hb.chain_flag` — so a flag can be\nverified as having been made without exposing who made it.","operationId":"report_stolen_api_hoodride_bicycles_report_stolen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportStolenIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/chain/{serial}/clear":{"post":{"tags":["hoodride-bicycles"],"summary":"Clear Flag","description":"Lift a flag. Moderators only — clearing a stolen flag is not a call\nthis board lets the original reporter or a stranger make unilaterally,\nunlike filing one in the first place.","operationId":"clear_flag_api_hoodride_bicycles_chain__serial__clear_post","parameters":[{"name":"serial","in":"path","required":true,"schema":{"type":"string","title":"Serial"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClearFlagIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/listings/{slug}/report":{"post":{"tags":["hoodride-bicycles"],"summary":"Report","operationId":"report_api_hoodride_bicycles_listings__slug__report_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ReportIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/reports":{"get":{"tags":["hoodride-bicycles"],"summary":"Read Reports","description":"Same shape as `routes_hoodride.read_reports`, same reason for its own\ndoor: this table, not the merged admin queue.","operationId":"read_reports_api_hoodride_bicycles_reports_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(open|actioned|dismissed|all)$","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hoodride-bicycles/reports/{report_id}":{"patch":{"tags":["hoodride-bicycles"],"summary":"Resolve Report","operationId":"resolve_report_api_hoodride_bicycles_reports__report_id__patch","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ResolveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/config":{"get":{"tags":["homie"],"summary":"Config","description":"Everything a page needs to render without hard-coding our vocabulary.\n\nIncludes the pricing policy IN PLAIN LANGUAGE, because a merchant deciding\nwhether to sign up should not have to read the covenant to find the number.","operationId":"config_api_homie_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/homie/agreements/{which}":{"get":{"tags":["homie"],"summary":"Agreement","operationId":"agreement_api_homie_agreements__which__get","parameters":[{"name":"which","in":"path","required":true,"schema":{"type":"string","title":"Which"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/agreements/{which}/accept":{"post":{"tags":["homie"],"summary":"Accept Agreement","operationId":"accept_agreement_api_homie_agreements__which__accept_post","parameters":[{"name":"which","in":"path","required":true,"schema":{"type":"string","title":"Which"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/stores":{"get":{"tags":["homie"],"summary":"Browse","description":"Every store in ONE market. Rule 1.\n\nThere is no `all_markets` parameter and no nationwide sibling to this\nendpoint. See the module docstring in `homie.py` for why that absence is\nthe module rather than an omission.","operationId":"browse_api_homie_m__market__stores_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"open_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Open Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StoreCard"},"title":"Response Browse Api Homie M  Market  Stores Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["homie"],"summary":"Create Store","description":"Open a shop. Proof of address AND the Merchant Covenant, both doors.","operationId":"create_store_api_homie_m__market__stores_post","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/stores/{slug}":{"get":{"tags":["homie"],"summary":"Store Menu","operationId":"store_menu_api_homie_m__market__stores__slug__get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/stores/{slug}/reach":{"get":{"tags":["homie"],"summary":"Check Reach","description":"Does this store deliver to this point? Refuses OPEN on unknowns —\nsee `homie.delivers_to`.","operationId":"check_reach_api_homie_m__market__stores__slug__reach_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"}},{"name":"lng","in":"query","required":true,"schema":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/mine":{"get":{"tags":["homie"],"summary":"My Stores","operationId":"my_stores_api_homie_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/StoreCard"},"type":"array","title":"Response My Stores Api Homie Mine Get"}}}}}}},"/api/homie/stores/{slug}":{"patch":{"tags":["homie"],"summary":"Edit Store","operationId":"edit_store_api_homie_stores__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/stores/{slug}/menu":{"get":{"tags":["homie"],"summary":"Staff Menu","operationId":"staff_menu_api_homie_stores__slug__menu_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/stores/{slug}/sections":{"post":{"tags":["homie"],"summary":"Add Section","operationId":"add_section_api_homie_stores__slug__sections_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__SectionIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/sections/{section_id}":{"patch":{"tags":["homie"],"summary":"Edit Section","operationId":"edit_section_api_homie_sections__section_id__patch","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"integer","title":"Section Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__SectionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["homie"],"summary":"Delete Section","operationId":"delete_section_api_homie_sections__section_id__delete","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"integer","title":"Section Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/stores/{slug}/items":{"post":{"tags":["homie"],"summary":"Add Item","operationId":"add_item_api_homie_stores__slug__items_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/items/{item_id}":{"patch":{"tags":["homie"],"summary":"Edit Item","operationId":"edit_item_api_homie_items__item_id__patch","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["homie"],"summary":"Delete Item","operationId":"delete_item_api_homie_items__item_id__delete","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/items/{item_id}/available":{"post":{"tags":["homie"],"summary":"Set Available","description":"Eighty-six an item. One tap, because this is the button that gets used\nat the worst possible moment on the busiest possible night.","operationId":"set_available_api_homie_items__item_id__available_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"available","in":"query","required":true,"schema":{"type":"boolean","title":"Available"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/items/{item_id}/options":{"post":{"tags":["homie"],"summary":"Add Option Group","operationId":"add_option_group_api_homie_items__item_id__options_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptionGroupIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/options/{group_id}":{"delete":{"tags":["homie"],"summary":"Delete Option Group","operationId":"delete_option_group_api_homie_options__group_id__delete","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/stores/{slug}/quote":{"post":{"tags":["homie"],"summary":"Quote","description":"Price a cart without placing it. Server-side, always. Rule 3.","operationId":"quote_api_homie_m__market__stores__slug__quote_post","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__QuoteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderTotals"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/stores/{slug}/order":{"post":{"tags":["homie"],"summary":"Place Order","description":"Place an order.\n\nNote what does NOT happen here: no money is taken, held, authorized or\nrouted. The store is paid on its own rails and `pay_method` records only\nwhich of those the customer said they would use, so nobody is surprised at\nthe door. Rule 4.","operationId":"place_order_api_homie_m__market__stores__slug__order_post","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__OrderIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/orders/mine":{"get":{"tags":["homie"],"summary":"My Orders","operationId":"my_orders_api_homie_orders_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OrderCard"},"type":"array","title":"Response My Orders Api Homie Orders Mine Get"}}}}}}},"/api/homie/orders/{code}":{"get":{"tags":["homie"],"summary":"Order Detail","description":"An order, WITHOUT the dropoff. See `/orders/{code}/dropoff`.","operationId":"order_detail_api_homie_orders__code__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/OrderDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/orders/{code}/dropoff":{"get":{"tags":["homie"],"summary":"Order Dropoff","description":"THE ONLY DOOR that serves a customer's address, phone or handoff code.\n\nGated by `homie.dropoff_visible_to` — the customer, the store, and the\nclaimed driver inside the grace window, and nobody else. Not a moderator,\nnot an admin, not the station key.","operationId":"order_dropoff_api_homie_orders__code__dropoff_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/DropoffOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/stores/{slug}/orders":{"get":{"tags":["homie"],"summary":"Store Queue","operationId":"store_queue_api_homie_stores__slug__orders_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrderCard"},"title":"Response Store Queue Api Homie Stores  Slug  Orders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/orders/{code}/state":{"post":{"tags":["homie"],"summary":"Move Order","description":"The store moves an order along.\n\nAccepting a DELIVERY order is where a run is offered, and where the store —\nnot us — sets what it will pay the driver for it. Rule 6. `run_pay_cents`\nfalls back to the store's own default, never to anything we chose.","operationId":"move_order_api_homie_orders__code__state_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveOrderIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/drive":{"post":{"tags":["homie"],"summary":"Apply To Drive","operationId":"apply_to_drive_api_homie_m__market__drive_post","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__DriverIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__DriverOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/drive/me":{"get":{"tags":["homie"],"summary":"My Driver","operationId":"my_driver_api_homie_m__market__drive_me_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__DriverOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/drive/queue":{"get":{"tags":["homie"],"summary":"Review Queue","description":"Drivers waiting on a look. The assigned Homie's work list.","operationId":"review_queue_api_homie_m__market__drive_queue_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_homie__DriverOut"},"title":"Response Review Queue Api Homie M  Market  Drive Queue Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/drivers/{driver_id}/review":{"post":{"tags":["homie"],"summary":"Review Driver","description":"Somebody looked at the papers and decided. A PERSON, always.\n\nNothing in this codebase decides this. An assist may pre-fill the dates and\nflag an expired one — `assist_used` records that it did — but a machine\nthat refuses a license has taken somebody's job away with nobody to appeal\nto, which is the argument `moderation.py` makes against automatic\nescalation and it holds harder here.\n\nThe review EXPIRES on the earlier of the two documents. A verification that\noutlives the insurance behind it is worse than no verification, because\nsomebody is relying on it.","operationId":"review_driver_api_homie_drivers__driver_id__review_post","parameters":[{"name":"driver_id","in":"path","required":true,"schema":{"type":"integer","title":"Driver Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__ReviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__DriverOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/runs":{"get":{"tags":["homie"],"summary":"Run Board","description":"The open runs in this market, for a driver deciding what to take.\n\nEach carries the pay the STORE set and the rough area — never an address.\nThe address arrives with the claim, through the one gated door.","operationId":"run_board_api_homie_m__market__runs_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_homie__RunOut"},"title":"Response Run Board Api Homie M  Market  Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/runs/mine":{"get":{"tags":["homie"],"summary":"My Runs","operationId":"my_runs_api_homie_m__market__runs_mine_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_homie__RunOut"},"title":"Response My Runs Api Homie M  Market  Runs Mine Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/runs/{run_id}/claim":{"post":{"tags":["homie"],"summary":"Claim Run","description":"Take a run. `may_claim_run` is the ONE gate. Rule 7.","operationId":"claim_run_api_homie_runs__run_id__claim_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/runs/{run_id}/picked-up":{"post":{"tags":["homie"],"summary":"Pick Up","operationId":"pick_up_api_homie_runs__run_id__picked_up_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/runs/{run_id}/delivered":{"post":{"tags":["homie"],"summary":"Delivered","description":"Delivered. This is also the moment the dropoff clock starts running —\n`DROPOFF_GRACE_MINUTES` later this driver can no longer read the address.\n\nThe run is attached to the store's shift for its BUSINESS DATE, in the\nmarket's own timezone. A UTC business day would file every Friday dinner\nrush under Saturday.","operationId":"delivered_api_homie_runs__run_id__delivered_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_homie__RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/stores/{slug}/shifts":{"get":{"tags":["homie"],"summary":"Store Shifts","operationId":"store_shifts_api_homie_stores__slug__shifts_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ShiftOut"},"title":"Response Store Shifts Api Homie Stores  Slug  Shifts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/shifts/{shift_id}":{"get":{"tags":["homie"],"summary":"Shift Detail","description":"ONE shape, for whoever is allowed to read it.\n\nThe store, any driver who worked it, and the market's Homie all get exactly\nthe same rows and the same totals. There is no `for_driver` branch here and\nthere must never be one — two renderings of a payment record is how two\npeople end up arguing about different numbers.","operationId":"shift_detail_api_homie_shifts__shift_id__get","parameters":[{"name":"shift_id","in":"path","required":true,"schema":{"type":"integer","title":"Shift Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShiftOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/m/{market}/shifts/mine":{"get":{"tags":["homie"],"summary":"My Shifts","description":"A driver's own ledger, across every store they drove for.","operationId":"my_shifts_api_homie_m__market__shifts_mine_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ShiftOut"},"title":"Response My Shifts Api Homie M  Market  Shifts Mine Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/shifts/{shift_id}/settle":{"post":{"tags":["homie"],"summary":"Settle Shift","description":"THE STORE'S SIGNATURE: \"I have paid these drivers.\"\n\nMarking this does not move a cent and cannot — no processor exists here and\nnone can be added without deleting rule 4. It is the store stating, on a\nrecord it cannot later edit, what it paid and to whom. The drivers then say\nwhether that is true.","operationId":"settle_shift_api_homie_shifts__shift_id__settle_post","parameters":[{"name":"shift_id","in":"path","required":true,"schema":{"type":"integer","title":"Shift Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShiftOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/shifts/{shift_id}/acknowledge":{"post":{"tags":["homie"],"summary":"Acknowledge Shift","description":"THE DRIVER'S SIGNATURE: \"yes, I was paid that.\"\n\nThe amount is STORED on the acknowledgement rather than looked up later.\nAgreeing to a number that can change underneath you is agreeing to nothing,\nand this row is the thing that protects a driver if anybody ever claims\nthey were paid when they were not.","operationId":"acknowledge_shift_api_homie_shifts__shift_id__acknowledge_post","parameters":[{"name":"shift_id","in":"path","required":true,"schema":{"type":"integer","title":"Shift Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShiftOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/shifts/{shift_id}/dispute":{"post":{"tags":["homie"],"summary":"Raise Discrepancy","description":"Say the record is wrong. A ROW — permanent, and nobody can delete it.\n\nOpen to the store and to any driver who worked the shift. Resolving one\nadds a resolution; it never removes the raising.","operationId":"raise_discrepancy_api_homie_shifts__shift_id__dispute_post","parameters":[{"name":"shift_id","in":"path","required":true,"schema":{"type":"integer","title":"Shift Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscrepancyIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/shifts/{shift_id}/disputes":{"get":{"tags":["homie"],"summary":"List Discrepancies","operationId":"list_discrepancies_api_homie_shifts__shift_id__disputes_get","parameters":[{"name":"shift_id","in":"path","required":true,"schema":{"type":"integer","title":"Shift Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/stores/{slug}/statements":{"get":{"tags":["homie"],"summary":"Store Statements","description":"A shop's own bills — generated on read, frozen once generated.\n\nThe merchant sees `sales_cents` and `order_count` alongside the charge, so\nthe invoice can be checked against their own orders page without taking our\nword for anything.","operationId":"store_statements_api_homie_stores__slug__statements_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/admin/pricing":{"get":{"tags":["homie"],"summary":"Read Pricing","operationId":"read_pricing_api_homie_admin_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["homie"],"summary":"Write Pricing","description":"Change what every business on this platform pays.\n\nA NEW ROW, never an edit, and it takes effect from now — statements already\ngenerated carry their own frozen snapshot and cannot be restated by this.\n\nThe returned row is what gets published to the Public Register; that wiring\nlands with the record spine.","operationId":"write_pricing_api_homie_admin_pricing_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/admin/m/{market}/model":{"get":{"tags":["homie"],"summary":"Pricing Model","description":"What a real market would have paid, under several prices at once.\n\nThis is the \"analyze data as we go\" instrument. Because nothing is charged\nwhile billing is off, a market can run for months and the pricing decision\ngets made against actual orders instead of a guess.\n\n`just_under_the_line` is the number worth watching: stores clustered just\nbelow the waiver threshold are stores that would lose money by taking one\nmore order, which is the objection to a hard cliff made countable.","operationId":"pricing_model_api_homie_admin_m__market__model_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/admin/fund":{"get":{"tags":["homie"],"summary":"Fund","operationId":"fund_api_homie_admin_fund_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/homie/orders/{code}/receipt":{"get":{"tags":["homie"],"summary":"Order Receipt","description":"A customer's own receipt, with the recipe to check it without us.\n\nGated to the same three parties the dropoff is, because the receipt carries\nthe private half — which includes the address.","operationId":"order_receipt_api_homie_orders__code__receipt_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/homie/shifts/{shift_id}/receipt":{"get":{"tags":["homie"],"summary":"Shift Receipt","description":"THE ONE THAT MATTERS MOST.\n\nA driver holding this can prove what a store said it paid them, on a day\nthe store has already signed for, without our cooperation and without our\ndatabase. That is the answer to \"the restaurant never paid me\", and it is\nthe answer whether or not we are still here.","operationId":"shift_receipt_api_homie_shifts__shift_id__receipt_get","parameters":[{"name":"shift_id","in":"path","required":true,"schema":{"type":"integer","title":"Shift Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/covenant":{"get":{"tags":["homie"],"summary":"Covenant","description":"Everything this platform promises, and where to check it.\n\nPublic, unauthenticated, and pointing at the chain rather than at itself.\nA page that asks to be trusted should hand you the means to not.","operationId":"covenant_api_homie_covenant_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/homie/m/{market}/drive/docs":{"post":{"tags":["homie"],"summary":"Upload Doc","description":"A driver uploads their licence or their insurance.\n\nUploading REPLACES the previous document of that kind and deletes its\nbytes. A licence we no longer need is a licence we should not be holding,\nand keeping a history of somebody's expired ID is a liability with no use.","operationId":"upload_doc_api_homie_m__market__drive_docs_post","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_doc_api_homie_m__market__drive_docs_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/docs/{doc_id}":{"get":{"tags":["homie"],"summary":"Read Doc","description":"Serve a document. THE ONLY WAY THESE BYTES LEAVE THE BOX.\n\nAddressed by the document's own id, never by a path containing a user id,\nand the file lives in a directory Caddy has no route for — so there is no\nsecond way in to keep in step with this one.","operationId":"read_doc_api_homie_docs__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["homie"],"summary":"Delete Doc","description":"A driver removes their own document. Only ever their own.","operationId":"delete_doc_api_homie_docs__doc_id__delete","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/integrations":{"get":{"tags":["homie"],"summary":"List Integrations","description":"Every way a menu can get in, INCLUDING the two we cannot offer.\n\nThe unavailable ones are listed rather than hidden, because a merchant\ndeciding whether to bother with us deserves to learn Toast is shut before\nthey sign up rather than after.","operationId":"list_integrations_api_homie_integrations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/homie/stores/{slug}/integration":{"post":{"tags":["homie"],"summary":"Set Integration","description":"Choose how this shop's menu gets in. Refuses anything not built.\n\nA store can never be left pointing at a connector that does not exist —\nthat is how a shop ends up with an empty menu and no idea why.","operationId":"set_integration_api_homie_stores__slug__integration_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/stores/{slug}/menu/preview":{"post":{"tags":["homie"],"summary":"Preview Menu","description":"Read a menu and show the shop what we got. SAVES NOTHING.\n\nJSON, NOT MULTIPART, and that is a fix rather than a shortcut. The first\nversion took `UploadFile` alongside a pydantic body, which makes FastAPI\nrequire the whole request to be multipart — so the JSON lane 400'd and the\ntest caught it. A spreadsheet is text; the browser reads it with FileReader\nand posts the text, which removes the multipart surface entirely and keeps\none code path instead of two.","operationId":"preview_menu_api_homie_stores__slug__menu_preview_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuPreviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homie/stores/{slug}/menu/apply":{"post":{"tags":["homie"],"summary":"Apply Menu","description":"Write a previewed menu in. The shop has seen exactly this.","operationId":"apply_menu_api_homie_stores__slug__menu_apply_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuApplyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/nationwide/seeds":{"get":{"tags":["garden"],"summary":"Nationwide Seeds","description":"Every public seed, in every town that has a garden.\n\nPublic and signed-out-safe: this is a front door. Held-back and hidden\nseeds are excluded outright rather than by the owner-aware rule the\nmarket-scoped list uses — an index is not the place to show somebody their\nown private row, and a viewer-dependent national list would be a cache\nhazard for no benefit.","operationId":"nationwide_seeds_api_garden_nationwide_seeds_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NationSeed"},"title":"Response Nationwide Seeds Api Garden Nationwide Seeds Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/nationwide/gardens":{"get":{"tags":["garden"],"summary":"Nationwide Gardens","description":"Every town that has a garden, biggest first.","operationId":"nationwide_gardens_api_garden_nationwide_gardens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GardenTown"},"type":"array","title":"Response Nationwide Gardens Api Garden Nationwide Gardens Get"}}}}}}},"/api/garden/{market}/seeds":{"get":{"tags":["garden"],"summary":"List Seeds","operationId":"list_seeds_api_garden__market__seeds_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}},{"name":"owner","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Owner"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SeedOut"},"title":"Response List Seeds Api Garden  Market  Seeds Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["garden"],"summary":"Add Seed","operationId":"add_seed_api_garden__market__seeds_post","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/seed/{ref}":{"get":{"tags":["garden"],"summary":"Get Seed","operationId":"get_seed_api_garden_seed__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["garden"],"summary":"Edit Seed","operationId":"edit_seed_api_garden_seed__ref__patch","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["garden"],"summary":"Delete Seed","operationId":"delete_seed_api_garden_seed__ref__delete","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/seed/{ref}/desk":{"post":{"tags":["garden"],"summary":"Desk Hide Seed","operationId":"desk_hide_seed_api_garden_seed__ref__desk_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeskIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/{market}/banks":{"get":{"tags":["garden"],"summary":"Seed Banks","description":"Who is growing what, in this town. The front page of the original.\n\nCounts PUBLIC seeds only, deliberately: a gardener holding seeds back\nshould not have that visible as a discrepancy between the number here and\nthe number of rows on their library page.","operationId":"seed_banks_api_garden__market__banks_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BankOut"},"title":"Response Seed Banks Api Garden  Market  Banks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/{market}/market":{"get":{"tags":["garden"],"summary":"List Listings","operationId":"list_listings_api_garden__market__market_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_garden__ListingOut"},"title":"Response List Listings Api Garden  Market  Market Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["garden"],"summary":"Create Listing","operationId":"create_listing_api_garden__market__market_post","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_garden__ListingIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_garden__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/market/{slug}":{"get":{"tags":["garden"],"summary":"Get Listing","operationId":"get_listing_api_garden_market__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_garden__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["garden"],"summary":"Edit Listing","operationId":"edit_listing_api_garden_market__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_garden__ListingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_garden__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/market/{slug}/status":{"post":{"tags":["garden"],"summary":"Set Listing Status","operationId":"set_listing_status_api_garden_market__slug__status_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_garden__ListingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/{market}/trades":{"get":{"tags":["garden"],"summary":"My Trades","operationId":"my_trades_api_garden__market__trades_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TradeOut"},"title":"Response My Trades Api Garden  Market  Trades Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["garden"],"summary":"Offer Trade","operationId":"offer_trade_api_garden__market__trades_post","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TradeIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TradeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/trade/{slug}":{"post":{"tags":["garden"],"summary":"Act On Trade","description":"Accept, decline or cancel.\n\nWho may do what is not symmetric, and the asymmetry is the point: the\nperson who was OFFERED a seed accepts or declines it, and the person who\noffered can only withdraw. Letting either side do both would let an offerer\n'accept' their own offer.","operationId":"act_on_trade_api_garden_trade__slug__post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TradeActionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TradeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/garden/identify/status":{"get":{"tags":["garden"],"summary":"Identify Status","description":"Whether the feature is switched on, so the page can say so up front\nrather than after somebody has taken a photograph.","operationId":"identify_status_api_garden_identify_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentifyOut"}}}}}}},"/api/garden/identify":{"post":{"tags":["garden"],"summary":"Identify","description":"Identify a plant from a photograph.\n\nSigned-in only — this spends money per call, and an unauthenticated\nendpoint that spends money is a bill somebody else writes for you.\n\nNOTHING IS WRITTEN. The answer is a proposal; the member decides whether\nit goes on the seed. A seed library's whole value is that the name on the\nenvelope is right, and a misidentification propagates through every trade\nthat follows it.","operationId":"identify_api_garden_identify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentifyIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentifyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/qr/resolve":{"get":{"tags":["qr"],"summary":"Api Resolve","description":"Used by the camera scanner, which wants to show what it found and let\nthe person confirm before navigating.","operationId":"api_resolve_api_qr_resolve_get","parameters":[{"name":"c","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"C"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/qr/mint":{"post":{"tags":["qr"],"summary":"Mint","description":"Mint (or return) the code for a thing.\n\nIdempotent by `(kind, ref)` — asking twice returns the same code, so a\nreprint never orphans the sticker already on the packet.","operationId":"mint_api_qr_mint_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/qr":{"get":{"tags":["qr"],"summary":"List Codes","operationId":"list_codes_api_qr_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string","maxLength":32,"default":"","title":"Kind"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CodeOut"},"title":"Response List Codes Api Qr Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/meta":{"get":{"tags":["swapmeet"],"summary":"Meta","description":"The vocabularies, so the forms and the filters cannot drift from the\nserver's idea of what an aisle is. `prohibited` is in here rather than\nliving only in the agreement text, so the listing form can print it beside\nthe box somebody is typing into.","operationId":"meta_api_swapmeet_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__Meta"}}}}}}},"/api/swapmeet/agreement":{"get":{"tags":["swapmeet"],"summary":"Agreement","description":"The Fair Deal Agreement, and whether this member has signed THIS version\nof it. Readable signed-out — somebody deciding whether to join should be\nable to read what they would be agreeing to first.","operationId":"agreement_api_swapmeet_agreement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__AgreementOut"}}}}}},"post":{"tags":["swapmeet"],"summary":"Sign Agreement","operationId":"sign_agreement_api_swapmeet_agreement_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__SignIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__AgreementOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/listings":{"get":{"tags":["swapmeet"],"summary":"Browse","description":"The shelf. Local first, then the state, then the country.\n\nScope is a widening, not a filter: `nationwide` includes the local ones and\nthe page says how many of each there are, so a member in a town with two\nlistings can see that the reason the page looks empty is that it IS empty,\nnot that they searched wrong.\n\nNationwide is worth less here than it is on HoodBnB — nobody drives\nthree states for a chair — but it is worth something: `wanted` posts and\nthe one obsolete part for a 1994 something are exactly the cases where the\nonly person in the country who has it is the point.","operationId":"browse_api_swapmeet_listings_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","description":"Market slug to center on","default":"","title":"Market"},"description":"Market slug to center on"},{"name":"scope","in":"query","required":false,"schema":{"type":"string","pattern":"^(local|state|nationwide)$","default":"local","title":"Scope"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","default":"","title":"Category"}},{"name":"condition","in":"query","required":false,"schema":{"type":"string","default":"","title":"Condition"}},{"name":"perk","in":"query","required":false,"schema":{"type":"string","default":"","title":"Perk"}},{"name":"max_price","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Cents; 0 means no ceiling","default":0,"title":"Max Price"},"description":"Cents; 0 means no ceiling"},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}},{"name":"include_gone","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Gone"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ListingPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["swapmeet"],"summary":"Create Listing","operationId":"create_listing_api_swapmeet_listings_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ListingIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/listings/{slug}":{"get":{"tags":["swapmeet"],"summary":"Listing Detail","operationId":"listing_detail_api_swapmeet_listings__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["swapmeet"],"summary":"Edit Listing","operationId":"edit_listing_api_swapmeet_listings__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ListingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["swapmeet"],"summary":"Delete Listing","description":"Delete a listing nobody ever bought. Retire the ones somebody did.\n\nDeleting cascades to the claims, and the claims cascade to the REVIEWS on\nthem — so a seller who had been selling badly could delete the listing,\npost it again, and be new. That is reputation laundering, and it would be\navailable to exactly the people it should not be. A listing with a\ncompleted deal is therefore switched off (`is_active = false`), which takes\nit off every public surface and leaves the record of how they sold attached\nto them.\n\nSame rule, same reasoning and the same test as HoodBnB's — see\n`routes_hoodbnb.delete_listing`, where the endpoint's docstring once\nclaimed the opposite of what the code did.","operationId":"delete_listing_api_swapmeet_listings__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/listings/{slug}/card.svg":{"get":{"tags":["swapmeet"],"summary":"Card Art","description":"The deterministic table art. Cached hard — it is a pure function of the\nslug and cannot change unless the listing is deleted.","operationId":"card_art_api_swapmeet_listings__slug__card_svg_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/sellers/{user_id}":{"get":{"tags":["swapmeet"],"summary":"Seller Card","description":"A member's Swap Meet record, for the profile surfaces elsewhere in the\nhub. Deliberately the same card the boards would draw, with the deal\nnumbers added — not a separate seller identity.","operationId":"seller_card_api_swapmeet_sellers__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__MemberCard"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/stats":{"get":{"tags":["swapmeet"],"summary":"Stats","description":"Counters for the Town Square landing. Cheap enough to call on a page\nthat also renders the boards.","operationId":"stats_api_swapmeet_stats_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","default":"","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__Stats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/listings/{slug}/hide":{"patch":{"tags":["swapmeet"],"summary":"Hide Listing","description":"A moderator takes a listing off the shelf. Separate from the seller's own\n`is_active` switch so that a seller toggling theirs cannot un-hide it.","operationId":"hide_listing_api_swapmeet_listings__slug__hide_patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__HideIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ListingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/listings/{slug}/claims":{"post":{"tags":["swapmeet"],"summary":"Claim","operationId":"claim_api_swapmeet_listings__slug__claims_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ClaimIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ClaimOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/claims/{claim_id}":{"get":{"tags":["swapmeet"],"summary":"Read Claim","description":"The only endpoint in the module that can emit the meeting spot or the\npayment handle, and only for the seller or a CONFIRMED buyer. See\n`swapmeet.handoff_visible_to`.","operationId":"read_claim_api_swapmeet_claims__claim_id__get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ClaimOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["swapmeet"],"summary":"Decide","description":"Move a claim along. Who may do what is the whole function:\n\n    seller  confirm, decline, cancel, complete\n    buyer   withdraw, cancel\n\n`cancel` is deliberately available to both and only after a confirmation —\ndeals fall through on both sides, and forcing the buyer to chase the seller\noff-platform to release the thing would leave the shelf lying about what is\nstill available.\n\n`complete` is the seller's alone, and it is what opens reviews in BOTH\ndirections. The seller is the only one who knows whether anybody turned up,\nand a buyer who could mark their own deal complete could review a seller\nthey never met.","operationId":"decide_api_swapmeet_claims__claim_id__patch","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__DecisionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ClaimOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/desk":{"get":{"tags":["swapmeet"],"summary":"Desk","description":"Everything Swap Meet owes this member, on one page.\n\nAnswers 200 for a signed-out visitor with `signed_in: false` rather than\n401, for the same reason `/api/account/overview` and the HoodBnB desk\ndo: the Town Square renders this panel for everybody, and a 401 on every\npage load is a red line in the console of a page that is working correctly.","operationId":"desk_api_swapmeet_desk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__Desk"}}}}}}},"/api/swapmeet/claims/{claim_id}/review":{"post":{"tags":["swapmeet"],"summary":"Review","operationId":"review_api_swapmeet_claims__claim_id__review_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ReviewIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ReviewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/swapmeet/listings/{slug}/report":{"post":{"tags":["swapmeet"],"summary":"Report","description":"File a listing with the moderators. Lands in the one merged queue in\n`routes_member_admin.QUEUE_SOURCES`, not in a table nobody reads.","operationId":"report_api_swapmeet_listings__slug__report_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_swapmeet__ReportIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/config":{"get":{"tags":["taxi"],"summary":"Config","description":"Everything a page needs to render without hard-coding our vocabulary.\n\n`money_lane_open` is published rather than inferred so that no page has to\nguess why an amount field is missing, and so the honest-free copy of rule 2\nis driven by the same boolean the server refuses on.","operationId":"config_api_taxi_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/taxi/agreements/{which}":{"get":{"tags":["taxi"],"summary":"Agreement","operationId":"agreement_api_taxi_agreements__which__get","parameters":[{"name":"which","in":"path","required":true,"schema":{"type":"string","title":"Which"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/agreements/{which}/accept":{"post":{"tags":["taxi"],"summary":"Accept Agreement","operationId":"accept_agreement_api_taxi_agreements__which__accept_post","parameters":[{"name":"which","in":"path","required":true,"schema":{"type":"string","title":"Which"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/m/{market}/rides":{"get":{"tags":["taxi"],"summary":"Board","description":"Every open ride in ONE market — rule 11.\n\nThere is no `all_markets` parameter and no nationwide sibling to this\nendpoint. A ride leaving a town nine hundred miles away is not a ride, and\na board full of them teaches people this module is not for them.","operationId":"board_api_taxi_m__market__rides_get","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","default":"","title":"Direction"}},{"name":"lane","in":"query","required":false,"schema":{"type":"string","default":"","title":"Lane"}},{"name":"purpose","in":"query","required":false,"schema":{"type":"string","default":"","title":"Purpose"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RideCard"},"title":"Response Board Api Taxi M  Market  Rides Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["taxi"],"summary":"Post Ride","description":"Post an offer or an ask.\n\nTHE ORDER OF THE GATES IS THE POINT. Proof, then the agreement for the side\nyou are on, then the money rules. A member who has not confirmed an email\nshould be told that rather than being told about a ceiling.","operationId":"post_ride_api_taxi_m__market__rides_post","parameters":[{"name":"market","in":"path","required":true,"schema":{"type":"string","title":"Market"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RideIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RideDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/rides/{code}":{"get":{"tags":["taxi"],"summary":"Ride Detail","description":"One ride. `details` is present only for the two people on a confirmed\nclaim, and only until the clock runs out — rule 3.","operationId":"ride_detail_api_taxi_rides__code__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/RideDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["taxi"],"summary":"Edit Ride","operationId":"edit_ride_api_taxi_rides__code__patch","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RideIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RideDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/rides/{code}/close":{"post":{"tags":["taxi"],"summary":"Close Ride","description":"Take it off the board. Live claims are cancelled with it, because a\nconfirmed rider who is not told is a person standing on a corner.","operationId":"close_ride_api_taxi_rides__code__close_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RideDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/rides/{code}/claims":{"post":{"tags":["taxi"],"summary":"Claim Seat","description":"Take a seat on an offer, or answer somebody's ask.\n\nA PENDING claim holds nothing — several people may ask for the same seat\nand the poster picks. That is the Swap Meet's rule and it is what stops\n\"claim everything on the board\" from being a way to empty it.","operationId":"claim_seat_api_taxi_rides__code__claims_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_taxi__ClaimIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_taxi__ClaimOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["taxi"],"summary":"Ride Claims","description":"Who has asked for this ride. THE POSTER ONLY.\n\nWithout this door a poster cannot confirm anybody, because confirming means\nchoosing a person and you cannot choose from a count. It is deliberately\nnot public and not open to the other claimants: three people asking for the\nsame seat should not learn each other's names, or that they are competing.\n\nEach row carries its own `details`, which is `None` for every claim except\na confirmed one — the same gate as everywhere else, evaluated per row\nrather than per request.","operationId":"ride_claims_api_taxi_rides__code__claims_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__routes_taxi__ClaimOut"},"title":"Response Ride Claims Api Taxi Rides  Code  Claims Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/claims/{claim_id}":{"get":{"tags":["taxi"],"summary":"Claim Detail","description":"The ride card. Either party may read it; nobody else may, INCLUDING a\nmoderator and an admin — rule 3 has no staff exception, exactly as the Swap\nMeet's handoff spot has none.","operationId":"claim_detail_api_taxi_claims__claim_id__get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_taxi__ClaimOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["taxi"],"summary":"Claim Action","operationId":"claim_action_api_taxi_claims__claim_id__patch","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimAction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_taxi__ClaimOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/desk":{"get":{"tags":["taxi"],"summary":"Desk","operationId":"desk_api_taxi_desk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_taxi__Desk"}}}}}}},"/api/taxi/driver":{"get":{"tags":["taxi"],"summary":"Get Driver","operationId":"get_driver_api_taxi_driver_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/app__routes_taxi__DriverOut"},{"type":"null"}],"title":"Response Get Driver Api Taxi Driver Get"}}}}}},"put":{"tags":["taxi"],"summary":"Put Driver","description":"The car, and the promise about it.\n\nTHE ATTESTATION IS THE DRIVER'S AGREEMENT, not a checkbox here: signing it\nis what records that this member says they hold a current licence and\ncurrent insurance, in their own name, against a version. So this door\nrefuses until that signature exists, rather than collecting a car from\nsomebody who has not made the promise.","operationId":"put_driver_api_taxi_driver_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_taxi__DriverIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_taxi__DriverOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/claims/{claim_id}/vouch":{"post":{"tags":["taxi"],"summary":"Vouch","description":"Say something, in words, with your name on it, about somebody you\nactually rode with. There is no number here and there must never be one —\nsee `TaxiVouch`.","operationId":"vouch_api_taxi_claims__claim_id__vouch_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VouchIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/members/{user_id}/vouches":{"get":{"tags":["taxi"],"summary":"Member Vouches","description":"Somebody's vouches, as words. NO AVERAGE, NO COUNT-AS-SCORE, no ordering\nby anything but time — rule 9.","operationId":"member_vouches_api_taxi_members__user_id__vouches_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxi/rides/{code}/report":{"post":{"tags":["taxi"],"summary":"Report","description":"Nothing here is ever erased. `money_asked` is the reason that matters\nwhile the money lane is dark — see rule 2.","operationId":"report_api_taxi_rides__code__report_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_taxi__ReportIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/board":{"get":{"tags":["donors"],"summary":"Read Board","description":"The board plus its tote. Published rows only.","operationId":"read_board_api_donors_board_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Read Board Api Donors Board Get"}}}}}}},"/api/donors/rss":{"get":{"tags":["donors"],"summary":"Read Rss","description":"The board as RSS 2.0.\n\n`base_url` comes off the request rather than a setting so the feed's links\nare right on the apex, on a state subdomain, and on a box reached by IP\nbefore DNS — the three places this has to work.","operationId":"read_rss_api_donors_rss_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/donors/squares":{"get":{"tags":["donors"],"summary":"Read Squares","description":"The Neighborhood Squares board — seated donors, biggest gift first.\n\nMay return FEWER than nine, and the game is built to expect that: it fills\nthe remaining chairs from its own questions.json. A board that refuses to\nload until nine donors have been written up would mean the game is dark for\nhowever long that takes.","operationId":"read_squares_api_donors_squares_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Read Squares Api Donors Squares Get"}}}}}}},"/api/donors/admin/roll":{"get":{"tags":["donors"],"summary":"Admin Roll","description":"The whole roll, published and not, newest first.","operationId":"admin_roll_api_donors_admin_roll_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Roll Api Donors Admin Roll Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["donors"],"summary":"Admin Create","operationId":"admin_create_api_donors_admin_roll_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DonorIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Create Api Donors Admin Roll Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/roll/{donor_id}":{"put":{"tags":["donors"],"summary":"Admin Update","operationId":"admin_update_api_donors_admin_roll__donor_id__put","parameters":[{"name":"donor_id","in":"path","required":true,"schema":{"type":"integer","title":"Donor Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DonorIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Update Api Donors Admin Roll  Donor Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["donors"],"summary":"Admin Delete","operationId":"admin_delete_api_donors_admin_roll__donor_id__delete","parameters":[{"name":"donor_id","in":"path","required":true,"schema":{"type":"integer","title":"Donor Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Delete Api Donors Admin Roll  Donor Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/roll/{donor_id}/gifts":{"post":{"tags":["donors"],"summary":"Admin Gift Add","description":"Log another gift against a donor already on the roll.\n\nNo `published` field here on purpose: it inherits the donor's, because\ntyping a gift into an already-public row is itself the reviewed act — not\na bulk paste that needs the roll importer's two-step preview/commit.","operationId":"admin_gift_add_api_donors_admin_roll__donor_id__gifts_post","parameters":[{"name":"donor_id","in":"path","required":true,"schema":{"type":"integer","title":"Donor Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_donors__GiftIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Gift Add Api Donors Admin Roll  Donor Id  Gifts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/gifts/{gift_id}":{"put":{"tags":["donors"],"summary":"Admin Gift Edit","operationId":"admin_gift_edit_api_donors_admin_gifts__gift_id__put","parameters":[{"name":"gift_id","in":"path","required":true,"schema":{"type":"integer","title":"Gift Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_donors__GiftIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Gift Edit Api Donors Admin Gifts  Gift Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["donors"],"summary":"Admin Gift Delete","operationId":"admin_gift_delete_api_donors_admin_gifts__gift_id__delete","parameters":[{"name":"gift_id","in":"path","required":true,"schema":{"type":"integer","title":"Gift Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Gift Delete Api Donors Admin Gifts  Gift Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/roll/{donor_id}/avatar":{"post":{"tags":["donors"],"summary":"Admin Avatar","description":"Upload this donor's picture — a photo or an illustration.\n\nOrdering is the same one the account avatar arrived at, and for the same\nreason: write the new file, point the row at it, and only THEN delete the\nold one. Deleting first leaves a broken image on the board for as long as\nthe render takes, and forever if the render fails.","operationId":"admin_avatar_api_donors_admin_roll__donor_id__avatar_post","parameters":[{"name":"donor_id","in":"path","required":true,"schema":{"type":"integer","title":"Donor Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_avatar_api_donors_admin_roll__donor_id__avatar_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Avatar Api Donors Admin Roll  Donor Id  Avatar Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["donors"],"summary":"Admin Avatar Remove","operationId":"admin_avatar_remove_api_donors_admin_roll__donor_id__avatar_delete","parameters":[{"name":"donor_id","in":"path","required":true,"schema":{"type":"integer","title":"Donor Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Avatar Remove Api Donors Admin Roll  Donor Id  Avatar Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/roll/{donor_id}/cards":{"get":{"tags":["donors"],"summary":"Admin Cards","operationId":"admin_cards_api_donors_admin_roll__donor_id__cards_get","parameters":[{"name":"donor_id","in":"path","required":true,"schema":{"type":"integer","title":"Donor Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Cards Api Donors Admin Roll  Donor Id  Cards Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["donors"],"summary":"Admin Card Add","operationId":"admin_card_add_api_donors_admin_roll__donor_id__cards_post","parameters":[{"name":"donor_id","in":"path","required":true,"schema":{"type":"integer","title":"Donor Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_donors__CardIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Card Add Api Donors Admin Roll  Donor Id  Cards Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/cards/{card_id}":{"put":{"tags":["donors"],"summary":"Admin Card Edit","operationId":"admin_card_edit_api_donors_admin_cards__card_id__put","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"integer","title":"Card Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_donors__CardIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Card Edit Api Donors Admin Cards  Card Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["donors"],"summary":"Admin Card Delete","operationId":"admin_card_delete_api_donors_admin_cards__card_id__delete","parameters":[{"name":"card_id","in":"path","required":true,"schema":{"type":"integer","title":"Card Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Card Delete Api Donors Admin Cards  Card Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/roll/{donor_id}/cards/import":{"post":{"tags":["donors"],"summary":"Admin Card Import","description":"Paste a whole deck as JSON. Two steps, same as the donor roll import:\n`commit=false` parses and shows it back, `commit=true` saves.\n\nAccepts the array on its own or wrapped in an object with a `questions` /\n`cards` / `deck` key, because a deck written elsewhere arrives in whichever\nof those shapes the author happened to use, and refusing three of them on a\ntechnicality is how a paste box goes unused.","operationId":"admin_card_import_api_donors_admin_roll__donor_id__cards_import_post","parameters":[{"name":"donor_id","in":"path","required":true,"schema":{"type":"integer","title":"Donor Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeckIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Card Import Api Donors Admin Roll  Donor Id  Cards Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/cards/import-board":{"post":{"tags":["donors"],"summary":"Admin Card Import Board","description":"One paste, several squares — routed by the schema's `square` field.\n\nThis is what the per-donor importer's refusal points at: a deck covering\nthe whole board goes here, and every card lands on the donor whose name it\nnames. A card naming nobody we have is REPORTED AND DROPPED rather than\nguessed at — the near-miss is exactly the case a fuzzy match would get\nwrong, and a question about the wrong person is worse than a missing one.","operationId":"admin_card_import_board_api_donors_admin_cards_import_board_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardDeckIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Card Import Board Api Donors Admin Cards Import Board Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/publish":{"post":{"tags":["donors"],"summary":"Admin Publish","description":"Publish or unpublish in bulk — the button that follows an import.","operationId":"admin_publish_api_donors_admin_publish_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Publish Api Donors Admin Publish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/donors/admin/import":{"post":{"tags":["donors"],"summary":"Admin Import","description":"Port the roll in. `commit=false` parses and shows; `commit=true` saves.\n\nRows land UNPUBLISHED unless `publish` is explicitly set, so a paste can\nnever put a name on the front of the site before it has been read back.","operationId":"admin_import_api_donors_admin_import_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_donors__ImportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Admin Import Api Donors Admin Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/moving-day/jobs":{"get":{"tags":["moving-day"],"summary":"List Jobs","operationId":"list_jobs_api_moving_day_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/JobOut"},"type":"array","title":"Response List Jobs Api Moving Day Jobs Get"}}}}}},"post":{"tags":["moving-day"],"summary":"Upload","description":"Take an export, keep it, and say what is in it.\n\nStreamed to the volume with a hard ceiling — never read into memory. A\nFacebook archive with a decade of video in it is routinely bigger than\nthis container's RAM, and `spool_upload` is the same helper InstaG uses\nfor the same reason.","operationId":"upload_api_moving_day_jobs_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_api_moving_day_jobs_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/moving-day/jobs/{job_id}":{"get":{"tags":["moving-day"],"summary":"Get Job","operationId":"get_job_api_moving_day_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["moving-day"],"summary":"Delete Job","description":"Delete the archive and the record of it.\n\nWhat was already imported stays where it was imported — those are InstaG\nposts and BigStacks drafts now, the member's own, and deleting the moving\nrecord must not reach into other modules and unmake them.","operationId":"delete_job_api_moving_day_jobs__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Delete Job Api Moving Day Jobs  Job Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/moving-day/jobs/{job_id}/archive":{"get":{"tags":["moving-day"],"summary":"Download Archive","description":"Their file, back, byte for byte.\n\nThe point of the module in one endpoint. Whatever we did or did not import,\nthe archive they handed us is downloadable until they say otherwise.","operationId":"download_archive_api_moving_day_jobs__job_id__archive_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["moving-day"],"summary":"Remove Archive","description":"Drop the stored zip, keep the record of what was imported.\n\nSeparate from deleting the job because they are separate wishes: \"stop\nholding my Facebook archive on your server\" is a reasonable thing to want\nthe day after a successful import, and it should not also erase the note\nsaying what came across.","operationId":"remove_archive_api_moving_day_jobs__job_id__archive_delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Remove Archive Api Moving Day Jobs  Job Id  Archive Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/moving-day/destinations":{"get":{"tags":["moving-day"],"summary":"Destinations","description":"What this member has to import INTO.\n\nChiefly the publications they own, because a BigStacks import needs one\nand \"you have none, go and make one\" is a better answer at review time\nthan after they press the button.","operationId":"destinations_api_moving_day_destinations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Destinations Api Moving Day Destinations Get"}}}}}}},"/api/moving-day/jobs/{job_id}/import":{"post":{"tags":["moving-day"],"summary":"Import Category","description":"Import one category. One button on the review screen, one call here.\n\nPer-category rather than all-at-once because the member's decisions are\nper-category: photographs yes, a decade of statuses maybe, the long ones\ninto this publication and not that one. An \"import everything\" button\nwould be one click and several decisions the member did not get to make.","operationId":"import_category_api_moving_day_jobs__job_id__import_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_movingday__ImportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Import Category Api Moving Day Jobs  Job Id  Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/moving-day/jobs/{job_id}/select":{"post":{"tags":["moving-day"],"summary":"Set Selection","description":"Tick or untick a category on the review screen.\n\nHeld and sealed rows cannot be ticked, whatever arrives in the body.","operationId":"set_selection_api_moving_day_jobs__job_id__select_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Selection Api Moving Day Jobs  Job Id  Select Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/moving-day/google":{"get":{"tags":["moving-day"],"summary":"Google State","description":"The desk, drawn for wherever this member has got to.","operationId":"google_state_api_moving_day_google_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Google State Api Moving Day Google Get"}}}}}},"post":{"tags":["moving-day"],"summary":"Google Start","operationId":"google_start_api_moving_day_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleStartIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Google Start Api Moving Day Google Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["moving-day"],"summary":"Google Forget","description":"Drop the move record. Touches no mail, on either side.","operationId":"google_forget_api_moving_day_google_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Google Forget Api Moving Day Google Delete"}}}}}}},"/api/moving-day/google/prove":{"post":{"tags":["moving-day"],"summary":"Google Prove","description":"Compare what Gmail says they had against what actually landed.\n\nAnswers 200 either way. A short import is a real, recoverable state — run\nthe Takeout again and import the rest — and calling it an error would tell\na member they had done something wrong when what they need is the next\ninstruction. The gate is in what comes back, not in the status code:\n`clear` stays null until the numbers agree.","operationId":"google_prove_api_moving_day_google_prove_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleProveIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Google Prove Api Moving Day Google Prove Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/moving-day/google/step":{"post":{"tags":["moving-day"],"summary":"Google Step","operationId":"google_step_api_moving_day_google_step_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleStepIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Google Step Api Moving Day Google Step Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/moving-day/google/ref/{code}":{"get":{"tags":["moving-day"],"summary":"Google Referral","description":"Where the link in somebody's away message lands. PUBLIC.\n\nRETURNS NO IDENTITY. Not the member's name, not their address, not their\nid, not the Gmail account they left — a stranger followed a link out of a\nthird party's inbox, and the only thing they are entitled to know is that\nthe link is real. The counter is incremented in aggregate; no visitor is\nrecorded, which is the same bargain /stats makes.","operationId":"google_referral_api_moving_day_google_ref__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Google Referral Api Moving Day Google Ref  Code  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/genetics/feed":{"get":{"tags":["genetics"],"summary":"Get Feed","operationId":"get_feed_api_genetics_feed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Feed Api Genetics Feed Get"}}}}}}},"/api/genetics/authors":{"get":{"tags":["genetics"],"summary":"List Authors","description":"Pen names only. The two-halves rule: accounts stay private forever.","operationId":"list_authors_api_genetics_authors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Authors Api Genetics Authors Get"}}}}}},"post":{"tags":["genetics"],"summary":"Grant Pen","operationId":"grant_pen_api_genetics_authors_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Grant Pen Api Genetics Authors Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/genetics/me":{"get":{"tags":["genetics"],"summary":"Me","description":"200 for anonymous on purpose — the desk page draws its signed-out\nstate from this, and an error status would red-line the console (the\n/api/account/overview precedent).","operationId":"me_api_genetics_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Me Api Genetics Me Get"}}}}}}},"/api/genetics/entries":{"post":{"tags":["genetics"],"summary":"File Entry","operationId":"file_entry_api_genetics_entries_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_genetics__EntryIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response File Entry Api Genetics Entries Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/genetics/authors/revoke":{"post":{"tags":["genetics"],"summary":"Revoke Pen","operationId":"revoke_pen_api_genetics_authors_revoke_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes_genetics__RevokeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Revoke Pen Api Genetics Authors Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites":{"get":{"tags":["world-mapper"],"summary":"List Sites","operationId":"list_sites_api_world_mapper_sites_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteOut"},"title":"Response List Sites Api World Mapper Sites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["world-mapper"],"summary":"Create Site","operationId":"create_site_api_world_mapper_sites_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}":{"get":{"tags":["world-mapper"],"summary":"Get Site","operationId":"get_site_api_world_mapper_sites__site_id__get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["world-mapper"],"summary":"Patch Site","operationId":"patch_site_api_world_mapper_sites__site_id__patch","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["world-mapper"],"summary":"Delete Site","operationId":"delete_site_api_world_mapper_sites__site_id__delete","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/members":{"get":{"tags":["world-mapper"],"summary":"List Members","operationId":"list_members_api_world_mapper_sites__site_id__members_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberOut"},"title":"Response List Members Api World Mapper Sites  Site Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["world-mapper"],"summary":"Add Member","operationId":"add_member_api_world_mapper_sites__site_id__members_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/members/{user_id}":{"delete":{"tags":["world-mapper"],"summary":"Remove Member","operationId":"remove_member_api_world_mapper_sites__site_id__members__user_id__delete","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/missions":{"get":{"tags":["world-mapper"],"summary":"List Missions","operationId":"list_missions_api_world_mapper_sites__site_id__missions_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MissionOut"},"title":"Response List Missions Api World Mapper Sites  Site Id  Missions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["world-mapper"],"summary":"Create Mission","operationId":"create_mission_api_world_mapper_sites__site_id__missions_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/missions/{mission_id}":{"get":{"tags":["world-mapper"],"summary":"Get Mission","operationId":"get_mission_api_world_mapper_missions__mission_id__get","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["world-mapper"],"summary":"Patch Mission","operationId":"patch_mission_api_world_mapper_missions__mission_id__patch","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/timeline":{"get":{"tags":["world-mapper"],"summary":"Timeline","description":"The dated site record: every mission in capture order with its runs\nand the snapshot summaries the run lifecycle wrote.","operationId":"timeline_api_world_mapper_sites__site_id__timeline_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Timeline Api World Mapper Sites  Site Id  Timeline Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/missions/{mission_id}/files":{"get":{"tags":["world-mapper"],"summary":"List Files","operationId":"list_files_api_world_mapper_missions__mission_id__files_get","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileOut"},"title":"Response List Files Api World Mapper Missions  Mission Id  Files Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["world-mapper"],"summary":"Upload Small File","description":"One request, one file, at most 32 MB — for control tables, boundaries\nand the like. Photos and clouds go through the resumable door.","operationId":"upload_small_file_api_world_mapper_missions__mission_id__files_post","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_small_file_api_world_mapper_missions__mission_id__files_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/files/{file_id}":{"get":{"tags":["world-mapper"],"summary":"Get File","operationId":"get_file_api_world_mapper_files__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"integer","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["world-mapper"],"summary":"Delete File","operationId":"delete_file_api_world_mapper_files__file_id__delete","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"integer","title":"File Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/files/{file_id}/download":{"get":{"tags":["world-mapper"],"summary":"Download File","operationId":"download_file_api_world_mapper_files__file_id__download_get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"integer","title":"File Id"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/missions/{mission_id}/uploads":{"post":{"tags":["world-mapper"],"summary":"Init Upload","operationId":"init_upload_api_world_mapper_missions__mission_id__uploads_post","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadInit"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/uploads/{ref}":{"get":{"tags":["world-mapper"],"summary":"Get Upload","operationId":"get_upload_api_world_mapper_uploads__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["world-mapper"],"summary":"Abort Upload","operationId":"abort_upload_api_world_mapper_uploads__ref__delete","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/uploads/{ref}/parts/{n}":{"put":{"tags":["world-mapper"],"summary":"Put Part","operationId":"put_part_api_world_mapper_uploads__ref__parts__n__put","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"n","in":"path","required":true,"schema":{"type":"integer","title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/uploads/{ref}/complete":{"post":{"tags":["world-mapper"],"summary":"Complete Upload","operationId":"complete_upload_api_world_mapper_uploads__ref__complete_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/missions/{mission_id}/validate":{"post":{"tags":["world-mapper"],"summary":"Validate Mission","operationId":"validate_mission_api_world_mapper_missions__mission_id__validate_post","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Validate Mission Api World Mapper Missions  Mission Id  Validate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/missions/{mission_id}/validation":{"get":{"tags":["world-mapper"],"summary":"Get Validation","operationId":"get_validation_api_world_mapper_missions__mission_id__validation_get","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Validation Api World Mapper Missions  Mission Id  Validation Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/missions/{mission_id}/control":{"get":{"tags":["world-mapper"],"summary":"List Control","operationId":"list_control_api_world_mapper_missions__mission_id__control_get","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ControlPointOut"},"title":"Response List Control Api World Mapper Missions  Mission Id  Control Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["world-mapper"],"summary":"Upload Control","description":"Upload a GCP or checkpoint table and ingest it in one step.","operationId":"upload_control_api_world_mapper_missions__mission_id__control_post","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_control_api_world_mapper_missions__mission_id__control_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Control Api World Mapper Missions  Mission Id  Control Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/files/{file_id}/control":{"post":{"tags":["world-mapper"],"summary":"Ingest Existing","description":"Ingest a control table that was uploaded through the ordinary door.","operationId":"ingest_existing_api_world_mapper_files__file_id__control_post","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"integer","title":"File Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_ingest_existing_api_world_mapper_files__file_id__control_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Ingest Existing Api World Mapper Files  File Id  Control Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/control/{point_id}":{"delete":{"tags":["world-mapper"],"summary":"Delete Point","operationId":"delete_point_api_world_mapper_control__point_id__delete","parameters":[{"name":"point_id","in":"path","required":true,"schema":{"type":"integer","title":"Point Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/missions/{mission_id}/runs":{"post":{"tags":["world-mapper"],"summary":"Create Run","operationId":"create_run_api_world_mapper_missions__mission_id__runs_post","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__worldmapper__api_runs__RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["world-mapper"],"summary":"List Runs","operationId":"list_runs_api_world_mapper_missions__mission_id__runs_get","parameters":[{"name":"mission_id","in":"path","required":true,"schema":{"type":"integer","title":"Mission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__worldmapper__api_runs__RunOut"},"title":"Response List Runs Api World Mapper Missions  Mission Id  Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}":{"get":{"tags":["world-mapper"],"summary":"Get Run","operationId":"get_run_api_world_mapper_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__worldmapper__api_runs__RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}/log":{"get":{"tags":["world-mapper"],"summary":"Get Log","operationId":"get_log_api_world_mapper_runs__run_id__log_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Log Api World Mapper Runs  Run Id  Log Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}/cancel":{"post":{"tags":["world-mapper"],"summary":"Cancel Run","operationId":"cancel_run_api_world_mapper_runs__run_id__cancel_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Cancel Run Api World Mapper Runs  Run Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}/outputs":{"get":{"tags":["world-mapper"],"summary":"List Outputs","operationId":"list_outputs_api_world_mapper_runs__run_id__outputs_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OutputOut"},"title":"Response List Outputs Api World Mapper Runs  Run Id  Outputs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}/accuracy":{"get":{"tags":["world-mapper"],"summary":"Get Accuracy","operationId":"get_accuracy_api_world_mapper_runs__run_id__accuracy_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Accuracy Api World Mapper Runs  Run Id  Accuracy Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}/accuracy-class":{"patch":{"tags":["world-mapper"],"summary":"Declare Class","description":"Lower a run's class on purpose (a cautious deliverable). Raising it is\nrefused: the evidence decides upward, only a person decides downward.","operationId":"declare_class_api_world_mapper_runs__run_id__accuracy_class_patch","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeclareClass"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Declare Class Api World Mapper Runs  Run Id  Accuracy Class Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/outputs/{output_id}/download":{"get":{"tags":["world-mapper"],"summary":"Download Output","operationId":"download_output_api_world_mapper_outputs__output_id__download_get","parameters":[{"name":"output_id","in":"path","required":true,"schema":{"type":"integer","title":"Output Id"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/outputs/{output_id}/tiles/{z}/{x}/{y}.png":{"get":{"tags":["world-mapper"],"summary":"Tile","operationId":"tile_api_world_mapper_outputs__output_id__tiles__z___x___y__png_get","parameters":[{"name":"output_id","in":"path","required":true,"schema":{"type":"integer","title":"Output Id"}},{"name":"z","in":"path","required":true,"schema":{"type":"integer","title":"Z"}},{"name":"x","in":"path","required":true,"schema":{"type":"integer","title":"X"}},{"name":"y","in":"path","required":true,"schema":{"type":"integer","title":"Y"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}/report.json":{"get":{"tags":["world-mapper"],"summary":"Report Json","operationId":"report_json_api_world_mapper_runs__run_id__report_json_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}/report.html":{"get":{"tags":["world-mapper"],"summary":"Report Html","operationId":"report_html_api_world_mapper_runs__run_id__report_html_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}/report.pdf":{"get":{"tags":["world-mapper"],"summary":"Report Pdf","operationId":"report_pdf_api_world_mapper_runs__run_id__report_pdf_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/runs/{run_id}/package.zip":{"get":{"tags":["world-mapper"],"summary":"Package Zip","operationId":"package_zip_api_world_mapper_runs__run_id__package_zip_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/workers/register":{"post":{"tags":["world-mapper"],"summary":"Register","operationId":"register_api_world_mapper_workers_register_post","parameters":[{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__worldmapper__api_workers__RegisterIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Register Api World Mapper Workers Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/workers/{worker_id}/heartbeat":{"post":{"tags":["world-mapper"],"summary":"Heartbeat","operationId":"heartbeat_api_world_mapper_workers__worker_id__heartbeat_post","parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"integer","title":"Worker Id"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/HeartbeatIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Heartbeat Api World Mapper Workers  Worker Id  Heartbeat Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/workers/{worker_id}/claim":{"post":{"tags":["world-mapper"],"summary":"Claim","operationId":"claim_api_world_mapper_workers__worker_id__claim_post","parameters":[{"name":"worker_id","in":"path","required":true,"schema":{"type":"integer","title":"Worker Id"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/app__worldmapper__api_workers__ClaimIn"},{"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/world-mapper/jobs/{job_id}/progress":{"post":{"tags":["world-mapper"],"summary":"Progress","operationId":"progress_api_world_mapper_jobs__job_id__progress_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"worker_id","in":"query","required":true,"schema":{"type":"integer","title":"Worker Id"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgressIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Progress Api World Mapper Jobs  Job Id  Progress Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/jobs/{job_id}/outputs":{"post":{"tags":["world-mapper"],"summary":"Add Output","operationId":"add_output_api_world_mapper_jobs__job_id__outputs_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"worker_id","in":"query","required":true,"schema":{"type":"integer","title":"Worker Id"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_add_output_api_world_mapper_jobs__job_id__outputs_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/jobs/{job_id}/finish":{"post":{"tags":["world-mapper"],"summary":"Finish","operationId":"finish_api_world_mapper_jobs__job_id__finish_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"worker_id","in":"query","required":true,"schema":{"type":"integer","title":"Worker Id"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinishIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__worldmapper__api_runs__RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/jobs/{job_id}/fail":{"post":{"tags":["world-mapper"],"summary":"Fail","operationId":"fail_api_world_mapper_jobs__job_id__fail_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"worker_id","in":"query","required":true,"schema":{"type":"integer","title":"Worker Id"}},{"name":"x-worker-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Worker-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FailIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__worldmapper__api_runs__RunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/admin/workers":{"get":{"tags":["world-mapper"],"summary":"List Workers","operationId":"list_workers_api_world_mapper_admin_workers_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response List Workers Api World Mapper Admin Workers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/admin/queue":{"get":{"tags":["world-mapper"],"summary":"Queue","operationId":"queue_api_world_mapper_admin_queue_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response Queue Api World Mapper Admin Queue Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/measurements":{"get":{"tags":["world-mapper"],"summary":"List Measurements","operationId":"list_measurements_api_world_mapper_sites__site_id__measurements_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MeasurementOut"},"title":"Response List Measurements Api World Mapper Sites  Site Id  Measurements Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["world-mapper"],"summary":"Add Measurement","operationId":"add_measurement_api_world_mapper_sites__site_id__measurements_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeasurementIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeasurementOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/measurements/{measurement_id}":{"delete":{"tags":["world-mapper"],"summary":"Delete Measurement","operationId":"delete_measurement_api_world_mapper_measurements__measurement_id__delete","parameters":[{"name":"measurement_id","in":"path","required":true,"schema":{"type":"integer","title":"Measurement Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/outputs/{output_id}/elevation":{"get":{"tags":["world-mapper"],"summary":"Elevation","operationId":"elevation_api_world_mapper_outputs__output_id__elevation_get","parameters":[{"name":"output_id","in":"path","required":true,"schema":{"type":"integer","title":"Output Id"}},{"name":"lng","in":"query","required":true,"schema":{"type":"number","title":"Lng"}},{"name":"lat","in":"query","required":true,"schema":{"type":"number","title":"Lat"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Elevation Api World Mapper Outputs  Output Id  Elevation Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/outputs/{output_id}/profile":{"post":{"tags":["world-mapper"],"summary":"Profile","operationId":"profile_api_world_mapper_outputs__output_id__profile_post","parameters":[{"name":"output_id","in":"path","required":true,"schema":{"type":"integer","title":"Output Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__worldmapper__api_publish__LineIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Profile Api World Mapper Outputs  Output Id  Profile Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/outputs/{output_id}/volume":{"post":{"tags":["world-mapper"],"summary":"Volume","operationId":"volume_api_world_mapper_outputs__output_id__volume_post","parameters":[{"name":"output_id","in":"path","required":true,"schema":{"type":"integer","title":"Output Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolygonIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Volume Api World Mapper Outputs  Output Id  Volume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/outputs/{output_id}/publish":{"post":{"tags":["world-mapper"],"summary":"Publish","description":"Publishing is a STATION decision (moderator or above), not a site\nrole: a public layer is the platform speaking, and it is the only thing\na visitor can ever see.","operationId":"publish_api_world_mapper_outputs__output_id__publish_post","parameters":[{"name":"output_id","in":"path","required":true,"schema":{"type":"integer","title":"Output Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__worldmapper__api_publish__PublishIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayerOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/layers/{layer_id}":{"delete":{"tags":["world-mapper"],"summary":"Unpublish","operationId":"unpublish_api_world_mapper_layers__layer_id__delete","parameters":[{"name":"layer_id","in":"path","required":true,"schema":{"type":"integer","title":"Layer Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/layers":{"get":{"tags":["world-mapper"],"summary":"List Layers","operationId":"list_layers_api_world_mapper_sites__site_id__layers_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LayerOut"},"title":"Response List Layers Api World Mapper Sites  Site Id  Layers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/public/sites/{slug}":{"get":{"tags":["world-mapper"],"summary":"Public Site","description":"Read-only. Published layers only, with the provenance a visitor is\nowed: capture date, engine, class, limitations, and what may be\ndownloaded (an administrator's choice, never the operator's).","operationId":"public_site_api_world_mapper_public_sites__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Public Site Api World Mapper Public Sites  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/sensors":{"get":{"tags":["world-mapper"],"summary":"List Sensors","operationId":"list_sensors_api_world_mapper_sites__site_id__sensors_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response List Sensors Api World Mapper Sites  Site Id  Sensors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["world-mapper"],"summary":"Add Sensor","operationId":"add_sensor_api_world_mapper_sites__site_id__sensors_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Add Sensor Api World Mapper Sites  Site Id  Sensors Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/observations":{"get":{"tags":["world-mapper"],"summary":"List Observations","operationId":"list_observations_api_world_mapper_sites__site_id__observations_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":2000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Observations Api World Mapper Sites  Site Id  Observations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/observations/import":{"post":{"tags":["world-mapper"],"summary":"Import Observations","description":"CSV import: observed_at (ISO 8601), kind, value, unit, and optionally\nvalue_low, value_high, source, sensor (a sensor name on this site).","operationId":"import_observations_api_world_mapper_sites__site_id__observations_import_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_observations_api_world_mapper_sites__site_id__observations_import_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Import Observations Api World Mapper Sites  Site Id  Observations Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/compare":{"get":{"tags":["world-mapper"],"summary":"Compare","operationId":"compare_api_world_mapper_sites__site_id__compare_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}},{"name":"a","in":"query","required":true,"schema":{"type":"integer","title":"A"}},{"name":"b","in":"query","required":true,"schema":{"type":"integer","title":"B"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Compare Api World Mapper Sites  Site Id  Compare Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/sites/{site_id}/compare/difference":{"post":{"tags":["world-mapper"],"summary":"Difference","description":"b minus a on the api for site-sized surfaces; larger pairs are refused\nwith a message (a worker-side difference job is the planned path).","operationId":"difference_api_world_mapper_sites__site_id__compare_difference_post","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DifferenceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Difference Api World Mapper Sites  Site Id  Compare Difference Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/world-mapper/health":{"get":{"tags":["world-mapper"],"summary":"Health","description":"What a visitor, an operator or a worker needs to know before trying.\nNothing secret: whether keys are SET, never what they are.","operationId":"health_api_world_mapper_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Health Api World Mapper Health Get"}}}}}}},"/api/world-mapper/home":{"get":{"tags":["world-mapper"],"summary":"Home","description":"One call for the WorldMapper home: my recent sites and missions, the\nqueue, storage, and the warnings an operator should see before starting.","operationId":"home_api_world_mapper_home_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Home Api World Mapper Home Get"}}}}}}},"/api/health":{"get":{"summary":"Health","description":"Is the app alive, and separately, is the database reachable?\n\nThis deliberately does NOT take a connection from the shared pool. It used\nto (`db.execute(select(1))` via Depends(get_db)), which meant that during\nthe 2026-08-15 burst the healthcheck queued behind the same exhausted pool\nas everything else and timed out — so the one signal that should have said\n\"the app is up, the database is saturated\" instead said nothing at all,\nand the container sat unhealthy with no way to tell that from a crash.\n\nNow: a short-timeout connection of its own. A saturated pool no longer\nhides a live app, and a genuinely dead database still reports `db: down`\nrather than being papered over — the failure mode that would make a\npool-free healthcheck a lie.","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/markets":{"get":{"summary":"List Markets","operationId":"list_markets_api_markets_get","parameters":[{"name":"active","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketOut"},"title":"Response List Markets Api Markets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}":{"get":{"summary":"Get Market","operationId":"get_market_api_markets__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/stats":{"get":{"summary":"Market Stats","operationId":"market_stats_api_markets__slug__stats_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/bodies":{"get":{"summary":"List Bodies","operationId":"list_bodies_api_markets__slug__bodies_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BodyOut"},"title":"Response List Bodies Api Markets  Slug  Bodies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/meetings":{"get":{"summary":"List Meetings","operationId":"list_meetings_api_markets__slug__meetings_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"body","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Body slug filter","title":"Body"},"description":"Body slug filter"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search meeting titles and transcript text","title":"Q"},"description":"Search meeting titles and transcript text"},{"name":"has_agenda","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Only meetings with/without an agenda","title":"Has Agenda"},"description":"Only meetings with/without an agenda"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":24,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}":{"get":{"summary":"Get Meeting","operationId":"get_meeting_api_meetings__meeting_id__get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/documents/{document_id}/file":{"get":{"summary":"Document File","description":"Serve our archived copy of a document (permanent, self-hosted).","operationId":"document_file_api_documents__document_id__file_get","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"integer","title":"Document Id"}},{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Download"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/collections":{"post":{"summary":"Create Collection","description":"Admin: create or update a collection (idempotent on market+slug).","operationId":"create_collection_api_admin_collections_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/collections/{slug}/documents":{"post":{"summary":"Upload Collection Document","description":"Admin: ingest one document into a collection. Streams to the archive\nvolume; records size + sha256. Idempotent on (collection, title): re-running\nan already-archived title returns the existing doc, so bulk ingests resume.","operationId":"upload_collection_document_api_admin_collections__slug__documents_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_collection_document_api_admin_collections__slug__documents_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/collections/{slug}":{"get":{"summary":"Get Collection","description":"Public: a collection's metadata + its archived documents, ready to render.\nDocuments are ordered by category, then newest-dated first, then title.","operationId":"get_collection_api_collections__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/settings":{"patch":{"summary":"Update Market Settings","description":"Admin: configure a market. Currently the video watermark text (empty = off).","operationId":"update_market_settings_api_markets__slug__settings_patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/markets/{slug}/meetings":{"post":{"summary":"Register Meeting","description":"Admin: register a meeting discovered from a YouTube channel feed by the\nresidential watcher. Idempotent on (market, provider, video_id) — re-runs return\nthe existing row. Returns the meeting id so the caller can then upload the video\nfile (/video) and transcript (/transcript) fetched from its residential IP.","operationId":"register_meeting_api_admin_markets__slug__meetings_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveredMeeting"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/markets/{slug}/reconcile":{"post":{"summary":"Reconcile Meetings","description":"Admin: collapse multi-source duplicate meetings into one canonical record.\n\nThe rule (see project notes): a meeting is (market, date, body-family). YouTube\nrows are the canonical spine (playable video + transcript) and are never merged\nwith each other. Agenda-platform rows (CivicClerk/Legistar/MuniCode) hand their\nagenda to the matching YouTube meeting(s) for that date+family, then dissolve.\nAgenda rows with no matching recording are kept as agenda-only meetings.\nIdempotent — safe to run after every ingest.","operationId":"reconcile_meetings_api_admin_markets__slug__reconcile_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/archive-video":{"post":{"summary":"Enqueue Video Archive","description":"Admin: enqueue a meeting's recording for archival (the video_archiver worker\npicks it up). Idempotent — re-enqueues only if not already archived.","operationId":"enqueue_video_archive_api_meetings__meeting_id__archive_video_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/meetings/{meeting_id}/video":{"post":{"summary":"Upload Meeting Video","description":"Admin: receive a pre-downloaded/compressed meeting recording (e.g. fetched\nfrom a residential IP where YouTube isn't blocked) and store it as our archived\ncopy. Streams to disk; records size + sha256.","operationId":"upload_meeting_video_api_admin_meetings__meeting_id__video_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_meeting_video_api_admin_meetings__meeting_id__video_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/meetings/{meeting_id}/transcript":{"post":{"summary":"Upload Meeting Transcript","description":"Admin: store a meeting transcript (WebVTT captions harvested from the\nsource, or any .vtt/.txt). Keeps the raw file (served) plus cleaned searchable\ntext. This is stage 1 of D's Notes (transcript -> summary -> comic).","operationId":"upload_meeting_transcript_api_admin_meetings__meeting_id__transcript_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_meeting_transcript_api_admin_meetings__meeting_id__transcript_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/transcript":{"get":{"summary":"Get Meeting Transcript","description":"Public: the harvested transcript for a meeting. `status` is one of\nnone|archived; `text` is the cleaned prose once available. Used by the\nHoodBuster viewing room to render a readable, searchable transcript panel.","operationId":"get_meeting_transcript_api_meetings__meeting_id__transcript_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/meetings/{meeting_id}/comic":{"post":{"summary":"Enqueue Comic","description":"Admin: enqueue Stage 3b comic rendering for one meeting (opt-in — panels\ncost money). Requires a finished comic script; the painter worker picks up the\npending Document(kind='comic') and renders + assembles the PDF.","operationId":"enqueue_comic_api_admin_meetings__meeting_id__comic_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/ds-notes":{"get":{"summary":"Get Ds Notes","description":"Public: the D's Notes plain-language digest for a meeting (Stage 2).\n`status` is one of none|pending|archived|failed; `markdown` is populated once\ngenerated. The frontend can poll this while a digest is being produced.","operationId":"get_ds_notes_api_meetings__meeting_id__ds_notes_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/comic-script":{"get":{"summary":"Get Comic Script","description":"Public: the Captain D comic script for a meeting (Stage 3a). `script` is the\nstructured page plan (cover line + pages) once generated; panels are rendered\nseparately (Stage 3b).","operationId":"get_comic_script_api_meetings__meeting_id__comic_script_get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"integer","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/markets/{slug}/agencies":{"get":{"summary":"List Agencies","operationId":"list_agencies_api_markets__slug__agencies_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__schemas__AgencyOut"},"title":"Response List Agencies Api Markets  Slug  Agencies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/records-requests":{"get":{"summary":"List Records Requests","operationId":"list_records_requests_api_records_requests_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RecordsRequestOut"},"title":"Response List Records Requests Api Records Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Records Request","operationId":"create_records_request_api_records_requests_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordsRequestCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordsRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/records-requests/{request_id}":{"get":{"summary":"Get Records Request","operationId":"get_records_request_api_records_requests__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordsRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcademyStateOut":{"properties":{"state_code":{"type":"string","title":"State Code"},"name":{"type":"string","title":"Name"},"officer_count":{"type":"integer","title":"Officer Count"},"agency_count":{"type":"integer","title":"Agency Count"},"has_cohorts":{"type":"boolean","title":"Has Cohorts"},"has_conduct_source":{"type":"boolean","title":"Has Conduct Source"}},"type":"object","required":["state_code","name","officer_count","agency_count","has_cohorts","has_conduct_source"],"title":"AcademyStateOut","description":"One state's share of the roster.\n\nHere because a single total is a false headline the moment the roster\ncrosses a state line: \"12,090 officers\" and \"20,001 officers\" describe very\ndifferent claims, and only one of them is \"every officer New Mexico has\ncertified.\""},"AcequiaStateDetail":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"alerts":{"items":{"$ref":"#/components/schemas/AlertOut"},"type":"array","title":"Alerts"}},"type":"object","required":["code","name","alerts"],"title":"AcequiaStateDetail"},"AcequiaStateSummary":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"alert_count":{"type":"integer","title":"Alert Count"}},"type":"object","required":["code","name","alert_count"],"title":"AcequiaStateSummary"},"AckIn":{"properties":{"restriction_id":{"type":"integer","title":"Restriction Id"},"appeal":{"type":"string","maxLength":2000,"title":"Appeal","default":""}},"type":"object","required":["restriction_id"],"title":"AckIn"},"ActionIn":{"properties":{"action":{"type":"string","title":"Action"},"reason_code":{"type":"string","title":"Reason Code","default":"other"},"public_note":{"type":"string","maxLength":1000,"title":"Public Note","default":""},"internal_note":{"type":"string","maxLength":1000,"title":"Internal Note","default":""},"hours":{"type":"integer","maximum":87600.0,"minimum":0.0,"title":"Hours","default":0},"scope":{"type":"string","maxLength":40,"title":"Scope","default":""},"strike":{"type":"boolean","title":"Strike","default":true},"restriction_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Restriction Id"},"role":{"type":"string","title":"Role","default":""},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","default":[]},"confirm":{"type":"string","title":"Confirm","default":""}},"type":"object","required":["action"],"title":"ActionIn"},"ActiveContent":{"properties":{"has_javascript":{"type":"boolean","title":"Has Javascript"},"has_openaction":{"type":"boolean","title":"Has Openaction"},"has_launch":{"type":"boolean","title":"Has Launch"},"has_embedded_files":{"type":"boolean","title":"Has Embedded Files"},"has_xfa":{"type":"boolean","title":"Has Xfa"},"embedded_file_names":{"items":{"type":"string"},"type":"array","title":"Embedded File Names"}},"type":"object","required":["has_javascript","has_openaction","has_launch","has_embedded_files","has_xfa","embedded_file_names"],"title":"ActiveContent"},"ActivityFeed":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActivityItem"},"type":"array","title":"Items"},"register_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Register Counts"},"since":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Since"},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"ActivityFeed"},"ActivityItem":{"properties":{"register_kind":{"type":"string","title":"Register Kind"},"register_label":{"type":"string","title":"Register Label"},"occurred_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Occurred On"},"title":{"type":"string","title":"Title"},"detail":{"type":"string","title":"Detail","default":""},"agency_name":{"type":"string","title":"Agency Name","default":""},"agency_slug":{"type":"string","title":"Agency Slug","default":""},"disposition_sentence":{"type":"string","title":"Disposition Sentence","default":""},"counts_against":{"type":"boolean","title":"Counts Against","default":false},"tag":{"type":"string","title":"Tag","default":""},"url":{"type":"string","title":"Url","default":""}},"type":"object","required":["register_kind","register_label","title"],"title":"ActivityItem"},"AdOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"sponsor":{"type":"string","title":"Sponsor"},"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"link_url":{"type":"string","title":"Link Url"},"zones":{"items":{"type":"string"},"type":"array","title":"Zones"},"weight":{"type":"integer","title":"Weight"}},"type":"object","required":["id","kind","sponsor","title","url","link_url","zones","weight"],"title":"AdOut"},"AdminUserOut":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"type":"string","title":"Avatar Url"},"is_admin":{"type":"boolean","title":"Is Admin"},"is_active":{"type":"boolean","title":"Is Active"},"has_google":{"type":"boolean","title":"Has Google","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"}},"type":"object","required":["id","email","display_name","avatar_url","is_admin","is_active","created_at","last_login_at"],"title":"AdminUserOut"},"AdminUserUpdate":{"properties":{"is_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Admin"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"AdminUserUpdate"},"AgencyDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"county":{"type":"string","title":"County"},"state":{"type":"string","title":"State"},"agency_type":{"type":"string","title":"Agency Type"},"population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Population"},"total_cameras":{"type":"integer","title":"Total Cameras"},"search_count":{"type":"integer","title":"Search Count"},"vehicles_captured":{"type":"integer","title":"Vehicles Captured"},"hotlist_hits":{"type":"integer","title":"Hotlist Hits"},"hotlist_hit_rate":{"type":"number","title":"Hotlist Hit Rate"},"data_retention_days":{"type":"integer","title":"Data Retention Days"},"organization_count":{"type":"integer","title":"Organization Count"},"portal_url":{"type":"string","title":"Portal Url"},"prohibited_uses":{"type":"string","title":"Prohibited Uses"},"daily_searches":{"items":{"$ref":"#/components/schemas/DailyCount"},"type":"array","title":"Daily Searches"},"reasons":{"items":{"$ref":"#/components/schemas/ReasonCount"},"type":"array","title":"Reasons"},"sharing_orgs":{"items":{"$ref":"#/components/schemas/SharingOrg"},"type":"array","title":"Sharing Orgs"}},"type":"object","required":["slug","name","city","county","state","agency_type","population","total_cameras","search_count","vehicles_captured","hotlist_hits","hotlist_hit_rate","data_retention_days","organization_count","portal_url","prohibited_uses","daily_searches","reasons","sharing_orgs"],"title":"AgencyDetail"},"AgencySummary":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"county":{"type":"string","title":"County"},"state":{"type":"string","title":"State"},"agency_type":{"type":"string","title":"Agency Type"},"population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Population"},"total_cameras":{"type":"integer","title":"Total Cameras"},"search_count":{"type":"integer","title":"Search Count"},"vehicles_captured":{"type":"integer","title":"Vehicles Captured"},"hotlist_hits":{"type":"integer","title":"Hotlist Hits"},"hotlist_hit_rate":{"type":"number","title":"Hotlist Hit Rate"},"data_retention_days":{"type":"integer","title":"Data Retention Days"},"organization_count":{"type":"integer","title":"Organization Count"},"portal_url":{"type":"string","title":"Portal Url"}},"type":"object","required":["slug","name","city","county","state","agency_type","population","total_cameras","search_count","vehicles_captured","hotlist_hits","hotlist_hit_rate","data_retention_days","organization_count","portal_url"],"title":"AgencySummary"},"AgentOut":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"display_name":{"type":"string","title":"Display Name","default":""},"role":{"type":"string","title":"Role"},"title":{"type":"string","title":"Title"},"posted":{"type":"boolean","title":"Posted"}},"type":"object","required":["id","email","role","title","posted"],"title":"AgentOut"},"AlertIn":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"dek":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dek"},"body_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Md"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"state_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Code"},"county":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County"},"market_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Market Id"},"module_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Module Slug"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"source_fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Fetched At"},"action_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Url"},"action_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Label"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"resolved_as":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved As"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Published"}},"type":"object","title":"AlertIn"},"AlertOut":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"dek":{"type":"string","title":"Dek"},"body_md":{"type":"string","title":"Body Md"},"severity":{"type":"string","title":"Severity"},"state_code":{"type":"string","title":"State Code"},"county":{"type":"string","title":"County"},"market_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Market Id"},"module_slug":{"type":"string","title":"Module Slug"},"source_url":{"type":"string","title":"Source Url"},"source_name":{"type":"string","title":"Source Name"},"source_fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Fetched At"},"action_url":{"type":"string","title":"Action Url"},"action_label":{"type":"string","title":"Action Label"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"resolved_as":{"type":"string","title":"Resolved As"},"resolution":{"type":"string","title":"Resolution"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"published":{"type":"boolean","title":"Published"}},"type":"object","required":["id","slug","title","dek","body_md","severity","state_code","county","market_id","module_slug","source_url","source_name","source_fetched_at","action_url","action_label","starts_at","expires_at","resolved_as","resolution","resolved_at","published"],"title":"AlertOut"},"AnchorIn":{"properties":{"where":{"type":"string","title":"Where","default":"tweeter"},"reference":{"type":"string","title":"Reference","default":""},"broadcast":{"type":"boolean","title":"Broadcast","default":true}},"type":"object","title":"AnchorIn"},"AnswerIn":{"properties":{"token":{"type":"string","title":"Token"},"agree":{"type":"boolean","title":"Agree"},"name":{"type":"string","title":"Name","default":""},"statement":{"type":"string","title":"Statement","default":""}},"type":"object","required":["token","agree"],"title":"AnswerIn"},"ApplyLabelIn":{"properties":{"label_id":{"type":"integer","title":"Label Id"},"on":{"type":"boolean","title":"On","default":true}},"type":"object","required":["label_id"],"title":"ApplyLabelIn"},"ApprovalIn":{"properties":{"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"ApprovalIn"},"AskAttempt":{"properties":{"when":{"type":"string","title":"When","default":""},"what":{"type":"string","title":"What","default":""},"result":{"type":"string","title":"Result","default":""},"outcome":{"type":"string","title":"Outcome","default":"ok"}},"type":"object","title":"AskAttempt"},"AsnInfo":{"properties":{"ip":{"type":"string","title":"Ip"},"asn":{"type":"string","title":"Asn"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"country":{"type":"string","title":"Country"}},"type":"object","required":["ip","asn","name","prefix","country"],"title":"AsnInfo"},"AssignmentIn":{"properties":{"role":{"type":"string","pattern":"^(reporter|reviewer)$","title":"Role","default":"reporter"},"notes":{"type":"string","maxLength":2000,"title":"Notes","default":""}},"type":"object","title":"AssignmentIn"},"AttachmentOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"filename":{"type":"string","title":"Filename","default":""},"bytes":{"type":"integer","title":"Bytes","default":0},"content_type":{"type":"string","title":"Content Type","default":""},"width":{"type":"integer","title":"Width","default":0},"height":{"type":"integer","title":"Height","default":0},"url":{"type":"string","title":"Url","default":""},"thumb_url":{"type":"string","title":"Thumb Url","default":""},"post_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Post Id"},"gone":{"type":"boolean","title":"Gone","default":false}},"type":"object","required":["id","kind"],"title":"AttachmentOut"},"AuditListItem":{"properties":{"meeting_id":{"type":"integer","title":"Meeting Id"},"title":{"type":"string","title":"Title"},"meeting_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Date"},"body":{"type":"string","title":"Body","default":""},"fidelity":{"type":"number","title":"Fidelity"},"findings":{"type":"integer","title":"Findings"},"high":{"type":"integer","title":"High"},"open_findings":{"type":"integer","title":"Open Findings"},"has_minutes":{"type":"boolean","title":"Has Minutes","default":true},"comparable":{"type":"boolean","title":"Comparable","default":true},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["meeting_id","title","meeting_date","fidelity","findings","high","open_findings"],"title":"AuditListItem"},"AuditOut":{"properties":{"meeting_id":{"type":"integer","title":"Meeting Id"},"meeting_title":{"type":"string","title":"Meeting Title"},"meeting_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Date"},"video_url":{"type":"string","title":"Video Url"},"video_id":{"type":"string","title":"Video Id"},"market":{"type":"string","title":"Market"},"fidelity":{"type":"number","title":"Fidelity"},"engine_version":{"type":"string","title":"Engine Version"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"stats":{"type":"object","title":"Stats"},"minutes_url":{"type":"string","title":"Minutes Url","default":""},"findings":{"items":{"$ref":"#/components/schemas/app__routes_redline__FindingOut"},"type":"array","title":"Findings"}},"type":"object","required":["meeting_id","meeting_title","meeting_date","video_url","video_id","market","fidelity","engine_version","created_at","stats"],"title":"AuditOut"},"AuthConfig":{"properties":{"google_enabled":{"type":"boolean","title":"Google Enabled"}},"type":"object","required":["google_enabled"],"title":"AuthConfig"},"AuthorBrief":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"avatar_url":{"type":"string","title":"Avatar Url","default":""}},"type":"object","required":["id","name"],"title":"AuthorBrief"},"AuthorOut":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"type":"string","title":"Avatar Url"}},"type":"object","required":["id","display_name","avatar_url"],"title":"AuthorOut"},"AwardOut":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"stars":{"type":"integer","title":"Stars"},"note":{"type":"string","title":"Note","default":""},"awarded_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Awarded At"}},"type":"object","required":["key","title","stars"],"title":"AwardOut"},"BadgeIn":{"properties":{"badge":{"type":"string","title":"Badge"}},"type":"object","required":["badge"],"title":"BadgeIn"},"BankOut":{"properties":{"owner_id":{"type":"integer","title":"Owner Id"},"owner_name":{"type":"string","title":"Owner Name"},"varieties":{"type":"integer","title":"Varieties"},"recent":{"items":{"type":"string"},"type":"array","title":"Recent"},"path":{"type":"string","title":"Path"}},"type":"object","required":["owner_id","owner_name","varieties","recent","path"],"title":"BankOut"},"BlockIn":{"properties":{"address":{"type":"string","maxLength":200,"title":"Address","default":""}},"type":"object","title":"BlockIn"},"BoardCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":400,"title":"Description","default":""},"emoji":{"type":"string","maxLength":16,"title":"Emoji","default":"📌"}},"type":"object","required":["name"],"title":"BoardCreate"},"BoardDeckIn":{"properties":{"text":{"type":"string","maxLength":2000000,"title":"Text","default":""},"commit":{"type":"boolean","title":"Commit","default":false},"replace":{"type":"boolean","title":"Replace","default":false}},"type":"object","title":"BoardDeckIn"},"BoardEdit":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Emoji"}},"type":"object","title":"BoardEdit","description":"Admin edit of a board. Omit a field to leave it unchanged. Slug is stable\n(not editable) so existing links keep working."},"BoardOut":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"emoji":{"type":"string","title":"Emoji"}},"type":"object","required":["id","slug","name","description","emoji"],"title":"BoardOut"},"BoardPage":{"properties":{"board":{"$ref":"#/components/schemas/BoardOut"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"posts":{"items":{"$ref":"#/components/schemas/PostListItem"},"type":"array","title":"Posts"}},"type":"object","required":["board","total","page","per_page","posts"],"title":"BoardPage"},"BoardWithCount":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"emoji":{"type":"string","title":"Emoji"},"post_count":{"type":"integer","title":"Post Count","default":0}},"type":"object","required":["id","slug","name","description","emoji"],"title":"BoardWithCount"},"BodyOut":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"description":{"type":"string","title":"Description"}},"type":"object","required":["id","slug","name","kind","description"],"title":"BodyOut"},"Body_add_output_api_world_mapper_jobs__job_id__outputs_post":{"properties":{"kind":{"type":"string","title":"Kind"},"format":{"type":"string","title":"Format","default":""},"meta":{"type":"string","title":"Meta","default":"{}"},"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["kind","file"],"title":"Body_add_output_api_world_mapper_jobs__job_id__outputs_post"},"Body_add_photos_api_hoodride_listings__slug__photos_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"},"caption":{"type":"string","title":"Caption","default":""}},"type":"object","required":["files"],"title":"Body_add_photos_api_hoodride_listings__slug__photos_post"},"Body_add_project_photos_api_yellow_pages__listing_id__portfolio__project_id__photos_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_add_project_photos_api_yellow_pages__listing_id__portfolio__project_id__photos_post"},"Body_admin_avatar_api_donors_admin_roll__donor_id__avatar_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_avatar_api_donors_admin_roll__donor_id__avatar_post"},"Body_admin_upload_master_api_bodega_admin_products__slug__file_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_upload_master_api_bodega_admin_products__slug__file_post"},"Body_admin_upload_master_api_kussr_admin_episodes__slug__audio_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_upload_master_api_kussr_admin_episodes__slug__audio_post"},"Body_admin_upload_preview_api_kussr_admin_episodes__slug__preview_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_upload_preview_api_kussr_admin_episodes__slug__preview_post"},"Body_analyze_api_xray_analyze_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_analyze_api_xray_analyze_post"},"Body_batch_preflight_api_trading_post_batch_preflight_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_batch_preflight_api_trading_post_batch_preflight_post"},"Body_create_job_api_mastering_jobs_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"profile":{"type":"string","title":"Profile","default":"workshop"},"title":{"type":"string","title":"Title","default":""},"artist":{"type":"string","title":"Artist","default":"Perfect World Project"},"album":{"type":"string","title":"Album","default":""},"deliver_to":{"type":"string","title":"Deliver To","default":""},"fast":{"type":"boolean","title":"Fast","default":false},"mono":{"type":"boolean","title":"Mono","default":false},"pre_gain":{"type":"string","title":"Pre Gain","default":"auto"}},"type":"object","required":["file"],"title":"Body_create_job_api_mastering_jobs_post"},"Body_create_post_api_instag_posts_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"},"caption":{"type":"string","title":"Caption","default":""},"location_text":{"type":"string","title":"Location Text","default":""},"market":{"type":"string","title":"Market","default":""},"alt_text":{"type":"string","title":"Alt Text","default":""},"visibility":{"type":"string","title":"Visibility","default":"public"}},"type":"object","required":["files"],"title":"Body_create_post_api_instag_posts_post"},"Body_import_observations_api_world_mapper_sites__site_id__observations_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_import_observations_api_world_mapper_sites__site_id__observations_import_post"},"Body_import_substack_api_bigstacks_stacks__slug__import_substack_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"dry_run":{"type":"boolean","title":"Dry Run","default":true},"publish":{"type":"boolean","title":"Publish","default":false}},"type":"object","required":["file"],"title":"Body_import_substack_api_bigstacks_stacks__slug__import_substack_post"},"Body_ingest_existing_api_world_mapper_files__file_id__control_post":{"properties":{"kind":{"type":"string","title":"Kind"}},"type":"object","required":["kind"],"title":"Body_ingest_existing_api_world_mapper_files__file_id__control_post"},"Body_inspect_api_foreign_exchange_inspect_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_inspect_api_foreign_exchange_inspect_post"},"Body_restore_attachment_api_hoodmail_imports__import_id__attachments__attachment_id__post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_restore_attachment_api_hoodmail_imports__import_id__attachments__attachment_id__post"},"Body_upload_api_ads_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"kind":{"type":"string","title":"Kind"},"sponsor":{"type":"string","title":"Sponsor"},"title":{"type":"string","title":"Title","default":""},"link_url":{"type":"string","title":"Link Url","default":""},"zones":{"type":"string","title":"Zones","default":""},"weight":{"type":"integer","title":"Weight","default":1}},"type":"object","required":["file","kind","sponsor"],"title":"Body_upload_api_ads_upload_post"},"Body_upload_api_moving_day_jobs_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_api_moving_day_jobs_post"},"Body_upload_art_api_air_stations__slug__art_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_art_api_air_stations__slug__art_post"},"Body_upload_attachment_api_hoodmail_drafts__draft_id__attachments_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_attachment_api_hoodmail_drafts__draft_id__attachments_post"},"Body_upload_avatar_api_account_avatar_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_avatar_api_account_avatar_post"},"Body_upload_avatar_api_instag_me_avatar_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_avatar_api_instag_me_avatar_post"},"Body_upload_collection_document_api_admin_collections__slug__documents_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"title":{"type":"string","title":"Title"},"category":{"type":"string","title":"Category","default":""},"doc_date":{"type":"string","title":"Doc Date","default":""},"remote_url":{"type":"string","title":"Remote Url","default":""}},"type":"object","required":["file","title"],"title":"Body_upload_collection_document_api_admin_collections__slug__documents_post"},"Body_upload_control_api_world_mapper_missions__mission_id__control_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"kind":{"type":"string","title":"Kind"}},"type":"object","required":["file","kind"],"title":"Body_upload_control_api_world_mapper_missions__mission_id__control_post"},"Body_upload_cues_api_redline_admin_meetings__meeting_id__cues_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_cues_api_redline_admin_meetings__meeting_id__cues_post"},"Body_upload_doc_api_homie_m__market__drive_docs_post":{"properties":{"kind":{"type":"string","title":"Kind"},"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["kind","file"],"title":"Body_upload_doc_api_homie_m__market__drive_docs_post"},"Body_upload_image_api_bigstacks_stacks__slug__images_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"alt":{"type":"string","title":"Alt","default":""}},"type":"object","required":["file"],"title":"Body_upload_image_api_bigstacks_stacks__slug__images_post"},"Body_upload_master_api_bookstore_admin_books__slug__file_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_master_api_bookstore_admin_books__slug__file_post"},"Body_upload_meeting_transcript_api_admin_meetings__meeting_id__transcript_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_meeting_transcript_api_admin_meetings__meeting_id__transcript_post"},"Body_upload_meeting_video_api_admin_meetings__meeting_id__video_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_meeting_video_api_admin_meetings__meeting_id__video_post"},"Body_upload_minutes_api_redline_admin_meetings__meeting_id__minutes_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_minutes_api_redline_admin_meetings__meeting_id__minutes_post"},"Body_upload_product_photo_api_yellow_pages__listing_id__products__product_id__photo_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_product_photo_api_yellow_pages__listing_id__products__product_id__photo_post"},"Body_upload_small_file_api_world_mapper_missions__mission_id__files_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},"type":"object","required":["file"],"title":"Body_upload_small_file_api_world_mapper_missions__mission_id__files_post"},"Body_upload_track_api_air_stations__slug__tracks_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"meta":{"type":"string","title":"Meta","default":"{}"}},"type":"object","required":["file"],"title":"Body_upload_track_api_air_stations__slug__tracks_post"},"BoxIn":{"properties":{"display_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Display Name"},"signature":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Signature"},"vacation_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vacation On"},"vacation_subject":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Vacation Subject"},"vacation_body":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Vacation Body"},"vacation_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vacation Until"},"notify_new_mail":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify New Mail"},"screen_unknown":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Screen Unknown"}},"type":"object","title":"BoxIn"},"BradyCoverage":{"properties":{"what_it_means":{"type":"string","title":"What It Means"},"absence_means_nothing":{"type":"string","title":"Absence Means Nothing"},"offices_total":{"type":"integer","title":"Offices Total"},"offices_publishing":{"type":"integer","title":"Offices Publishing"},"entries":{"items":{"$ref":"#/components/schemas/BradyOut"},"type":"array","title":"Entries"},"districts":{"items":{"$ref":"#/components/schemas/BradyDistrictOut"},"type":"array","title":"Districts"}},"type":"object","required":["what_it_means","absence_means_nothing","offices_total","offices_publishing"],"title":"BradyCoverage","description":"The disclosures, and — more usefully — the silence around them."},"BradyDistrictOut":{"properties":{"district":{"type":"string","title":"District"},"counties":{"type":"string","title":"Counties"},"url":{"type":"string","title":"Url","default":""},"list_url":{"type":"string","title":"List Url","default":""},"publishes":{"type":"boolean","title":"Publishes","default":false},"entry_count":{"type":"integer","title":"Entry Count","default":0},"note":{"type":"string","title":"Note","default":""},"checked_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Checked On"}},"type":"object","required":["district","counties"],"title":"BradyDistrictOut"},"BradyOut":{"properties":{"district":{"type":"string","title":"District"},"counties":{"type":"string","title":"Counties"},"officer_name":{"type":"string","title":"Officer Name"},"agency_at_disclosure":{"type":"string","title":"Agency At Disclosure"},"list_kind":{"type":"string","title":"List Kind"},"meaning":{"type":"string","title":"Meaning"},"match_note":{"type":"string","title":"Match Note","default":""},"match_confidence":{"type":"number","title":"Match Confidence","default":0.0},"source_url":{"type":"string","title":"Source Url","default":""}},"type":"object","required":["district","counties","officer_name","agency_at_disclosure","list_kind","meaning"],"title":"BradyOut","description":"One prosecutor's Brady/Giglio disclosure.\n\n`meaning` and `match_note` are rendered by the API, from one function each,\nso no page can word this differently. It is the heaviest accusation the\nmodule carries and the easiest to overstate."},"BroadcastIn":{"properties":{"station":{"type":"string","title":"Station"},"body":{"type":"string","minLength":1,"title":"Body"},"url":{"type":"string","title":"Url","default":""},"link_title":{"type":"string","title":"Link Title","default":""}},"type":"object","required":["station","body"],"title":"BroadcastIn"},"CalendarEvent":{"properties":{"event_type":{"type":"string","title":"Event Type"},"event_date":{"type":"string","format":"date","title":"Event Date"},"label":{"type":"string","title":"Label"},"is_projected":{"type":"boolean","title":"Is Projected"},"site_id":{"type":"integer","title":"Site Id"},"sems_id":{"type":"integer","title":"Sems Id"},"site_name":{"type":"string","title":"Site Name"},"state_code":{"type":"string","title":"State Code"}},"type":"object","required":["event_type","event_date","label","is_projected","site_id","sems_id","site_name","state_code"],"title":"CalendarEvent"},"CameraOut":{"properties":{"osm_id":{"type":"integer","title":"Osm Id"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"surveillance_type":{"type":"string","title":"Surveillance Type"},"direction":{"type":"string","title":"Direction"},"mount":{"type":"string","title":"Mount"},"operator":{"type":"string","title":"Operator"},"manufacturer":{"type":"string","title":"Manufacturer"},"name":{"type":"string","title":"Name"},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"}},"type":"object","required":["osm_id","lat","lng","surveillance_type","direction","mount","operator","manufacturer","name"],"title":"CameraOut"},"CampaignCard":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary"},"category":{"type":"string","title":"Category"},"action_kind":{"type":"string","title":"Action Kind"},"status":{"type":"string","title":"Status"},"goal_count":{"type":"integer","title":"Goal Count"},"supporter_count":{"type":"integer","title":"Supporter Count"},"recent_count":{"type":"integer","title":"Recent Count"},"market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"},"market_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Name"},"event_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Event At"},"event_location":{"type":"string","title":"Event Location","default":""},"event_body":{"type":"string","title":"Event Body","default":""},"deadline_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline At"},"is_featured":{"type":"boolean","title":"Is Featured","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["slug","title","summary","category","action_kind","status","goal_count","supporter_count","recent_count","created_at"],"title":"CampaignCard"},"CampaignDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary"},"category":{"type":"string","title":"Category"},"action_kind":{"type":"string","title":"Action Kind"},"status":{"type":"string","title":"Status"},"goal_count":{"type":"integer","title":"Goal Count"},"supporter_count":{"type":"integer","title":"Supporter Count"},"recent_count":{"type":"integer","title":"Recent Count"},"market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"},"market_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Name"},"event_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Event At"},"event_location":{"type":"string","title":"Event Location","default":""},"event_body":{"type":"string","title":"Event Body","default":""},"deadline_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline At"},"is_featured":{"type":"boolean","title":"Is Featured","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"description":{"type":"string","title":"Description","default":""},"toolkit":{"type":"object","title":"Toolkit","default":{}},"template_slug":{"type":"string","title":"Template Slug","default":""},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"creator_name":{"type":"string","title":"Creator Name","default":""},"rsvp_yes":{"type":"integer","title":"Rsvp Yes","default":0},"rsvp_maybe":{"type":"integer","title":"Rsvp Maybe","default":0},"wall":{"items":{"$ref":"#/components/schemas/WallEntry"},"type":"array","title":"Wall","default":[]},"updates":{"items":{"$ref":"#/components/schemas/UpdateOut"},"type":"array","title":"Updates","default":[]},"my_support":{"anyOf":[{"$ref":"#/components/schemas/MySupport"},{"type":"null"}]},"can_manage":{"type":"boolean","title":"Can Manage","default":false},"is_admin_viewer":{"type":"boolean","title":"Is Admin Viewer","default":false}},"type":"object","required":["slug","title","summary","category","action_kind","status","goal_count","supporter_count","recent_count","created_at"],"title":"CampaignDetail"},"CampaignEdit":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":4},{"type":"null"}],"title":"Title"},"summary":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Summary"},"description":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"action_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Kind"},"goal_count":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":1.0},{"type":"null"}],"title":"Goal Count"},"market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"},"event_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Event At"},"clear_event_at":{"type":"boolean","title":"Clear Event At","default":false},"event_location":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Event Location"},"event_body":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Event Body"},"deadline_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline At"},"clear_deadline_at":{"type":"boolean","title":"Clear Deadline At","default":false},"toolkit":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Toolkit"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"is_featured":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Featured"},"is_hidden":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Hidden"}},"type":"object","title":"CampaignEdit"},"CampaignIn":{"properties":{"title":{"type":"string","maxLength":200,"minLength":4,"title":"Title"},"summary":{"type":"string","maxLength":300,"title":"Summary","default":""},"description":{"type":"string","maxLength":20000,"title":"Description","default":""},"category":{"type":"string","title":"Category","default":"petition"},"action_kind":{"type":"string","title":"Action Kind","default":"sign"},"goal_count":{"type":"integer","maximum":1000000.0,"minimum":1.0,"title":"Goal Count","default":100},"market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"},"event_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Event At"},"event_location":{"type":"string","maxLength":300,"title":"Event Location","default":""},"event_body":{"type":"string","maxLength":200,"title":"Event Body","default":""},"deadline_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deadline At"},"toolkit":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Toolkit"},"template_slug":{"type":"string","maxLength":140,"title":"Template Slug","default":""}},"type":"object","required":["title"],"title":"CampaignIn"},"CampaignList":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"items":{"items":{"$ref":"#/components/schemas/CampaignCard"},"type":"array","title":"Items"}},"type":"object","required":["total","page","per_page","items"],"title":"CampaignList"},"CandidateOut":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"category":{"type":"string","title":"Category"},"detector":{"type":"string","title":"Detector"},"machine_note":{"type":"string","title":"Machine Note"},"claim":{"type":"string","title":"Claim"},"staff_report_quote":{"type":"string","title":"Staff Report Quote"},"staff_report_locator":{"type":"string","title":"Staff Report Locator"},"staff_report_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Staff Report Document Id"},"contract_quote":{"type":"string","title":"Contract Quote"},"contract_locator":{"type":"string","title":"Contract Locator"},"contract_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Document Id"},"contract_id":{"type":"integer","title":"Contract Id"},"contract_title":{"type":"string","title":"Contract Title"},"contract_kind":{"type":"string","title":"Contract Kind"},"jurisdiction_slug":{"type":"string","title":"Jurisdiction Slug"},"jurisdiction_name":{"type":"string","title":"Jurisdiction Name"},"reviewer":{"type":"string","title":"Reviewer"},"review_note":{"type":"string","title":"Review Note"}},"type":"object","required":["id","status","category","detector","machine_note","claim","staff_report_quote","staff_report_locator","staff_report_document_id","contract_quote","contract_locator","contract_document_id","contract_id","contract_title","contract_kind","jurisdiction_slug","jurisdiction_name","reviewer","review_note"],"title":"CandidateOut"},"CatalogOut":{"properties":{"featured":{"items":{"$ref":"#/components/schemas/ProductOut"},"type":"array","title":"Featured"},"sections":{"items":{"$ref":"#/components/schemas/SectionGroup"},"type":"array","title":"Sections"}},"type":"object","required":["featured","sections"],"title":"CatalogOut"},"ChainEntryOut":{"properties":{"seq":{"type":"integer","title":"Seq"},"at":{"type":"string","title":"At"},"kind":{"type":"string","title":"Kind"},"public":{"type":"object","title":"Public"},"entry_hash":{"type":"string","title":"Entry Hash"},"prev_hash":{"type":"string","title":"Prev Hash"}},"type":"object","required":["seq","at","kind","public","entry_hash","prev_hash"],"title":"ChainEntryOut"},"ChainOut":{"properties":{"serial":{"type":"string","title":"Serial"},"status":{"type":"string","title":"Status"},"entries":{"items":{"$ref":"#/components/schemas/ChainEntryOut"},"type":"array","title":"Entries"},"listing":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingCard"},{"type":"null"}]},"register_url":{"type":"string","title":"Register Url"}},"type":"object","required":["serial","status","entries","register_url"],"title":"ChainOut"},"ChannelCount":{"properties":{"channel":{"type":"string","title":"Channel"},"videos":{"type":"integer","title":"Videos"},"views":{"type":"integer","title":"Views"}},"type":"object","required":["channel","videos","views"],"title":"ChannelCount"},"ChannelIn":{"properties":{"value":{"type":"string","maxLength":400,"title":"Value","default":""},"status":{"type":"string","maxLength":12,"title":"Status","default":"pending"},"note":{"type":"string","maxLength":200,"title":"Note","default":""}},"type":"object","title":"ChannelIn"},"CheckRequest":{"properties":{"text":{"type":"string","maxLength":16000,"minLength":12,"title":"Text"},"speaker":{"type":"string","maxLength":160,"title":"Speaker","default":""}},"type":"object","required":["text"],"title":"CheckRequest"},"CheckoutIn":{"properties":{"term":{"type":"string","title":"Term","default":"monthly"}},"type":"object","title":"CheckoutIn"},"ChoiceIn":{"properties":{"name":{"type":"string","title":"Name","default":""},"price_delta_cents":{"type":"integer","title":"Price Delta Cents","default":0},"available":{"type":"boolean","title":"Available","default":true},"position":{"type":"integer","title":"Position","default":0}},"type":"object","title":"ChoiceIn"},"ChoiceOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"price_delta_cents":{"type":"integer","title":"Price Delta Cents","default":0},"available":{"type":"boolean","title":"Available","default":true}},"type":"object","required":["id","name"],"title":"ChoiceOut"},"CivicMention":{"properties":{"meeting_id":{"type":"integer","title":"Meeting Id"},"title":{"type":"string","title":"Title"},"meeting_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Date"},"body":{"type":"string","title":"Body","default":""},"video_url":{"type":"string","title":"Video Url","default":""},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"},"topic_labels":{"items":{"type":"string"},"type":"array","title":"Topic Labels"},"excerpt":{"type":"string","title":"Excerpt","default":""},"source_kind":{"type":"string","title":"Source Kind","default":""}},"type":"object","required":["meeting_id","title","meeting_date"],"title":"CivicMention"},"CivicRecord":{"properties":{"agency_slug":{"type":"string","title":"Agency Slug"},"agency_name":{"type":"string","title":"Agency Name"},"covered":{"type":"boolean","title":"Covered"},"market_slug":{"type":"string","title":"Market Slug","default":""},"total":{"type":"integer","title":"Total","default":0},"topic_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Topic Counts"},"mentions":{"items":{"$ref":"#/components/schemas/CivicMention"},"type":"array","title":"Mentions"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["agency_slug","agency_name","covered"],"title":"CivicRecord"},"ClaimAction":{"properties":{"action":{"type":"string","title":"Action"}},"type":"object","required":["action"],"title":"ClaimAction"},"ClassBreakdown":{"properties":{"classification":{"type":"string","title":"Classification"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["classification","count"],"title":"ClassBreakdown"},"ClassMemberOut":{"properties":{"cadet_name":{"type":"string","title":"Cadet Name"},"cert_number":{"type":"string","title":"Cert Number","default":""},"match_basis":{"type":"string","title":"Match Basis"},"match_confidence":{"type":"number","title":"Match Confidence"}},"type":"object","required":["cadet_name","match_basis","match_confidence"],"title":"ClassMemberOut"},"ClassOut":{"properties":{"id":{"type":"integer","title":"Id","default":0},"kind":{"type":"string","title":"Kind"},"academy_slug":{"type":"string","title":"Academy Slug"},"academy_name":{"type":"string","title":"Academy Name"},"cert_year":{"type":"integer","title":"Cert Year"},"class_number":{"type":"integer","title":"Class Number"},"graduation_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Graduation Date"},"cadet_count":{"type":"integer","title":"Cadet Count"},"photo_url":{"type":"string","title":"Photo Url","default":""},"photo_credit":{"type":"string","title":"Photo Credit","default":""},"photo_source_url":{"type":"string","title":"Photo Source Url","default":""},"photo_alt":{"type":"string","title":"Photo Alt","default":""},"profile":{"additionalProperties":{"type":"integer"},"type":"object","title":"Profile"},"members":{"items":{"$ref":"#/components/schemas/ClassMemberOut"},"type":"array","title":"Members"},"match_note":{"type":"string","title":"Match Note","default":""}},"type":"object","required":["kind","academy_slug","academy_name","cert_year","class_number","graduation_date","cadet_count"],"title":"ClassOut"},"ClearFlagIn":{"properties":{"note":{"type":"string","maxLength":300,"title":"Note","default":""}},"type":"object","title":"ClearFlagIn"},"CodeIn":{"properties":{"code":{"type":"string","maxLength":24,"title":"Code","default":""},"recovery_code":{"type":"string","maxLength":32,"title":"Recovery Code","default":""}},"type":"object","title":"CodeIn","description":"A six-digit code, or one of the single-use recovery codes."},"CodeOut":{"properties":{"code":{"type":"string","title":"Code"},"kind":{"type":"string","title":"Kind"},"ref":{"type":"string","title":"Ref"},"label":{"type":"string","title":"Label"},"is_active":{"type":"boolean","title":"Is Active"},"scan_count":{"type":"integer","title":"Scan Count"},"resolves_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolves To"}},"type":"object","required":["code","kind","ref","label","is_active","scan_count","resolves_to"],"title":"CodeOut"},"CollectionCreate":{"properties":{"market_slug":{"type":"string","title":"Market Slug"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["market_slug","slug","name"],"title":"CollectionCreate"},"CommentCreate":{"properties":{"body":{"type":"string","maxLength":10000,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"CommentCreate"},"CommentEdit":{"properties":{"body":{"type":"string","maxLength":10000,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"CommentEdit"},"CommentIn":{"properties":{"body":{"type":"string","maxLength":6000,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"CommentIn"},"CommentsIngestIn":{"properties":{"jurisdiction":{"type":"string","maxLength":160,"title":"Jurisdiction"},"document_id":{"type":"integer","title":"Document Id"},"meeting_date":{"type":"string","title":"Meeting Date","default":""},"body":{"type":"string","maxLength":160,"title":"Body","default":""}},"type":"object","required":["jurisdiction","document_id"],"title":"CommentsIngestIn","description":"Named public comment, read out of an archived minutes document."},"CompareCell":{"properties":{"stated":{"type":"boolean","title":"Stated"},"value":{"title":"Value"},"quote":{"type":"string","title":"Quote","default":""},"locator":{"type":"string","title":"Locator","default":""},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"}},"type":"object","required":["stated"],"title":"CompareCell"},"CompareOut":{"properties":{"mode":{"type":"string","title":"Mode"},"a":{"type":"object","title":"A"},"b":{"type":"object","title":"B"},"same_unit":{"type":"boolean","title":"Same Unit"},"months":{"type":"integer","title":"Months"},"points":{"items":{"type":"object"},"type":"array","title":"Points"}},"type":"object","required":["mode","a","b","same_unit","months","points"],"title":"CompareOut"},"CompareRow":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"unit":{"type":"string","title":"Unit"},"verdict":{"type":"string","title":"Verdict"},"note":{"type":"string","title":"Note"},"staff_report":{"$ref":"#/components/schemas/CompareCell"},"enactment":{"$ref":"#/components/schemas/CompareCell"},"contract":{"$ref":"#/components/schemas/CompareCell"}},"type":"object","required":["key","label","unit","verdict","note","staff_report","enactment","contract"],"title":"CompareRow"},"ComparisonOut":{"properties":{"contract_id":{"type":"integer","title":"Contract Id"},"contract_title":{"type":"string","title":"Contract Title"},"contract_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Contract Date"},"staff_report_title":{"type":"string","title":"Staff Report Title"},"staff_report_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Staff Report Document Id"},"enactment_title":{"type":"string","title":"Enactment Title"},"enactment_number":{"type":"string","title":"Enactment Number"},"enactment_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Enactment Document Id"},"rows":{"items":{"$ref":"#/components/schemas/CompareRow"},"type":"array","title":"Rows"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"},"missing_sources":{"items":{"type":"string"},"type":"array","title":"Missing Sources"}},"type":"object","required":["contract_id","contract_title","contract_date","staff_report_title","staff_report_document_id","enactment_title","enactment_number","enactment_document_id","rows","counts","missing_sources"],"title":"ComparisonOut"},"ConductOut":{"properties":{"id":{"type":"integer","title":"Id"},"record_type":{"type":"string","title":"Record Type"},"valence":{"type":"string","title":"Valence"},"case_number":{"type":"string","title":"Case Number"},"allegations":{"type":"string","title":"Allegations"},"board_rules":{"type":"string","title":"Board Rules"},"reported_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Reported Date"},"disposition_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Disposition Date"},"disposition_class":{"type":"string","title":"Disposition Class"},"disposition_label":{"type":"string","title":"Disposition Label"},"disposition_sentence":{"type":"string","title":"Disposition Sentence"},"counts_against":{"type":"boolean","title":"Counts Against"},"disposition_outcome":{"type":"string","title":"Disposition Outcome"},"date_problem":{"type":"string","title":"Date Problem"},"agency_name":{"type":"string","title":"Agency Name","default":""},"officer_name":{"type":"string","title":"Officer Name","default":""},"officer_cert":{"type":"string","title":"Officer Cert","default":""},"tier":{"type":"string","title":"Tier","default":""},"tier_label":{"type":"string","title":"Tier Label","default":""},"disputed":{"type":"boolean","title":"Disputed","default":false},"replies":{"items":{"$ref":"#/components/schemas/ReplyOut"},"type":"array","title":"Replies"}},"type":"object","required":["id","record_type","valence","case_number","allegations","board_rules","reported_date","disposition_date","disposition_class","disposition_label","disposition_sentence","counts_against","disposition_outcome","date_problem"],"title":"ConductOut"},"ConfigOut":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"photo_max_bytes":{"type":"integer","title":"Photo Max Bytes"},"video_max_bytes":{"type":"integer","title":"Video Max Bytes"},"video_max_seconds":{"type":"integer","title":"Video Max Seconds"},"max_media_per_post":{"type":"integer","title":"Max Media Per Post"},"max_feed_sources":{"type":"integer","title":"Max Feed Sources"},"storage_cap_mb":{"type":"integer","title":"Storage Cap Mb"},"feed_page_size":{"type":"integer","title":"Feed Page Size"},"photo_exts":{"items":{"type":"string"},"type":"array","title":"Photo Exts"},"video_exts":{"items":{"type":"string"},"type":"array","title":"Video Exts"}},"type":"object","required":["enabled","photo_max_bytes","video_max_bytes","video_max_seconds","max_media_per_post","max_feed_sources","storage_cap_mb","feed_page_size","photo_exts","video_exts"],"title":"ConfigOut","description":"What the browser needs in order to validate before uploading, so a\nmember learns their file is too large before sending 300 MB of it."},"ConnectRequest":{"properties":{"agencyA":{"type":"string","title":"Agencya"},"agencyB":{"type":"string","title":"Agencyb"},"recordIdsA":{"items":{"type":"string"},"type":"array","title":"Recordidsa"},"recordIdsB":{"items":{"type":"string"},"type":"array","title":"Recordidsb"},"strictness":{"type":"integer","title":"Strictness","default":45},"blend":{"type":"integer","title":"Blend","default":58},"depth":{"type":"integer","title":"Depth","default":50},"maxConnections":{"type":"integer","title":"Maxconnections","default":12},"connectionsPerRecord":{"type":"integer","title":"Connectionsperrecord","default":3},"themeId":{"type":"string","title":"Themeid","default":""}},"type":"object","required":["agencyA","agencyB"],"title":"ConnectRequest"},"ContaminantCount":{"properties":{"name":{"type":"string","title":"Name"},"site_count":{"type":"integer","title":"Site Count"}},"type":"object","required":["name","site_count"],"title":"ContaminantCount"},"ContaminantSummary":{"properties":{"site_count_with_data":{"type":"integer","title":"Site Count With Data"},"distinct_contaminants":{"type":"integer","title":"Distinct Contaminants"},"top":{"items":{"$ref":"#/components/schemas/ContaminantCount"},"type":"array","title":"Top"}},"type":"object","required":["site_count_with_data","distinct_contaminants","top"],"title":"ContaminantSummary"},"ContextOut":{"properties":{"measure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Measure"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"month":{"type":"integer","title":"Month"},"standing":{"anyOf":[{"$ref":"#/components/schemas/StandingOut"},{"type":"null"}]},"trend_30d":{"anyOf":[{"$ref":"#/components/schemas/TrendOut"},{"type":"null"}]},"trend_365d":{"anyOf":[{"$ref":"#/components/schemas/TrendOut"},{"type":"null"}]},"drought_cat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drought Cat"},"drought_week":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drought Week"},"flood_space_af":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Flood Space Af"},"release_cfs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Release Cfs"},"release_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Release Date"},"release_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Release Note"}},"type":"object","required":["month"],"title":"ContextOut"},"ContractOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"vendor":{"type":"string","title":"Vendor"},"effective_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"term_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Term Months"},"camera_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Camera Count"},"annual_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Annual Amount"},"total_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Amount"},"auto_renew":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Renew"},"retention_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retention Days"},"approving_body":{"type":"string","title":"Approving Body"},"approval_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Approval Date"},"agenda_item_no":{"type":"string","title":"Agenda Item No"},"parent_contract_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Contract Id"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Url"},"source_url":{"type":"string","title":"Source Url"},"reviewed":{"type":"boolean","title":"Reviewed"},"funding_source":{"type":"string","title":"Funding Source"},"grant_program":{"type":"string","title":"Grant Program"},"grant_agency":{"type":"string","title":"Grant Agency"},"grant_number":{"type":"string","title":"Grant Number"},"cooperative_agreement":{"type":"string","title":"Cooperative Agreement"},"procurement_method":{"type":"string","title":"Procurement Method"},"signed_by":{"type":"string","title":"Signed By"},"signed_title":{"type":"string","title":"Signed Title"}},"type":"object","required":["id","kind","title","vendor","effective_date","end_date","term_months","camera_count","annual_amount","total_amount","auto_renew","retention_days","approving_body","approval_date","agenda_item_no","parent_contract_id","document_id","document_url","source_url","reviewed","funding_source","grant_program","grant_agency","grant_number","cooperative_agreement","procurement_method","signed_by","signed_title"],"title":"ContractOut"},"ContractPatch":{"properties":{"vendor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"camera_count":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Camera Count"},"retention_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":0.0},{"type":"null"}],"title":"Retention Days"},"term_months":{"anyOf":[{"type":"integer","maximum":600.0,"minimum":0.0},{"type":"null"}],"title":"Term Months"},"annual_amount":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Annual Amount"},"total_amount":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Total Amount"},"auto_renew":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Renew"},"approving_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approving Body"},"agenda_item_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda Item No"},"parent_contract_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Contract Id"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"clear":{"items":{"type":"string"},"type":"array","title":"Clear"},"reviewer":{"type":"string","maxLength":120,"minLength":1,"title":"Reviewer"}},"type":"object","required":["reviewer"],"title":"ContractPatch","description":"Hand-correct a field the extractor got wrong.\n\nEvery field is optional and None means \"leave it alone\" — which is why\nthere is a separate `clear` list. Without it there would be no way to\nremove a value the extractor invented, and an invented number is exactly\nthe thing a reviewer most needs to be able to take back out."},"ControlPointOut":{"properties":{"id":{"type":"integer","title":"Id"},"mission_id":{"type":"integer","title":"Mission Id"},"kind":{"type":"string","title":"Kind"},"label":{"type":"string","title":"Label"},"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"z":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Z"},"crs":{"type":"string","title":"Crs"},"source_file_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source File Id"},"observations":{"items":{},"type":"array","title":"Observations"},"meta":{"type":"object","title":"Meta"}},"type":"object","required":["id","mission_id","kind","label","x","y","z","crs","source_file_id","observations","meta"],"title":"ControlPointOut"},"CorpusMeta":{"properties":{"generated":{"type":"string","title":"Generated"},"schema_version":{"type":"integer","title":"Schema Version"},"title":{"type":"string","title":"Title"},"purpose":{"type":"string","title":"Purpose"},"tiers":{"additionalProperties":{"type":"string"},"type":"object","title":"Tiers"},"caveats":{"items":{"type":"string"},"type":"array","title":"Caveats"},"source_count":{"type":"integer","title":"Source Count"},"claim_count":{"type":"integer","title":"Claim Count"},"unread_count":{"type":"integer","title":"Unread Count"},"undated_count":{"type":"integer","title":"Undated Count"},"archived_count":{"type":"integer","title":"Archived Count"},"strength_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Strength Counts"},"tier_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tier Counts"}},"type":"object","required":["generated","schema_version","title","purpose","tiers","caveats","source_count","claim_count","unread_count","undated_count","archived_count","strength_counts","tier_counts"],"title":"CorpusMeta"},"CorrectionOut":{"properties":{"id":{"type":"integer","title":"Id"},"meeting_id":{"type":"integer","title":"Meeting Id"},"finding_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Finding Id"},"kind":{"type":"string","title":"Kind"},"body":{"type":"string","title":"Body"},"corrected_text":{"type":"string","title":"Corrected Text"},"timecode":{"type":"string","title":"Timecode"},"attested":{"type":"boolean","title":"Attested"},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"by":{"type":"string","title":"By","default":""}},"type":"object","required":["id","meeting_id","finding_id","kind","body","corrected_text","timecode","attested","status","created_at"],"title":"CorrectionOut"},"CorrectionReviewIn":{"properties":{"status":{"type":"string","pattern":"^(pending|accepted|rejected)$","title":"Status"},"note":{"type":"string","maxLength":4000,"title":"Note","default":""}},"type":"object","required":["status"],"title":"CorrectionReviewIn"},"CoverageOut":{"properties":{"caution":{"type":"string","title":"Caution"},"tiers":{"items":{"$ref":"#/components/schemas/CoverageTierOut"},"type":"array","title":"Tiers"},"states":{"items":{"$ref":"#/components/schemas/CoverageStateOut"},"type":"array","title":"States"}},"type":"object","required":["caution"],"title":"CoverageOut"},"CoverageStateOut":{"properties":{"state_code":{"type":"string","title":"State Code"},"name":{"type":"string","title":"Name"},"row":{"type":"integer","title":"Row"},"col":{"type":"integer","title":"Col"},"tier":{"type":"string","title":"Tier"},"officers":{"type":"integer","title":"Officers","default":0},"agencies":{"type":"integer","title":"Agencies","default":0},"registers":{"items":{"type":"string"},"type":"array","title":"Registers"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["state_code","name","row","col","tier"],"title":"CoverageStateOut","description":"One state's tile. `tier` is about OUR reach, never about its officers."},"CoverageTierOut":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"meaning":{"type":"string","title":"Meaning"},"count":{"type":"integer","title":"Count","default":0}},"type":"object","required":["key","label","meaning"],"title":"CoverageTierOut"},"CrossingOut":{"properties":{"a_cert":{"type":"string","title":"A Cert"},"a_state":{"type":"string","title":"A State"},"a_state_name":{"type":"string","title":"A State Name"},"a_name":{"type":"string","title":"A Name"},"a_agency":{"type":"string","title":"A Agency"},"a_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"A End"},"b_cert":{"type":"string","title":"B Cert"},"b_state":{"type":"string","title":"B State"},"b_state_name":{"type":"string","title":"B State Name"},"b_name":{"type":"string","title":"B Name"},"b_agency":{"type":"string","title":"B Agency"},"b_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"B Start"},"gap_days":{"type":"integer","title":"Gap Days"},"middle_initial":{"type":"string","title":"Middle Initial"},"surname_count":{"type":"integer","title":"Surname Count"},"strength":{"type":"string","title":"Strength"},"status":{"type":"string","title":"Status"},"resolution_note":{"type":"string","title":"Resolution Note","default":""}},"type":"object","required":["a_cert","a_state","a_state_name","a_name","a_agency","a_end","b_cert","b_state","b_state_name","b_name","b_agency","b_start","gap_days","middle_initial","surname_count","strength","status"],"title":"CrossingOut","description":"A POSSIBLE crossing of a state line by one officer. Never a merge.\n\nEvery field a reader needs to disagree with us is on the row, including the\nsurname frequency — because on this evidence a reader who says \"Martinez is\na common name, that proves nothing\" is RIGHT, and the page should hand them\nwhat they need to say so rather than assert a match."},"CrossoverIn":{"properties":{"tweeter_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tweeter On"},"push_replies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Replies"},"push_mentions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Mentions"},"push_amplifies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Amplifies"},"push_applause":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Applause"},"push_follows":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Follows"},"push_instag_likes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Instag Likes"},"push_instag_comments":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Instag Comments"},"push_instag_follows":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Instag Follows"},"push_instag_mentions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Instag Mentions"},"quiet_from_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quiet From Min"},"quiet_to_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quiet To Min"},"tz_offset_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tz Offset Min"},"urgent_breaks_quiet":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Urgent Breaks Quiet"},"stations":{"anyOf":[{"items":{"$ref":"#/components/schemas/StationSwitch"},"type":"array"},{"type":"null"}],"title":"Stations"}},"type":"object","title":"CrossoverIn"},"CurrentOut":{"properties":{"elevation_ft":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Elevation Ft"},"elevation_observed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Elevation Observed At"},"elevation_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Elevation Source"},"elevation_is_daily":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Elevation Is Daily"},"storage_af":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Storage Af"},"storage_observed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Observed At"},"storage_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Source"},"pct_full":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Full"}},"type":"object","title":"CurrentOut","description":"The freshest reading per measure, each tagged with where it came from\n(usgs | cda | cdec | twdb | rise | snapshot) and when it was observed."},"DailyCount":{"properties":{"day":{"type":"string","format":"date","title":"Day"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["day","count"],"title":"DailyCount"},"DeckIn":{"properties":{"text":{"type":"string","maxLength":800000,"title":"Text","default":""},"commit":{"type":"boolean","title":"Commit","default":false},"replace":{"type":"boolean","title":"Replace","default":false}},"type":"object","title":"DeckIn"},"DeclareClass":{"properties":{"accuracy_class":{"type":"string","title":"Accuracy Class"}},"type":"object","required":["accuracy_class"],"title":"DeclareClass"},"DeleteIn":{"properties":{"confirm_email":{"type":"string","maxLength":320,"title":"Confirm Email"},"password":{"type":"string","maxLength":400,"title":"Password","default":""}},"type":"object","required":["confirm_email"],"title":"DeleteIn"},"DeskIn":{"properties":{"hidden":{"type":"boolean","title":"Hidden"},"reason":{"type":"string","maxLength":300,"title":"Reason","default":""}},"type":"object","required":["hidden"],"title":"DeskIn"},"DetailOut":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"dam":{"type":"string","title":"Dam"},"river":{"type":"string","title":"River"},"states":{"items":{"type":"string"},"type":"array","title":"States"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"tz":{"type":"string","title":"Tz"},"capacity_af":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Capacity Af"},"capacity_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity Source"},"capacity_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity Date"},"capacity_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity Basis"},"full_pool_ft":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Full Pool Ft"},"dead_pool_ft":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dead Pool Ft"},"elevation_datum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Elevation Datum"},"why":{"type":"string","title":"Why"},"system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System"},"current":{"$ref":"#/components/schemas/CurrentOut"},"context":{"anyOf":[{"$ref":"#/components/schemas/ContextOut"},{"type":"null"}]},"snow":{"anyOf":[{"$ref":"#/components/schemas/SnowOut"},{"type":"null"}]},"hydrograph":{"anyOf":[{"$ref":"#/components/schemas/HydrographOut"},{"type":"null"}]},"record":{"anyOf":[{"$ref":"#/components/schemas/RecordOut"},{"type":"null"}]}},"type":"object","required":["slug","name","dam","river","states","lat","lng","tz","why","current"],"title":"DetailOut"},"Detected":{"properties":{"format":{"type":"string","title":"Format"},"label":{"type":"string","title":"Label"},"family":{"type":"string","title":"Family"},"version":{"type":"string","title":"Version","default":""},"era":{"type":"string","title":"Era","default":""},"mime":{"type":"string","title":"Mime"},"confidence":{"type":"number","title":"Confidence"},"evidence":{"items":{"type":"string"},"type":"array","title":"Evidence"},"extension":{"type":"string","title":"Extension","default":""},"extension_mismatch":{"type":"boolean","title":"Extension Mismatch","default":false}},"type":"object","required":["format","label","family","mime","confidence","evidence"],"title":"Detected"},"DeviceDetail":{"properties":{"mac":{"type":"string","title":"Mac"},"band":{"type":"string","title":"Band"},"vendor":{"type":"string","title":"Vendor"},"ssid":{"type":"string","title":"Ssid"},"label":{"type":"string","title":"Label"},"classification":{"type":"string","title":"Classification"},"is_randomized":{"type":"boolean","title":"Is Randomized"},"rssi":{"type":"integer","title":"Rssi"},"channel":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channel"},"proximity":{"type":"string","title":"Proximity"},"persistence":{"type":"string","title":"Persistence"},"minutes_seen":{"type":"integer","title":"Minutes Seen"},"sighting_count":{"type":"integer","title":"Sighting Count"},"node_id":{"type":"string","title":"Node Id"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"},"oui":{"type":"string","title":"Oui"},"first_seen_at":{"type":"string","format":"date-time","title":"First Seen At"},"history":{"items":{"$ref":"#/components/schemas/SightingPoint"},"type":"array","title":"History"}},"type":"object","required":["mac","band","vendor","ssid","label","classification","is_randomized","rssi","channel","proximity","persistence","minutes_seen","sighting_count","node_id","last_seen_at","oui","first_seen_at","history"],"title":"DeviceDetail"},"DeviceOut":{"properties":{"mac":{"type":"string","title":"Mac"},"band":{"type":"string","title":"Band"},"vendor":{"type":"string","title":"Vendor"},"ssid":{"type":"string","title":"Ssid"},"label":{"type":"string","title":"Label"},"classification":{"type":"string","title":"Classification"},"is_randomized":{"type":"boolean","title":"Is Randomized"},"rssi":{"type":"integer","title":"Rssi"},"channel":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channel"},"proximity":{"type":"string","title":"Proximity"},"persistence":{"type":"string","title":"Persistence"},"minutes_seen":{"type":"integer","title":"Minutes Seen"},"sighting_count":{"type":"integer","title":"Sighting Count"},"node_id":{"type":"string","title":"Node Id"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"}},"type":"object","required":["mac","band","vendor","ssid","label","classification","is_randomized","rssi","channel","proximity","persistence","minutes_seen","sighting_count","node_id","last_seen_at"],"title":"DeviceOut"},"DifferenceIn":{"properties":{"a":{"type":"integer","title":"A"},"b":{"type":"integer","title":"B"},"surface":{"type":"string","title":"Surface","default":"dsm"}},"type":"object","required":["a","b"],"title":"DifferenceIn"},"DirectoryPage":{"properties":{"status":{"$ref":"#/components/schemas/MeshStatusOut"},"sections":{"items":{"$ref":"#/components/schemas/SectionWithCount"},"type":"array","title":"Sections"},"active_section":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__SectionOut"},{"type":"null"}]},"featured":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__ListingOut"},{"type":"null"}]},"listings":{"items":{"$ref":"#/components/schemas/app__schemas__ListingOut"},"type":"array","title":"Listings"}},"type":"object","required":["status","sections","listings"],"title":"DirectoryPage"},"DisableIn":{"properties":{"code":{"type":"string","maxLength":24,"title":"Code","default":""},"recovery_code":{"type":"string","maxLength":32,"title":"Recovery Code","default":""},"password":{"type":"string","maxLength":200,"title":"Password","default":""}},"type":"object","title":"DisableIn"},"DisciplineCandidateOut":{"properties":{"state_code":{"type":"string","title":"State Code"},"state_name":{"type":"string","title":"State Name"},"name":{"type":"string","title":"Name"},"agency_name":{"type":"string","title":"Agency Name"},"rank":{"type":"string","title":"Rank","default":""},"allegation":{"type":"string","title":"Allegation","default":""},"outcome_raw":{"type":"string","title":"Outcome Raw"},"outcome_sentence":{"type":"string","title":"Outcome Sentence","default":""},"counts_against":{"type":"boolean","title":"Counts Against","default":false},"occurred_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Occurred On"},"decided_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Decided On"},"surname_count":{"type":"integer","title":"Surname Count","default":0},"caution":{"type":"string","title":"Caution"}},"type":"object","required":["state_code","state_name","name","agency_name","outcome_raw","caution"],"title":"DisciplineCandidateOut","description":"The same record, surfaced on a local officer's page as a QUESTION.\n\nEverything a reader needs to disbelieve it travels with it. The link is a\nname and nothing more — these are different states' identifiers with no key\njoining them — so `caution` is rendered by the API and says exactly that."},"DisciplineOut":{"properties":{"state_code":{"type":"string","title":"State Code"},"state_name":{"type":"string","title":"State Name"},"name":{"type":"string","title":"Name"},"agency_name":{"type":"string","title":"Agency Name"},"rank":{"type":"string","title":"Rank","default":""},"allegation":{"type":"string","title":"Allegation","default":""},"outcome_raw":{"type":"string","title":"Outcome Raw"},"outcome_sentence":{"type":"string","title":"Outcome Sentence","default":""},"counts_against":{"type":"boolean","title":"Counts Against","default":false},"occurred_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Occurred On"},"decided_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Decided On"},"surname_count":{"type":"integer","title":"Surname Count","default":0}},"type":"object","required":["state_code","state_name","name","agency_name","outcome_raw"],"title":"DisciplineOut","description":"One decertification record from a state this platform does not serve."},"DisciplineRegisterOut":{"properties":{"what_it_is":{"type":"string","title":"What It Is"},"why_separate":{"type":"string","title":"Why Separate"},"basis":{"additionalProperties":{"type":"string"},"type":"object","title":"Basis"},"total":{"type":"integer","title":"Total","default":0},"by_state":{"items":{"type":"object"},"type":"array","title":"By State"},"adverse":{"type":"integer","title":"Adverse","default":0},"cleared":{"type":"integer","title":"Cleared","default":0},"unworded":{"type":"integer","title":"Unworded","default":0},"local_candidates":{"type":"integer","title":"Local Candidates","default":0},"records":{"items":{"$ref":"#/components/schemas/DisciplineOut"},"type":"array","title":"Records"}},"type":"object","required":["what_it_is","why_separate"],"title":"DisciplineRegisterOut"},"DisclosureIn":{"properties":{"jurisdiction":{"type":"string","maxLength":160,"title":"Jurisdiction"},"request_ref":{"type":"string","maxLength":120,"title":"Request Ref"},"description":{"type":"string","title":"Description","default":""},"custodians":{"type":"string","title":"Custodians","default":""},"covers_from":{"type":"string","title":"Covers From","default":""},"covers_to":{"type":"string","title":"Covers To","default":""},"messages_searched":{"type":"integer","title":"Messages Searched","default":0},"messages_matching":{"type":"integer","title":"Messages Matching","default":0},"received_at":{"type":"string","title":"Received At","default":""}},"type":"object","required":["jurisdiction","request_ref"],"title":"DisclosureIn"},"DisclosureOut":{"properties":{"request_ref":{"type":"string","title":"Request Ref"},"description":{"type":"string","title":"Description"},"custodians":{"items":{"type":"string"},"type":"array","title":"Custodians"},"covers_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Covers From"},"covers_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Covers To"},"messages_searched":{"type":"integer","title":"Messages Searched"},"messages_matching":{"type":"integer","title":"Messages Matching"},"received_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Received At"}},"type":"object","required":["request_ref","description","custodians","covers_from","covers_to","messages_searched","messages_matching","received_at"],"title":"DisclosureOut","description":"What a records disclosure covered. Shown whether or not it found\nanything, because an empty result is only readable next to its scope."},"DiscoveredMeeting":{"properties":{"title":{"type":"string","title":"Title"},"video_url":{"type":"string","title":"Video Url"},"meeting_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Date"}},"type":"object","required":["title","video_url"],"title":"DiscoveredMeeting","description":"A meeting found by the residential channel-watcher (scripts/watch_meetings.py)."},"DiscrepancyIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"other"},"body":{"type":"string","title":"Body","default":""},"run_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run Id"}},"type":"object","title":"DiscrepancyIn"},"DnsRecords":{"properties":{"mx":{"items":{"type":"string"},"type":"array","title":"Mx"},"ns":{"items":{"type":"string"},"type":"array","title":"Ns"},"txt":{"items":{"type":"string"},"type":"array","title":"Txt"},"caa":{"items":{"type":"string"},"type":"array","title":"Caa"}},"type":"object","required":["mx","ns","txt","caa"],"title":"DnsRecords"},"DocumentIngestIn":{"properties":{"jurisdiction":{"type":"string","maxLength":160,"title":"Jurisdiction"},"document_id":{"type":"integer","title":"Document Id"},"role":{"type":"string","title":"Role","description":"contract | staff_report"},"kind":{"type":"string","maxLength":20,"title":"Kind","default":"original"},"title":{"type":"string","maxLength":300,"title":"Title","default":""},"vendor":{"type":"string","maxLength":160,"title":"Vendor","default":"Flock Safety"},"doc_date":{"type":"string","title":"Doc Date","default":""},"body":{"type":"string","maxLength":160,"title":"Body","default":""},"agenda_item_no":{"type":"string","maxLength":60,"title":"Agenda Item No","default":""},"contract_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Id"},"page_hits":{"items":{"type":"integer"},"type":"array","title":"Page Hits"},"source_page_url":{"type":"string","maxLength":800,"title":"Source Page Url","default":""},"packet_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Packet Document Id"}},"type":"object","required":["jurisdiction","document_id","role"],"title":"DocumentIngestIn","description":"One swept document, already archived, to be read and filed."},"DocumentOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"remote_url":{"type":"string","title":"Remote Url"},"source_page_url":{"type":"string","title":"Source Page Url"},"mime_type":{"type":"string","title":"Mime Type"},"byte_size":{"type":"integer","title":"Byte Size"}},"type":"object","required":["id","kind","title","remote_url","source_page_url","mime_type","byte_size"],"title":"DocumentOut"},"DonorIn":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name","default":""},"shoutout":{"type":"string","maxLength":400,"title":"Shoutout","default":""},"amount":{"type":"string","maxLength":40,"title":"Amount","default":""},"date":{"type":"string","maxLength":40,"title":"Date","default":""},"in_kind":{"type":"string","maxLength":200,"title":"In Kind","default":""},"in_game":{"type":"boolean","title":"In Game","default":false},"trade":{"type":"string","maxLength":160,"title":"Trade","default":""},"avatar":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Avatar"},"art_has_name":{"type":"boolean","title":"Art Has Name","default":false},"stage_name":{"type":"string","maxLength":120,"title":"Stage Name","default":""},"published":{"type":"boolean","title":"Published","default":false}},"type":"object","title":"DonorIn","description":"One row, as the desk sends it.\n\n`name` defaults to empty and empty means anonymous — the model docstring in\nmodels.Donor explains why that is the whole mechanism and not a shortcut."},"DraftIn":{"properties":{"to":{"type":"string","maxLength":600,"title":"To","default":""},"cc":{"type":"string","maxLength":600,"title":"Cc","default":""},"bcc":{"type":"string","maxLength":600,"title":"Bcc","default":""},"subject":{"type":"string","maxLength":200,"title":"Subject","default":""},"body":{"type":"string","maxLength":100000,"title":"Body","default":""},"in_reply_to":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"In Reply To"}},"type":"object","title":"DraftIn"},"DropoffOut":{"properties":{"line1":{"type":"string","title":"Line1","default":""},"line2":{"type":"string","title":"Line2","default":""},"city":{"type":"string","title":"City","default":""},"notes":{"type":"string","title":"Notes","default":""},"lat":{"type":"number","title":"Lat","default":0.0},"lng":{"type":"number","title":"Lng","default":0.0},"contact_phone":{"type":"string","title":"Contact Phone","default":""},"handoff_code":{"type":"string","title":"Handoff Code","default":""}},"type":"object","title":"DropoffOut","description":"The ONLY place an address or a phone number leaves this module.\n\nServed by one endpoint, to the customer, the store, or the claimed driver\ninside the grace window. Nothing else in this file constructs one."},"DurationBucket":{"properties":{"label":{"type":"string","title":"Label"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["label","count"],"title":"DurationBucket"},"EmailAdminOut":{"properties":{"id":{"type":"integer","title":"Id"},"jurisdiction":{"type":"string","title":"Jurisdiction"},"kind":{"type":"string","title":"Kind"},"subject":{"type":"string","title":"Subject"},"sender":{"type":"string","title":"Sender"},"recipients":{"type":"string","title":"Recipients"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"custodian":{"type":"string","title":"Custodian"},"request_ref":{"type":"string","title":"Request Ref"},"excerpt":{"type":"string","title":"Excerpt"},"matched_terms":{"type":"string","title":"Matched Terms"},"redacted":{"type":"boolean","title":"Redacted"},"withheld":{"type":"boolean","title":"Withheld"},"withheld_reason":{"type":"string","title":"Withheld Reason"},"withheld_by":{"type":"string","title":"Withheld By"},"reviewed_by":{"type":"string","title":"Reviewed By"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"}},"type":"object","required":["id","jurisdiction","kind","subject","sender","recipients","sent_at","custodian","request_ref","excerpt","matched_terms","redacted","withheld","withheld_reason","withheld_by","reviewed_by","document_id"],"title":"EmailAdminOut","description":"An email as the ADMIN sees it - correspondents included.\n\nThe public payload withholds sender and recipients on a redacted row. A\nreviewer deciding whether a row belongs on the site has to see what it\nactually is, so this endpoint shows them. It is behind the admin token and\nnothing here is served to a reader."},"EmailIn":{"properties":{"jurisdiction":{"type":"string","maxLength":160,"title":"Jurisdiction"},"source_ref":{"type":"string","maxLength":200,"title":"Source Ref"},"request_ref":{"type":"string","maxLength":120,"title":"Request Ref","default":""},"subject":{"type":"string","maxLength":400,"title":"Subject","default":""},"sender":{"type":"string","maxLength":300,"title":"Sender","default":""},"recipients":{"type":"string","title":"Recipients","default":""},"sent_at":{"type":"string","title":"Sent At","default":""},"custodian":{"type":"string","maxLength":200,"title":"Custodian","default":""},"excerpt":{"type":"string","title":"Excerpt","default":""},"matched_terms":{"items":{"type":"string"},"type":"array","title":"Matched Terms"},"kind":{"type":"string","maxLength":24,"title":"Kind","default":"correspondence"},"redacted":{"type":"boolean","title":"Redacted","default":false}},"type":"object","required":["jurisdiction","source_ref"],"title":"EmailIn"},"EmailOut":{"properties":{"id":{"type":"integer","title":"Id"},"subject":{"type":"string","title":"Subject"},"sender":{"type":"string","title":"Sender"},"recipients":{"type":"string","title":"Recipients"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"custodian":{"type":"string","title":"Custodian"},"request_ref":{"type":"string","title":"Request Ref"},"excerpt":{"type":"string","title":"Excerpt"},"matched_terms":{"items":{"type":"string"},"type":"array","title":"Matched Terms"},"kind":{"type":"string","title":"Kind"}},"type":"object","required":["id","subject","sender","recipients","sent_at","custodian","request_ref","excerpt","matched_terms","kind"],"title":"EmailOut"},"EmailPatch":{"properties":{"kind":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Kind"},"redacted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Redacted"},"withheld":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Withheld"},"withheld_reason":{"type":"string","maxLength":300,"title":"Withheld Reason","default":""},"reviewer":{"type":"string","maxLength":120,"minLength":1,"title":"Reviewer"}},"type":"object","required":["reviewer"],"title":"EmailPatch","description":"Change what an email row is, or take it out of public view."},"EmploymentOut":{"properties":{"agency_slug":{"type":"string","title":"Agency Slug"},"agency_name":{"type":"string","title":"Agency Name"},"agency_type":{"type":"string","title":"Agency Type"},"rank":{"type":"string","title":"Rank"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"separation_reason":{"type":"string","title":"Separation Reason"},"open_as_of":{"type":"boolean","title":"Open As Of"},"as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of"},"date_problem":{"type":"string","title":"Date Problem"},"duration_days":{"type":"integer","title":"Duration Days","default":0},"duration":{"type":"string","title":"Duration","default":""}},"type":"object","required":["agency_slug","agency_name","agency_type","rank","start_date","end_date","separation_reason","open_as_of","as_of","date_problem"],"title":"EmploymentOut"},"EnactmentIn":{"properties":{"jurisdiction":{"type":"string","maxLength":160,"title":"Jurisdiction"},"document_id":{"type":"integer","title":"Document Id"},"contract_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Id"},"kind":{"type":"string","maxLength":20,"title":"Kind","default":"resolution"},"number":{"type":"string","maxLength":60,"title":"Number","default":""},"title":{"type":"string","maxLength":300,"title":"Title","default":""},"body":{"type":"string","maxLength":160,"title":"Body","default":""},"adopted_date":{"type":"string","title":"Adopted Date","default":""},"page_hits":{"items":{"type":"integer"},"type":"array","title":"Page Hits"},"vote_unanimous":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vote Unanimous"},"vote_yes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vote Yes"},"vote_no":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vote No"},"source_page_url":{"type":"string","maxLength":800,"title":"Source Page Url","default":""},"packet_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Packet Document Id"}},"type":"object","required":["jurisdiction","document_id"],"title":"EnactmentIn","description":"The ordinance or resolution a body actually passed."},"EnvSnapshotOut":{"properties":{"market_slug":{"type":"string","title":"Market Slug"},"market_name":{"type":"string","title":"Market Name"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"cached":{"type":"boolean","title":"Cached"},"stale":{"type":"boolean","title":"Stale"},"air":{"type":"object","title":"Air"},"water":{"type":"object","title":"Water"},"alerts":{"type":"object","title":"Alerts"},"quakes":{"type":"object","title":"Quakes"},"superfund":{"type":"object","title":"Superfund"}},"type":"object","required":["market_slug","market_name","lat","lng","generated_at","cached","stale","air","water","alerts","quakes","superfund"],"title":"EnvSnapshotOut"},"EpisodeIn":{"properties":{"slug":{"type":"string","maxLength":120,"title":"Slug","default":""},"section":{"type":"string","maxLength":80,"title":"Section","default":""},"number":{"type":"integer","title":"Number","default":0},"title":{"type":"string","maxLength":300,"title":"Title","default":""},"subtitle":{"type":"string","maxLength":300,"title":"Subtitle","default":""},"status":{"type":"string","title":"Status","default":"draft"},"recorded_on":{"type":"string","title":"Recorded On","default":""},"published_on":{"type":"string","title":"Published On","default":""},"runtime_seconds":{"type":"integer","title":"Runtime Seconds","default":0},"blurb":{"type":"string","title":"Blurb","default":""},"description":{"type":"string","title":"Description","default":""},"hosts":{"items":{"type":"string"},"type":"array","title":"Hosts"},"guests":{"items":{"type":"string"},"type":"array","title":"Guests"},"markers":{"items":{"type":"object"},"type":"array","title":"Markers"},"links":{"items":{"type":"object"},"type":"array","title":"Links"},"credits":{"type":"string","title":"Credits","default":""},"tape":{"type":"object","title":"Tape"},"theme":{"type":"string","title":"Theme","default":""},"preview":{"type":"string","title":"Preview","default":""},"preview_seconds":{"type":"integer","title":"Preview Seconds","default":0},"price":{"$ref":"#/components/schemas/PriceIn"}},"type":"object","title":"EpisodeIn"},"EventIn":{"properties":{"id":{"type":"integer","title":"Id"},"event":{"type":"string","title":"Event"}},"type":"object","required":["id","event"],"title":"EventIn"},"EventItem":{"properties":{"event_type":{"type":"string","title":"Event Type"},"event_date":{"type":"string","format":"date","title":"Event Date"},"label":{"type":"string","title":"Label"},"is_projected":{"type":"boolean","title":"Is Projected"}},"type":"object","required":["event_type","event_date","label","is_projected"],"title":"EventItem"},"ExternalAccountIn":{"properties":{"label":{"type":"string","maxLength":120,"title":"Label","default":""},"address":{"type":"string","maxLength":200,"title":"Address","default":""},"pop_host":{"type":"string","maxLength":200,"title":"Pop Host"},"pop_port":{"type":"integer","title":"Pop Port","default":995},"security":{"type":"string","maxLength":8,"title":"Security","default":"ssl"},"username":{"type":"string","maxLength":200,"title":"Username"},"password":{"type":"string","maxLength":500,"title":"Password"},"delete_after_fetch":{"type":"boolean","title":"Delete After Fetch","default":false}},"type":"object","required":["pop_host","username","password"],"title":"ExternalAccountIn"},"FailIn":{"properties":{"error":{"type":"string","title":"Error","default":""},"log_excerpt":{"type":"string","title":"Log Excerpt","default":""},"cancelled":{"type":"boolean","title":"Cancelled","default":false}},"type":"object","title":"FailIn"},"FeedIn":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"}},"type":"object","required":["name","url"],"title":"FeedIn"},"FeedPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PostOut"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"FeedPage","description":"Cursor-paged, and deliberately WITHOUT a `total`.\n\nCounting every row matching the feed predicate is the expensive half of\nthe query and nothing in the interface displays the number. If a later\nchange adds `total` back \"for consistency\" with the offset-paged endpoints\nelsewhere, it will be paying for an unbounded COUNT on every scroll."},"FeedSourceIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"market"},"key":{"type":"string","title":"Key"}},"type":"object","required":["key"],"title":"FeedSourceIn"},"FeedSourceOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"}},"type":"object","required":["id","kind","key","label"],"title":"FeedSourceOut"},"FileInfo":{"properties":{"name":{"type":"string","title":"Name"},"size_bytes":{"type":"integer","title":"Size Bytes"},"pdf_version":{"type":"string","title":"Pdf Version"},"sha256":{"type":"string","title":"Sha256"},"md5":{"type":"string","title":"Md5"}},"type":"object","required":["name","size_bytes","pdf_version","sha256","md5"],"title":"FileInfo"},"FileOut":{"properties":{"id":{"type":"integer","title":"Id"},"mission_id":{"type":"integer","title":"Mission Id"},"original_name":{"type":"string","title":"Original Name"},"mime":{"type":"string","title":"Mime"},"bytes":{"type":"integer","title":"Bytes"},"sha256":{"type":"string","title":"Sha256"},"kind":{"type":"string","title":"Kind"},"format":{"type":"string","title":"Format"},"support_level":{"type":"string","title":"Support Level"},"uploaded_at":{"type":"string","format":"date-time","title":"Uploaded At"},"uploaded_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Uploaded By"},"captured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Captured At"},"camera_make":{"type":"string","title":"Camera Make"},"camera_model":{"type":"string","title":"Camera Model"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"alt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Alt"},"crs_info":{"type":"object","title":"Crs Info"},"privacy_state":{"type":"string","title":"Privacy State"},"duplicate_of_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duplicate Of Id"},"validation":{"type":"object","title":"Validation"},"exif":{"type":"object","title":"Exif"},"meta":{"type":"object","title":"Meta"},"download_url":{"type":"string","title":"Download Url"}},"type":"object","required":["id","mission_id","original_name","mime","bytes","sha256","kind","format","support_level","uploaded_at","uploaded_by","captured_at","camera_make","camera_model","width","height","lat","lng","alt","crs_info","privacy_state","duplicate_of_id","validation","exif","meta","download_url"],"title":"FileOut"},"FinishIn":{"properties":{"status":{"type":"string","title":"Status","default":"complete"},"engine_version":{"type":"string","title":"Engine Version","default":""},"container_image":{"type":"string","title":"Container Image","default":""},"resource_use":{"type":"object","title":"Resource Use"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"accuracy":{"type":"object","title":"Accuracy"},"log_excerpt":{"type":"string","title":"Log Excerpt","default":""}},"type":"object","title":"FinishIn"},"Flag":{"properties":{"level":{"type":"string","title":"Level"},"title":{"type":"string","title":"Title"},"detail":{"type":"string","title":"Detail"}},"type":"object","required":["level","title","detail"],"title":"Flag"},"FlagIn":{"properties":{"user_id":{"type":"integer","title":"User Id"},"reason":{"type":"string","maxLength":40,"title":"Reason"},"note":{"type":"string","maxLength":300,"title":"Note","default":""}},"type":"object","required":["user_id","reason"],"title":"FlagIn"},"FlagsIn":{"properties":{"is_read":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Read"},"is_starred":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Starred"},"folder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"}},"type":"object","title":"FlagsIn"},"FlockSummary":{"properties":{"agency_count":{"type":"integer","title":"Agency Count"},"state_count":{"type":"integer","title":"State Count"},"total_cameras":{"type":"integer","title":"Total Cameras"},"total_searches":{"type":"integer","title":"Total Searches"},"total_vehicles_captured":{"type":"integer","title":"Total Vehicles Captured"},"total_hotlist_hits":{"type":"integer","title":"Total Hotlist Hits"},"states":{"items":{"$ref":"#/components/schemas/app__routes_flock__StateRollup"},"type":"array","title":"States"},"top_reasons":{"items":{"$ref":"#/components/schemas/ReasonCount"},"type":"array","title":"Top Reasons"}},"type":"object","required":["agency_count","state_count","total_cameras","total_searches","total_vehicles_captured","total_hotlist_hits","states","top_reasons"],"title":"FlockSummary"},"FollowState":{"properties":{"status":{"type":"string","title":"Status"},"follower_count":{"type":"integer","title":"Follower Count"}},"type":"object","required":["status","follower_count"],"title":"FollowState"},"ForgotIn":{"properties":{"email":{"type":"string","maxLength":320,"title":"Email","default":""}},"type":"object","title":"ForgotIn"},"FormatRow":{"properties":{"format":{"type":"string","title":"Format"},"label":{"type":"string","title":"Label"},"family":{"type":"string","title":"Family"},"era":{"type":"string","title":"Era"},"extensions":{"items":{"type":"string"},"type":"array","title":"Extensions"},"support":{"type":"string","title":"Support"},"adapter":{"type":"string","title":"Adapter"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["format","label","family","era","extensions","support","adapter"],"title":"FormatRow"},"FormatsResponse":{"properties":{"tool":{"type":"string","title":"Tool"},"version":{"type":"string","title":"Version"},"formats":{"items":{"$ref":"#/components/schemas/FormatRow"},"type":"array","title":"Formats"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"}},"type":"object","required":["tool","version","formats","counts"],"title":"FormatsResponse"},"FreshnessOut":{"properties":{"kind":{"type":"string","title":"Kind"},"label":{"type":"string","title":"Label"},"retrieved":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Retrieved"},"covers":{"type":"string","title":"Covers","default":""},"row_count":{"type":"integer","title":"Row Count","default":0},"caution":{"type":"string","title":"Caution","default":""}},"type":"object","required":["kind","label"],"title":"FreshnessOut","description":"One source: when we fetched it, and what period it actually covers.\n\nTHESE ARE NOT THE SAME DATE and the module was conflating them. The Risk\nManagement payouts were retrieved today and describe fiscal 2023; the\nInternal Affairs figures were retrieved today and span 2011 to 2025. A\nsingle \"as of\" makes a three-year-old fact look like this morning's.\n\n`covers` is COMPUTED from the rows themselves rather than declared, so it\ncannot drift away from what is actually stored."},"GapIn":{"properties":{"jurisdiction":{"type":"string","maxLength":160,"title":"Jurisdiction"},"missing":{"type":"string","maxLength":40,"title":"Missing"},"detail":{"type":"string","title":"Detail","default":""}},"type":"object","required":["jurisdiction","missing"],"title":"GapIn"},"GapOut":{"properties":{"missing":{"type":"string","title":"Missing"},"label":{"type":"string","title":"Label"},"detail":{"type":"string","title":"Detail"}},"type":"object","required":["missing","label","detail"],"title":"GapOut"},"GardenTown":{"properties":{"market":{"type":"string","title":"Market"},"market_name":{"type":"string","title":"Market Name"},"garden_name":{"type":"string","title":"Garden Name"},"varieties":{"type":"integer","title":"Varieties"},"gardeners":{"type":"integer","title":"Gardeners"},"path":{"type":"string","title":"Path"}},"type":"object","required":["market","market_name","garden_name","varieties","gardeners","path"],"title":"GardenTown"},"GoogleProveIn":{"properties":{"claimed_count":{"type":"integer","maximum":10000000.0,"minimum":0.0,"title":"Claimed Count"}},"type":"object","required":["claimed_count"],"title":"GoogleProveIn"},"GoogleStartIn":{"properties":{"gmail_address":{"type":"string","maxLength":320,"minLength":3,"title":"Gmail Address"}},"type":"object","required":["gmail_address"],"title":"GoogleStartIn"},"GoogleStepIn":{"properties":{"step":{"type":"string","maxLength":20,"minLength":1,"title":"Step"}},"type":"object","required":["step"],"title":"GoogleStepIn"},"GrantIn":{"properties":{"email":{"type":"string","title":"Email"},"pen":{"type":"string","title":"Pen"}},"type":"object","required":["email","pen"],"title":"GrantIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["ok","enabled"],"title":"HealthOut"},"HeartbeatIn":{"properties":{"capabilities":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Capabilities"}},"type":"object","title":"HeartbeatIn"},"HeatIn":{"properties":{"buckets":{"items":{"type":"integer"},"type":"array","title":"Buckets"},"token":{"type":"string","title":"Token","default":""}},"type":"object","title":"HeatIn"},"HeldIn":{"properties":{"filename":{"type":"string","maxLength":200,"title":"Filename","default":""},"bytes":{"type":"integer","title":"Bytes","default":0},"content_type":{"type":"string","maxLength":100,"title":"Content Type","default":""},"part_index":{"type":"integer","title":"Part Index","default":0}},"type":"object","title":"HeldIn"},"HireIn":{"properties":{"email":{"type":"string","title":"Email"},"on":{"type":"boolean","title":"On","default":true}},"type":"object","required":["email"],"title":"HireIn"},"Hit":{"properties":{"path":{"type":"string","maxLength":2000,"title":"Path","default":""},"referrer":{"type":"string","maxLength":2000,"title":"Referrer","default":""},"tz":{"type":"string","maxLength":60,"title":"Tz","default":""},"lang":{"type":"string","maxLength":35,"title":"Lang","default":""}},"type":"object","title":"Hit"},"HoldIn":{"properties":{"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"HoldIn"},"HoldingOut":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"count":{"type":"integer","title":"Count","default":0},"detail":{"type":"string","title":"Detail","default":""},"href":{"type":"string","title":"Href","default":""},"absence_means":{"type":"string","title":"Absence Means","default":""}},"type":"object","required":["key","label"],"title":"HoldingOut","description":"One register, and what we hold in it FOR THIS AGENCY.\n\n`count` of zero is not the end of the sentence. Every register here can be\nempty for two different reasons — nothing happened, or nobody publishes it —\nand `absence_means` says which, per agency, so a reader never has to guess\nfrom a blank."},"HoldingsOut":{"properties":{"agency_slug":{"type":"string","title":"Agency Slug"},"agency_name":{"type":"string","title":"Agency Name"},"holdings":{"items":{"$ref":"#/components/schemas/HoldingOut"},"type":"array","title":"Holdings"}},"type":"object","required":["agency_slug","agency_name"],"title":"HoldingsOut"},"HttpInfo":{"properties":{"status":{"type":"integer","title":"Status"},"server":{"type":"string","title":"Server"},"final_url":{"type":"string","title":"Final Url"},"security_headers":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Security Headers"},"error":{"type":"string","title":"Error"}},"type":"object","required":["status","server","final_url","security_headers","error"],"title":"HttpInfo"},"HydrographOut":{"properties":{"days":{"type":"integer","title":"Days"},"unit":{"type":"string","title":"Unit"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"points":{"items":{"type":"object"},"type":"array","title":"Points"}},"type":"object","required":["days","unit","points"],"title":"HydrographOut"},"IaOut":{"properties":{"agency_slug":{"type":"string","title":"Agency Slug"},"meaning":{"type":"string","title":"Meaning"},"disagreement_note":{"type":"string","title":"Disagreement Note"},"reports":{"items":{"$ref":"#/components/schemas/IaReportOut"},"type":"array","title":"Reports"},"series":{"items":{"$ref":"#/components/schemas/IaSeriesOut"},"type":"array","title":"Series"}},"type":"object","required":["agency_slug","meaning","disagreement_note"],"title":"IaOut","description":"A department's own account of complaints against it and its use of force."},"IaPointOut":{"properties":{"for_year":{"type":"integer","title":"For Year"},"values":{"items":{"type":"number"},"type":"array","title":"Values"},"reported_in":{"items":{"type":"integer"},"type":"array","title":"Reported In"},"disputed":{"type":"boolean","title":"Disputed","default":false}},"type":"object","required":["for_year"],"title":"IaPointOut","description":"One year of one tracked series. `values` is a LIST because a department's\nown reports do not always agree with each other, and we publish both."},"IaReportOut":{"properties":{"year":{"type":"integer","title":"Year"},"pages":{"type":"integer","title":"Pages","default":0},"has_text_layer":{"type":"boolean","title":"Has Text Layer","default":true},"metric_count":{"type":"integer","title":"Metric Count","default":0},"unparsed":{"type":"string","title":"Unparsed","default":""},"page_url":{"type":"string","title":"Page Url","default":""},"pdf_url":{"type":"string","title":"Pdf Url","default":""},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["year"],"title":"IaReportOut"},"IaSeriesOut":{"properties":{"label":{"type":"string","title":"Label"},"unit":{"type":"string","title":"Unit","default":""},"points":{"items":{"$ref":"#/components/schemas/IaPointOut"},"type":"array","title":"Points"}},"type":"object","required":["label"],"title":"IaSeriesOut"},"IdentifyIn":{"properties":{"ref":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Ref"},"image_b64":{"anyOf":[{"type":"string","maxLength":12000000},{"type":"null"}],"title":"Image B64"},"hint":{"type":"string","maxLength":400,"title":"Hint","default":""}},"type":"object","title":"IdentifyIn","description":"Either a seed already in the library, or an uploaded photograph.\n\nTHERE IS NO URL FIELD, deliberately. An endpoint that fetches a URL a\ncaller supplies is a server-side request forgery primitive aimed at\neverything inside the network, and requiring https does not fix it. The\noriginal took a URL; this does not."},"IdentifyOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"available":{"type":"boolean","title":"Available"},"common_name":{"type":"string","title":"Common Name","default":""},"scientific_name":{"type":"string","title":"Scientific Name","default":""},"family":{"type":"string","title":"Family","default":""},"confidence":{"type":"string","title":"Confidence","default":""},"is_plant":{"type":"boolean","title":"Is Plant","default":true},"notes":{"type":"string","title":"Notes","default":""},"message":{"type":"string","title":"Message","default":""}},"type":"object","required":["ok","available"],"title":"IdentifyOut"},"ImportBatchIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ImportItemIn"},"type":"array","title":"Items"}},"type":"object","title":"ImportBatchIn"},"ImportFinishIn":{"properties":{"note":{"type":"string","maxLength":300,"title":"Note","default":""}},"type":"object","title":"ImportFinishIn"},"ImportItemIn":{"properties":{"message_id":{"type":"string","maxLength":200,"title":"Message Id","default":""},"from_name":{"type":"string","maxLength":120,"title":"From Name","default":""},"from_address":{"type":"string","maxLength":200,"title":"From Address","default":""},"to":{"items":{"type":"string"},"type":"array","title":"To"},"cc":{"items":{"type":"string"},"type":"array","title":"Cc"},"subject":{"type":"string","maxLength":400,"title":"Subject","default":""},"body":{"type":"string","title":"Body","default":""},"date":{"type":"string","title":"Date","default":""},"labels":{"items":{"type":"string"},"type":"array","title":"Labels"},"attachments":{"items":{"$ref":"#/components/schemas/HeldIn"},"type":"array","title":"Attachments"}},"type":"object","title":"ImportItemIn"},"ImportStartIn":{"properties":{"source":{"type":"string","maxLength":20,"title":"Source","default":"gmail"},"account":{"type":"string","maxLength":200,"title":"Account","default":""}},"type":"object","title":"ImportStartIn"},"IndexOut":{"properties":{"note":{"type":"string","title":"Note"},"baseline_month":{"type":"string","title":"Baseline Month"},"retrieved":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retrieved"},"indicators":{"items":{"$ref":"#/components/schemas/Indicator"},"type":"array","title":"Indicators"}},"type":"object","required":["note","baseline_month","indicators"],"title":"IndexOut"},"Indicator":{"properties":{"slug":{"type":"string","title":"Slug"},"series_id":{"type":"string","title":"Series Id"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"spark":{"items":{"type":"number"},"type":"array","title":"Spark","default":[]},"label":{"type":"string","title":"Label"},"category":{"type":"string","title":"Category"},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory"},"unit":{"type":"string","title":"Unit"},"kind":{"type":"string","title":"Kind"},"latest_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latest Value"},"latest_month":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Month"},"baseline_month":{"type":"string","title":"Baseline Month"},"baseline_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Baseline Value"},"pct_since_baseline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Since Baseline"},"yoy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Yoy Pct"},"delta_since_baseline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Since Baseline"},"trend_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend Tier"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"}},"type":"object","required":["slug","series_id","label","category","unit","kind","baseline_month"],"title":"Indicator"},"IndustryBreakdown":{"properties":{"total":{"type":"integer","title":"Total"},"classified":{"type":"integer","title":"Classified"},"uncategorized":{"type":"integer","title":"Uncategorized"},"sectors":{"items":{"$ref":"#/components/schemas/IndustrySector"},"type":"array","title":"Sectors"}},"type":"object","required":["total","classified","uncategorized","sectors"],"title":"IndustryBreakdown"},"IndustrySector":{"properties":{"industry":{"type":"string","title":"Industry"},"count":{"type":"integer","title":"Count"},"subindustries":{"items":{"$ref":"#/components/schemas/SubIndustryCount"},"type":"array","title":"Subindustries"}},"type":"object","required":["industry","count","subindustries"],"title":"IndustrySector"},"IngestBatch":{"properties":{"node_id":{"type":"string","maxLength":64,"title":"Node Id"},"node_name":{"type":"string","title":"Node Name","default":""},"firmware":{"type":"string","title":"Firmware","default":""},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"readings":{"items":{"$ref":"#/components/schemas/IngestReading"},"type":"array","maxItems":512,"title":"Readings"}},"type":"object","required":["node_id"],"title":"IngestBatch"},"IngestReading":{"properties":{"mac":{"type":"string","title":"Mac"},"band":{"type":"string","pattern":"^(wifi|ble)$","title":"Band","default":"wifi"},"rssi":{"type":"integer","title":"Rssi","default":-99},"channel":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channel"},"ssid":{"type":"string","title":"Ssid","default":""},"name":{"type":"string","title":"Name","default":""}},"type":"object","required":["mac"],"title":"IngestReading"},"IngestResult":{"properties":{"accepted":{"type":"integer","title":"Accepted"},"devices_known":{"type":"integer","title":"Devices Known"},"node_id":{"type":"string","title":"Node Id"}},"type":"object","required":["accepted","devices_known","node_id"],"title":"IngestResult"},"InspectResponse":{"properties":{"tool":{"type":"string","title":"Tool"},"version":{"type":"string","title":"Version"},"filename":{"type":"string","title":"Filename"},"size_bytes":{"type":"integer","title":"Size Bytes"},"records":{"items":{"$ref":"#/components/schemas/RecordPreview"},"type":"array","title":"Records"},"nested":{"type":"integer","title":"Nested","description":"records found inside the uploaded file","default":0},"truncated":{"type":"boolean","title":"Truncated","default":false},"stored":{"type":"boolean","title":"Stored","description":"always false — nothing is kept","default":false}},"type":"object","required":["tool","version","filename","size_bytes","records"],"title":"InspectResponse"},"IntegrationIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"manual"},"source":{"type":"string","title":"Source","default":""}},"type":"object","title":"IntegrationIn"},"InventoryItem":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"sponsor":{"type":"string","title":"Sponsor"},"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"link_url":{"type":"string","title":"Link Url"},"zones":{"items":{"type":"string"},"type":"array","title":"Zones"},"weight":{"type":"integer","title":"Weight"},"active":{"type":"boolean","title":"Active"},"content_type":{"type":"string","title":"Content Type"},"bytes":{"type":"integer","title":"Bytes"},"impressions":{"type":"integer","title":"Impressions"},"clicks":{"type":"integer","title":"Clicks"},"plays":{"type":"integer","title":"Plays"},"completes":{"type":"integer","title":"Completes"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","kind","sponsor","title","url","link_url","zones","weight","active","content_type","bytes","impressions","clicks","plays","completes","created_at"],"title":"InventoryItem"},"ItemIn":{"properties":{"section_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Section Id"},"name":{"type":"string","title":"Name","default":""},"description":{"type":"string","title":"Description","default":""},"price_cents":{"type":"integer","title":"Price Cents","default":0},"available":{"type":"boolean","title":"Available","default":true},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"position":{"type":"integer","title":"Position","default":0}},"type":"object","title":"ItemIn"},"ItemOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""},"price_cents":{"type":"integer","title":"Price Cents","default":0},"available":{"type":"boolean","title":"Available","default":true},"photo_url":{"type":"string","title":"Photo Url","default":""},"options":{"items":{"$ref":"#/components/schemas/OptionGroupOut"},"type":"array","title":"Options"}},"type":"object","required":["id","name"],"title":"ItemOut"},"JobOut":{"properties":{"id":{"type":"integer","title":"Id"},"vendor":{"type":"string","title":"Vendor"},"vendor_title":{"type":"string","title":"Vendor Title"},"status":{"type":"string","title":"Status"},"filename":{"type":"string","title":"Filename"},"bytes":{"type":"integer","title":"Bytes"},"sha256":{"type":"string","title":"Sha256"},"created_at":{"type":"string","title":"Created At"},"scanned_at":{"type":"string","title":"Scanned At"},"imported_at":{"type":"string","title":"Imported At"},"raw_available":{"type":"boolean","title":"Raw Available"},"error":{"type":"string","title":"Error"},"totals":{"type":"object","title":"Totals"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"findings":{"items":{"$ref":"#/components/schemas/app__routes_movingday__FindingOut"},"type":"array","title":"Findings"},"held":{"items":{"$ref":"#/components/schemas/app__routes_movingday__FindingOut"},"type":"array","title":"Held"},"sealed":{"items":{"$ref":"#/components/schemas/app__routes_movingday__FindingOut"},"type":"array","title":"Sealed"}},"type":"object","required":["id","vendor","vendor_title","status","filename","bytes","sha256","created_at","scanned_at","imported_at","raw_available","error","totals","warnings","findings","held","sealed"],"title":"JobOut"},"JurisdictionDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"state":{"type":"string","title":"State"},"state_name":{"type":"string","title":"State Name"},"county":{"type":"string","title":"County"},"population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Population"},"portal_kind":{"type":"string","title":"Portal Kind"},"has_alpr":{"type":"string","title":"Has Alpr"},"sweep_status":{"type":"string","title":"Sweep Status"},"last_swept_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Swept At"},"contract_count":{"type":"integer","title":"Contract Count"},"staff_report_count":{"type":"integer","title":"Staff Report Count","default":0},"system_count":{"type":"integer","title":"System Count","default":0},"first_contract_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"First Contract Year"},"documented_cameras":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Documented Cameras"},"total_contracted":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Contracted"},"finding_count":{"type":"integer","title":"Finding Count"},"flock_agency_slug":{"type":"string","title":"Flock Agency Slug"},"portal_base":{"type":"string","title":"Portal Base"},"contracts":{"items":{"$ref":"#/components/schemas/ContractOut"},"type":"array","title":"Contracts"},"findings":{"items":{"$ref":"#/components/schemas/app__routes_flock__FindingOut"},"type":"array","title":"Findings"},"remarks":{"items":{"$ref":"#/components/schemas/RemarkOut"},"type":"array","title":"Remarks"},"emails":{"items":{"$ref":"#/components/schemas/EmailOut"},"type":"array","title":"Emails"},"disclosures":{"items":{"$ref":"#/components/schemas/DisclosureOut"},"type":"array","title":"Disclosures"},"gaps":{"items":{"$ref":"#/components/schemas/GapOut"},"type":"array","title":"Gaps"},"systems":{"items":{"$ref":"#/components/schemas/app__routes_flock__SystemOut"},"type":"array","title":"Systems","default":[]},"site_hardware":{"items":{"$ref":"#/components/schemas/SiteDeviceOut"},"type":"array","title":"Site Hardware","default":[]},"site_caveat":{"type":"string","title":"Site Caveat","default":"This is what a records officer listed as attached to the poles at one intersection, on one date. It is not a complete account of the city's equipment, and an intersection absent from here is one nobody has asked about yet. The list is kept whole, including the devices that identify nobody: showing only the watching parts of a pole would not be showing the pole."},"system_caveat":{"type":"string","title":"System Caveat","default":"These are the systems named in the procurement documents we hold. A system listed here was written down in a document this jurisdiction published; that is not the same as a finding that the jurisdiction operates it, and a system missing from this list may simply have been bought under an item we have not read."},"gap_caveat":{"type":"string","title":"Gap Caveat","default":"A gap means the record was not found on the jurisdiction's public portal. It is not a statement that the record does not exist, and it is not a statement about whether the jurisdiction operates ALPR."}},"type":"object","required":["slug","name","kind","state","state_name","county","population","portal_kind","has_alpr","sweep_status","last_swept_at","contract_count","first_contract_year","documented_cameras","total_contracted","finding_count","flock_agency_slug","portal_base","contracts","findings","remarks","emails","disclosures","gaps"],"title":"JurisdictionDetail"},"JurisdictionIn":{"properties":{"slug":{"type":"string","maxLength":160,"title":"Slug"},"name":{"type":"string","maxLength":240,"title":"Name"},"kind":{"type":"string","maxLength":20,"title":"Kind","default":"city"},"state":{"type":"string","maxLength":4,"title":"State","default":"nm"},"county":{"type":"string","maxLength":160,"title":"County","default":""},"population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Population"},"portal_kind":{"type":"string","maxLength":20,"title":"Portal Kind","default":"unknown"},"portal_base":{"type":"string","maxLength":400,"title":"Portal Base","default":""},"portal_config":{"type":"string","title":"Portal Config","default":""},"flock_agency_slug":{"type":"string","maxLength":160,"title":"Flock Agency Slug","default":""},"sweep_status":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Sweep Status"},"sweep_error":{"type":"string","maxLength":400,"title":"Sweep Error","default":""}},"type":"object","required":["slug","name"],"title":"JurisdictionIn"},"JurisdictionSummary":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"state":{"type":"string","title":"State"},"state_name":{"type":"string","title":"State Name"},"county":{"type":"string","title":"County"},"population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Population"},"portal_kind":{"type":"string","title":"Portal Kind"},"has_alpr":{"type":"string","title":"Has Alpr"},"sweep_status":{"type":"string","title":"Sweep Status"},"last_swept_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Swept At"},"contract_count":{"type":"integer","title":"Contract Count"},"staff_report_count":{"type":"integer","title":"Staff Report Count","default":0},"system_count":{"type":"integer","title":"System Count","default":0},"first_contract_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"First Contract Year"},"documented_cameras":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Documented Cameras"},"total_contracted":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Contracted"},"finding_count":{"type":"integer","title":"Finding Count"},"flock_agency_slug":{"type":"string","title":"Flock Agency Slug"}},"type":"object","required":["slug","name","kind","state","state_name","county","population","portal_kind","has_alpr","sweep_status","last_swept_at","contract_count","first_contract_year","documented_cameras","total_contracted","finding_count","flock_agency_slug"],"title":"JurisdictionSummary"},"JuryIn":{"properties":{"matter":{"type":"string","maxLength":300,"minLength":8,"title":"Matter"},"gallery":{"type":"string","title":"Gallery","default":""},"kind":{"type":"string","title":"Kind","default":"dispute"},"exclude":{"items":{"type":"integer"},"type":"array","title":"Exclude","default":[]},"outside_complainant":{"type":"boolean","title":"Outside Complainant","default":false}},"type":"object","required":["matter"],"title":"JuryIn"},"KeyOut":{"properties":{"key":{"type":"string","title":"Key"},"hint":{"type":"string","title":"Hint"}},"type":"object","required":["key","hint"],"title":"KeyOut"},"LabelIn":{"properties":{"name":{"type":"string","maxLength":40,"title":"Name","default":""},"color":{"type":"string","maxLength":7,"title":"Color","default":""}},"type":"object","title":"LabelIn"},"LayerOut":{"properties":{"id":{"type":"integer","title":"Id"},"site_id":{"type":"integer","title":"Site Id"},"run_id":{"type":"integer","title":"Run Id"},"output_id":{"type":"integer","title":"Output Id"},"title":{"type":"string","title":"Title"},"kind":{"type":"string","title":"Kind"},"public":{"type":"boolean","title":"Public"},"download_allowed":{"type":"boolean","title":"Download Allowed"},"published_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Published By"},"published_at":{"type":"string","format":"date-time","title":"Published At"},"output":{"type":"object","title":"Output"}},"type":"object","required":["id","site_id","run_id","output_id","title","kind","public","download_allowed","published_by","published_at","output"],"title":"LayerOut"},"LedgerCreate":{"properties":{"direction":{"type":"string","pattern":"^(in|out)$","title":"Direction"},"category":{"type":"string","maxLength":24,"title":"Category"},"amount_dollars":{"type":"number","exclusiveMinimum":0.0,"title":"Amount Dollars"},"label":{"type":"string","maxLength":200,"title":"Label","default":""},"note":{"type":"string","maxLength":4000,"title":"Note","default":""},"source_url":{"type":"string","maxLength":800,"title":"Source Url","default":""},"occurred_on":{"type":"string","maxLength":10,"title":"Occurred On","default":""},"pitch_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pitch Id"},"visible":{"type":"boolean","title":"Visible","default":true}},"type":"object","required":["direction","category","amount_dollars"],"title":"LedgerCreate"},"LetterOut":{"properties":{"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"},"note":{"type":"string","title":"Note"},"ack_due":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Ack Due"},"inspection_due":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Inspection Due"}},"type":"object","required":["kind","title","subject","body","note"],"title":"LetterOut"},"LikeState":{"properties":{"liked":{"type":"boolean","title":"Liked"},"like_count":{"type":"integer","title":"Like Count"}},"type":"object","required":["liked","like_count"],"title":"LikeState"},"ListPage":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/MessageRow"},"type":"array","title":"Rows"},"cursor":{"type":"string","title":"Cursor","default":""},"total":{"type":"integer","title":"Total","default":0}},"type":"object","required":["rows"],"title":"ListPage"},"ListingCreate":{"properties":{"section":{"type":"string","maxLength":80,"minLength":1,"title":"Section"},"kind":{"type":"string","pattern":"^(yellow|white|blue)$","title":"Kind","default":"yellow"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"tagline":{"type":"string","maxLength":300,"title":"Tagline","default":""},"description":{"type":"string","maxLength":4000,"title":"Description","default":""},"hours":{"type":"string","maxLength":200,"title":"Hours","default":""},"node_id":{"type":"string","maxLength":24,"title":"Node Id","default":""},"phone":{"type":"string","maxLength":20,"title":"Phone","default":""}},"type":"object","required":["section","name"],"title":"ListingCreate"},"ListingEdit":{"properties":{"section":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Section"},"kind":{"anyOf":[{"type":"string","pattern":"^(yellow|white|blue)$"},{"type":"null"}],"title":"Kind"},"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"tagline":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Tagline"},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description"},"hours":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Hours"},"node_id":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Node Id"},"phone":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"},"subtitle":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Subtitle"},"instagram_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Instagram Url"},"facebook_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Facebook Url"},"website_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Website Url"},"tweeter_handle":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Tweeter Handle"},"instag_handle":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Instag Handle"},"livestream_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Livestream Url"},"master_listing_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Master Listing Url"},"theme_name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Theme Name"},"theme_css":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Theme Css"},"theme_html":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Theme Html"},"custom_domain":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Custom Domain"}},"type":"object","title":"ListingEdit"},"ListingModerate":{"properties":{"is_featured":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Featured"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"}},"type":"object","title":"ListingModerate","description":"Admin toggles. Omit a field to leave it unchanged."},"LitigantOut":{"properties":{"party_name":{"type":"string","title":"Party Name"},"side":{"type":"string","title":"Side"},"case_name":{"type":"string","title":"Case Name"},"docket_number":{"type":"string","title":"Docket Number"},"court":{"type":"string","title":"Court"},"date_filed":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Filed"},"date_terminated":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Terminated"},"still_open":{"type":"boolean","title":"Still Open","default":false},"cause":{"type":"string","title":"Cause","default":""},"nature_of_suit":{"type":"string","title":"Nature Of Suit","default":""},"url":{"type":"string","title":"Url","default":""},"match_confidence":{"type":"number","title":"Match Confidence","default":0.0},"surname_count":{"type":"integer","title":"Surname Count","default":0},"agency_named_in_case":{"type":"boolean","title":"Agency Named In Case","default":false},"caution":{"type":"string","title":"Caution","default":""}},"type":"object","required":["party_name","side","case_name","docket_number","court"],"title":"LitigantOut","description":"A federal lawsuit naming this officer.\n\nALLEGATION, NOT FINDING. There is no outcome field because the docket has no\noutcome — most suits settle without one. `caution` is rendered by the API so\nno page can drop it."},"LitigationFeed":{"properties":{"agency_slug":{"type":"string","title":"Agency Slug"},"agency_name":{"type":"string","title":"Agency Name"},"total":{"type":"integer","title":"Total","default":0},"named_count":{"type":"integer","title":"Named Count","default":0},"employer_count":{"type":"integer","title":"Employer Count","default":0},"open_count":{"type":"integer","title":"Open Count","default":0},"items":{"items":{"$ref":"#/components/schemas/LitigationItem"},"type":"array","title":"Items"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["agency_slug","agency_name"],"title":"LitigationFeed"},"LitigationItem":{"properties":{"id":{"type":"integer","title":"Id"},"case_name":{"type":"string","title":"Case Name"},"docket_number":{"type":"string","title":"Docket Number"},"court":{"type":"string","title":"Court","default":""},"date_filed":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Filed"},"date_terminated":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Terminated"},"still_open":{"type":"boolean","title":"Still Open","default":false},"cause":{"type":"string","title":"Cause","default":""},"nature_of_suit":{"type":"string","title":"Nature Of Suit","default":""},"judge":{"type":"string","title":"Judge","default":""},"url":{"type":"string","title":"Url","default":""},"attribution_basis":{"type":"string","title":"Attribution Basis","default":"employer"},"attribution_note":{"type":"string","title":"Attribution Note","default":""}},"type":"object","required":["id","case_name","docket_number"],"title":"LitigationItem"},"LivePage":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"any_real_node":{"type":"boolean","title":"Any Real Node"},"demo_only":{"type":"boolean","title":"Demo Only"},"nodes":{"items":{"$ref":"#/components/schemas/NodeOut"},"type":"array","title":"Nodes"},"devices":{"items":{"$ref":"#/components/schemas/DeviceOut"},"type":"array","title":"Devices"}},"type":"object","required":["generated_at","any_real_node","demo_only","nodes","devices"],"title":"LivePage"},"LoginIn":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginIn"},"MapPoint":{"properties":{"sems_id":{"type":"integer","title":"Sems Id"},"name":{"type":"string","title":"Name"},"state_code":{"type":"string","title":"State Code"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"appear_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Appear Year"},"cleared_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cleared Year"},"hrs_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hrs Score"}},"type":"object","required":["sems_id","name","state_code","lat","lng","appear_year","cleared_year","hrs_score"],"title":"MapPoint"},"MarketOut":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"state":{"type":"string","title":"State"},"state_code":{"type":"string","title":"State Code","default":""},"city_slug":{"type":"string","title":"City Slug","default":""},"timezone":{"type":"string","title":"Timezone"},"tagline":{"type":"string","title":"Tagline"},"lat":{"type":"number","title":"Lat","default":0.0},"lng":{"type":"number","title":"Lng","default":0.0}},"type":"object","required":["id","slug","name","state","timezone","tagline"],"title":"MarketOut"},"MarketSettingsUpdate":{"properties":{"video_watermark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Watermark"}},"type":"object","title":"MarketSettingsUpdate"},"MarketStats":{"properties":{"meetings":{"type":"integer","title":"Meetings"},"with_agenda":{"type":"integer","title":"With Agenda"},"bodies":{"type":"integer","title":"Bodies"}},"type":"object","required":["meetings","with_agenda","bodies"],"title":"MarketStats"},"MeOut":{"properties":{"activated":{"type":"boolean","title":"Activated"},"stars":{"type":"integer","title":"Stars"},"needed":{"type":"integer","title":"Needed"},"gate_armed":{"type":"boolean","title":"Gate Armed"},"can_create":{"type":"boolean","title":"Can Create"},"awards":{"items":{"$ref":"#/components/schemas/AwardOut"},"type":"array","title":"Awards","default":[]},"available":{"items":{"type":"object"},"type":"array","title":"Available","default":[]},"claims":{"items":{"type":"object"},"type":"array","title":"Claims","default":[]}},"type":"object","required":["activated","stars","needed","gate_armed","can_create"],"title":"MeOut"},"MeasurementIn":{"properties":{"kind":{"type":"string","title":"Kind"},"label":{"type":"string","maxLength":120,"title":"Label","default":""},"geometry":{"type":"object","title":"Geometry"},"run_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run Id"},"output_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Id"},"unit":{"type":"string","title":"Unit","default":"m"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"detail":{"type":"object","title":"Detail"}},"type":"object","required":["kind","geometry"],"title":"MeasurementIn"},"MeasurementOut":{"properties":{"id":{"type":"integer","title":"Id"},"site_id":{"type":"integer","title":"Site Id"},"run_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run Id"},"output_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Id"},"kind":{"type":"string","title":"Kind"},"label":{"type":"string","title":"Label"},"geometry":{"type":"object","title":"Geometry"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"unit":{"type":"string","title":"Unit"},"detail":{"type":"object","title":"Detail"},"accuracy_class":{"type":"string","title":"Accuracy Class"},"warning":{"type":"string","title":"Warning"},"created_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","site_id","run_id","output_id","kind","label","geometry","value","unit","detail","accuracy_class","warning","created_by","created_at"],"title":"MeasurementOut"},"MediaIn":{"properties":{"vendor_key":{"type":"string","maxLength":40,"title":"Vendor Key"},"url":{"type":"string","maxLength":800,"title":"Url"},"category":{"type":"string","maxLength":20,"title":"Category","default":""},"title":{"type":"string","maxLength":300,"title":"Title","default":""},"publisher":{"type":"string","maxLength":200,"title":"Publisher","default":""},"embed_url":{"type":"string","maxLength":800,"title":"Embed Url","default":""},"thumbnail_url":{"type":"string","maxLength":800,"title":"Thumbnail Url","default":""},"kind":{"type":"string","maxLength":20,"title":"Kind","default":"promo"},"published_on":{"type":"string","title":"Published On","default":""},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"summary":{"type":"string","title":"Summary","default":""},"claim":{"type":"string","title":"Claim","default":""},"claim_at":{"type":"string","maxLength":12,"title":"Claim At","default":""},"unavailable":{"type":"boolean","title":"Unavailable","default":false},"published":{"type":"boolean","title":"Published","default":true}},"type":"object","required":["vendor_key","url"],"title":"MediaIn","description":"One catalogue entry for a film about a surveillance product.\n\nThe file is never copied here: url and embed_url point at the publisher's\nown platform. `summary` is OUR description, written by a person, and\n`claim` is a short quoted line kept for commentary - it renders as\nsomething the vendor SAID, never as a statement of fact."},"MediaItemOut":{"properties":{"outlet":{"type":"string","title":"Outlet"},"media_kind":{"type":"string","title":"Media Kind"},"market":{"type":"string","title":"Market","default":""},"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"published":{"type":"string","title":"Published","default":""},"conduct_kind":{"type":"string","title":"Conduct Kind","default":""},"conduct_label":{"type":"string","title":"Conduct Label","default":""}},"type":"object","required":["outlet","media_kind","title","url"],"title":"MediaItemOut"},"MeetingDetail":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"meeting_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Date"},"video_provider":{"type":"string","title":"Video Provider"},"video_id":{"type":"string","title":"Video Id"},"video_url":{"type":"string","title":"Video Url"},"body":{"anyOf":[{"$ref":"#/components/schemas/BodyOut"},{"type":"null"}]},"has_agenda":{"type":"boolean","title":"Has Agenda"},"has_transcript":{"type":"boolean","title":"Has Transcript","default":false},"location":{"type":"string","title":"Location"},"documents":{"items":{"$ref":"#/components/schemas/DocumentOut"},"type":"array","title":"Documents"}},"type":"object","required":["id","title","meeting_date","video_provider","video_id","video_url","body","has_agenda","location","documents"],"title":"MeetingDetail"},"MeetingListItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"meeting_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Date"},"video_provider":{"type":"string","title":"Video Provider"},"video_id":{"type":"string","title":"Video Id"},"video_url":{"type":"string","title":"Video Url"},"body":{"anyOf":[{"$ref":"#/components/schemas/BodyOut"},{"type":"null"}]},"has_agenda":{"type":"boolean","title":"Has Agenda"},"has_transcript":{"type":"boolean","title":"Has Transcript","default":false}},"type":"object","required":["id","title","meeting_date","video_provider","video_id","video_url","body","has_agenda"],"title":"MeetingListItem"},"MeetingPage":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"items":{"items":{"$ref":"#/components/schemas/MeetingListItem"},"type":"array","title":"Items"}},"type":"object","required":["total","page","per_page","items"],"title":"MeetingPage"},"MemberIn":{"properties":{"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"role":{"type":"string","title":"Role","default":"viewer"}},"type":"object","title":"MemberIn"},"MemberOut":{"properties":{"user_id":{"type":"integer","title":"User Id"},"display_name":{"type":"string","title":"Display Name"},"role":{"type":"string","title":"Role"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["user_id","display_name","role","created_at"],"title":"MemberOut"},"MenuApplyIn":{"properties":{"sections":{"items":{"type":"object"},"type":"array","title":"Sections"},"replace":{"type":"boolean","title":"Replace","default":false}},"type":"object","title":"MenuApplyIn"},"MenuOut":{"properties":{"store":{"$ref":"#/components/schemas/StoreDetail"},"sections":{"items":{"$ref":"#/components/schemas/app__routes_homie__SectionOut"},"type":"array","title":"Sections"}},"type":"object","required":["store"],"title":"MenuOut"},"MenuPreviewIn":{"properties":{"url":{"type":"string","title":"Url","default":""},"text":{"type":"string","title":"Text","default":""}},"type":"object","title":"MenuPreviewIn","description":"One of these, never both. `url` is a page WE fetch — see the SSRF note\nin homie_pos.py before touching it."},"MeshMessageCreate":{"properties":{"body":{"type":"string","maxLength":200,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"MeshMessageCreate"},"MeshMessageResult":{"properties":{"status":{"type":"string","title":"Status"},"gateway_online":{"type":"boolean","title":"Gateway Online"},"to_node_id":{"type":"string","title":"To Node Id"},"note":{"type":"string","title":"Note"}},"type":"object","required":["status","gateway_online","to_node_id","note"],"title":"MeshMessageResult"},"MeshStatusOut":{"properties":{"gateway_online":{"type":"boolean","title":"Gateway Online","default":false},"nodes_24h":{"type":"integer","title":"Nodes 24H","default":0},"listed":{"type":"integer","title":"Listed","default":0},"routers":{"type":"integer","title":"Routers","default":0},"widest_km":{"type":"number","title":"Widest Km","default":0.0},"channel":{"type":"string","title":"Channel","default":""}},"type":"object","title":"MeshStatusOut"},"MessageIn":{"properties":{"state":{"type":"string","title":"State"}},"type":"object","required":["state"],"title":"MessageIn"},"MessageOut":{"properties":{"id":{"type":"integer","title":"Id"},"entry_id":{"type":"integer","title":"Entry Id"},"thread_id":{"type":"integer","title":"Thread Id"},"folder":{"type":"string","title":"Folder"},"is_read":{"type":"boolean","title":"Is Read"},"is_starred":{"type":"boolean","title":"Is Starred"},"subject":{"type":"string","title":"Subject"},"preview":{"type":"string","title":"Preview"},"who":{"$ref":"#/components/schemas/PersonOut"},"has_files":{"type":"boolean","title":"Has Files","default":false},"attachments":{"type":"integer","title":"Attachments","default":0},"label_ids":{"items":{"type":"integer"},"type":"array","title":"Label Ids"},"bytes":{"type":"integer","title":"Bytes","default":0},"received_at":{"type":"string","title":"Received At"},"body":{"type":"string","title":"Body","default":""},"to":{"items":{"$ref":"#/components/schemas/PersonOut"},"type":"array","title":"To"},"cc":{"items":{"$ref":"#/components/schemas/PersonOut"},"type":"array","title":"Cc"},"bcc":{"items":{"$ref":"#/components/schemas/PersonOut"},"type":"array","title":"Bcc"},"attachment_list":{"items":{"$ref":"#/components/schemas/AttachmentOut"},"type":"array","title":"Attachment List"},"from":{"$ref":"#/components/schemas/PersonOut"},"category":{"type":"string","title":"Category","default":"mail"},"delivery_note":{"type":"string","title":"Delivery Note","default":""},"mine":{"type":"boolean","title":"Mine","default":false},"in_reply_to_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"In Reply To Id"}},"type":"object","required":["id","entry_id","thread_id","folder","is_read","is_starred","subject","preview","who","received_at"],"title":"MessageOut"},"MessageRow":{"properties":{"id":{"type":"integer","title":"Id"},"entry_id":{"type":"integer","title":"Entry Id"},"thread_id":{"type":"integer","title":"Thread Id"},"folder":{"type":"string","title":"Folder"},"is_read":{"type":"boolean","title":"Is Read"},"is_starred":{"type":"boolean","title":"Is Starred"},"subject":{"type":"string","title":"Subject"},"preview":{"type":"string","title":"Preview"},"who":{"$ref":"#/components/schemas/PersonOut"},"has_files":{"type":"boolean","title":"Has Files","default":false},"attachments":{"type":"integer","title":"Attachments","default":0},"label_ids":{"items":{"type":"integer"},"type":"array","title":"Label Ids"},"bytes":{"type":"integer","title":"Bytes","default":0},"received_at":{"type":"string","title":"Received At"}},"type":"object","required":["id","entry_id","thread_id","folder","is_read","is_starred","subject","preview","who","received_at"],"title":"MessageRow","description":"One line in a folder list."},"Methodology":{"properties":{"registers":{"items":{"$ref":"#/components/schemas/RegisterDoc"},"type":"array","title":"Registers"},"state_board_outcomes":{"items":{"$ref":"#/components/schemas/Vocabulary"},"type":"array","title":"State Board Outcomes"},"agency_outcomes":{"items":{"$ref":"#/components/schemas/Vocabulary"},"type":"array","title":"Agency Outcomes"},"identity_rule":{"type":"string","title":"Identity Rule","default":""},"vintage_rule":{"type":"string","title":"Vintage Rule","default":""},"crossing_rule":{"type":"string","title":"Crossing Rule","default":""},"crossing_candidates":{"type":"integer","title":"Crossing Candidates","default":0},"crossing_strong":{"type":"integer","title":"Crossing Strong","default":0},"investigation_deadline_days":{"type":"integer","title":"Investigation Deadline Days","default":0},"limits":{"items":{"type":"string"},"type":"array","title":"Limits"}},"type":"object","title":"Methodology"},"MinePage":{"properties":{"campaigns":{"items":{"$ref":"#/components/schemas/CampaignCard"},"type":"array","title":"Campaigns"},"supported":{"items":{"$ref":"#/components/schemas/CampaignCard"},"type":"array","title":"Supported"}},"type":"object","required":["campaigns","supported"],"title":"MinePage"},"MintIn":{"properties":{"kind":{"type":"string","maxLength":32,"minLength":1,"title":"Kind"},"ref":{"type":"string","maxLength":200,"title":"Ref","default":""},"target":{"type":"string","maxLength":2000,"title":"Target","default":""},"label":{"type":"string","maxLength":200,"title":"Label","default":""}},"type":"object","required":["kind"],"title":"MintIn"},"MintOut":{"properties":{"code":{"type":"string","title":"Code"},"url":{"type":"string","title":"Url"},"kind":{"type":"string","title":"Kind"},"ref":{"type":"string","title":"Ref"},"resolves_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolves To"}},"type":"object","required":["code","url","kind","ref","resolves_to"],"title":"MintOut"},"MissionIn":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"captured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Captured At"},"operator_name":{"type":"string","maxLength":200,"title":"Operator Name","default":""},"aircraft":{"type":"string","maxLength":200,"title":"Aircraft","default":""},"camera":{"type":"string","maxLength":200,"title":"Camera","default":""},"purpose":{"type":"string","maxLength":400,"title":"Purpose","default":""},"intended_outputs":{"items":{"type":"string"},"type":"array","title":"Intended Outputs"},"capture_method":{"type":"string","maxLength":120,"title":"Capture Method","default":""},"weather_notes":{"type":"string","maxLength":4000,"title":"Weather Notes","default":""},"field_notes":{"type":"string","maxLength":8000,"title":"Field Notes","default":""},"crs_horizontal":{"type":"string","maxLength":60,"title":"Crs Horizontal","default":"EPSG:4326"},"vertical_datum":{"type":"string","maxLength":60,"title":"Vertical Datum","default":""},"units":{"type":"string","title":"Units","default":"m"},"accuracy_target":{"type":"string","maxLength":120,"title":"Accuracy Target","default":""},"control_method":{"type":"string","maxLength":120,"title":"Control Method","default":"none"},"privacy":{"type":"string","title":"Privacy","default":"private"}},"type":"object","required":["name"],"title":"MissionIn"},"MissionOut":{"properties":{"id":{"type":"integer","title":"Id"},"site_id":{"type":"integer","title":"Site Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"captured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Captured At"},"operator_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Operator User Id"},"operator_name":{"type":"string","title":"Operator Name"},"aircraft":{"type":"string","title":"Aircraft"},"camera":{"type":"string","title":"Camera"},"purpose":{"type":"string","title":"Purpose"},"intended_outputs":{"items":{},"type":"array","title":"Intended Outputs"},"capture_method":{"type":"string","title":"Capture Method"},"weather_notes":{"type":"string","title":"Weather Notes"},"field_notes":{"type":"string","title":"Field Notes"},"crs_horizontal":{"type":"string","title":"Crs Horizontal"},"vertical_datum":{"type":"string","title":"Vertical Datum"},"units":{"type":"string","title":"Units"},"accuracy_target":{"type":"string","title":"Accuracy Target"},"control_method":{"type":"string","title":"Control Method"},"privacy":{"type":"string","title":"Privacy"},"status":{"type":"string","title":"Status"},"accuracy_class":{"type":"string","title":"Accuracy Class"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"file_count":{"type":"integer","title":"File Count","default":0},"photo_count":{"type":"integer","title":"Photo Count","default":0},"bytes":{"type":"integer","title":"Bytes","default":0},"latest_run":{"anyOf":[{"$ref":"#/components/schemas/RunBrief"},{"type":"null"}]},"runs":{"items":{"$ref":"#/components/schemas/RunBrief"},"type":"array","title":"Runs"}},"type":"object","required":["id","site_id","slug","name","captured_at","operator_user_id","operator_name","aircraft","camera","purpose","intended_outputs","capture_method","weather_notes","field_notes","crs_horizontal","vertical_datum","units","accuracy_target","control_method","privacy","status","accuracy_class","created_at","updated_at"],"title":"MissionOut"},"MissionPatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"captured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Captured At"},"operator_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator Name"},"aircraft":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aircraft"},"camera":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Camera"},"purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purpose"},"intended_outputs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Intended Outputs"},"capture_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capture Method"},"weather_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weather Notes"},"field_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field Notes"},"crs_horizontal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Crs Horizontal"},"vertical_datum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vertical Datum"},"units":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Units"},"accuracy_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accuracy Target"},"control_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Control Method"},"privacy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Privacy"}},"type":"object","title":"MissionPatch"},"ModerateRequest":{"properties":{"status":{"type":"string","pattern":"^(pending|published|reviewed|rejected)$","title":"Status"},"moderator_note":{"type":"string","maxLength":400,"title":"Moderator Note","default":""}},"type":"object","required":["status"],"title":"ModerateRequest"},"MonthBucket":{"properties":{"month":{"type":"string","title":"Month"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["month","count"],"title":"MonthBucket"},"MoveOrderIn":{"properties":{"state":{"type":"string","title":"State"},"reason":{"type":"string","title":"Reason","default":""},"run_pay_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run Pay Cents"}},"type":"object","required":["state"],"title":"MoveOrderIn"},"MtxAuthIn":{"properties":{"user":{"type":"string","title":"User","default":""},"password":{"type":"string","title":"Password","default":""},"ip":{"type":"string","title":"Ip","default":""},"action":{"type":"string","title":"Action","default":""},"path":{"type":"string","title":"Path","default":""},"protocol":{"type":"string","title":"Protocol","default":""},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"query":{"type":"string","title":"Query","default":""}},"type":"object","title":"MtxAuthIn"},"MySupport":{"properties":{"display_public":{"type":"boolean","title":"Display Public"},"comment":{"type":"string","title":"Comment"},"postal_code":{"type":"string","title":"Postal Code"},"rsvp":{"type":"string","title":"Rsvp"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["display_public","comment","postal_code","rsvp","created_at"],"title":"MySupport"},"NationSeed":{"properties":{"ref":{"type":"string","title":"Ref"},"seed_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seed Code"},"cultivar":{"type":"string","title":"Cultivar"},"breeder":{"type":"string","title":"Breeder"},"scientific_name":{"type":"string","title":"Scientific Name"},"lifecycle":{"type":"string","title":"Lifecycle"},"description":{"type":"string","title":"Description"},"planting_instructions":{"type":"string","title":"Planting Instructions"},"care_notes":{"type":"string","title":"Care Notes"},"days_to_maturity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days To Maturity"},"sun":{"type":"string","title":"Sun"},"water":{"type":"string","title":"Water"},"spacing":{"type":"string","title":"Spacing"},"book_page_no":{"type":"string","title":"Book Page No"},"elevation":{"type":"string","title":"Elevation"},"packaged_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Packaged Date"},"planting_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Planting Date"},"harvest_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Harvest Date"},"quantity_note":{"type":"string","title":"Quantity Note"},"image_url":{"type":"string","title":"Image Url"},"thumbnail_url":{"type":"string","title":"Thumbnail Url"},"additional_images":{"items":{"type":"string"},"type":"array","title":"Additional Images"},"market":{"type":"string","title":"Market"},"owner_id":{"type":"integer","title":"Owner Id"},"owner_name":{"type":"string","title":"Owner Name"},"is_public":{"type":"boolean","title":"Is Public"},"is_hidden":{"type":"boolean","title":"Is Hidden"},"path":{"type":"string","title":"Path"},"qr_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qr Code"},"qr_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qr Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"market_name":{"type":"string","title":"Market Name","default":""}},"type":"object","required":["ref","seed_code","cultivar","breeder","scientific_name","lifecycle","description","planting_instructions","care_notes","days_to_maturity","sun","water","spacing","book_page_no","elevation","packaged_date","planting_date","harvest_date","quantity_note","image_url","thumbnail_url","additional_images","market","owner_id","owner_name","is_public","is_hidden","path","created_at"],"title":"NationSeed","description":"A seed on the national index, with the town it belongs to."},"NationalOut":{"properties":{"reservoirs":{"items":{"$ref":"#/components/schemas/ReservoirRow"},"type":"array","title":"Reservoirs"},"note":{"type":"string","title":"Note"}},"type":"object","required":["reservoirs","note"],"title":"NationalOut"},"NodeOut":{"properties":{"node_id":{"type":"string","title":"Node Id"},"name":{"type":"string","title":"Name"},"firmware":{"type":"string","title":"Firmware"},"is_demo":{"type":"boolean","title":"Is Demo"},"online":{"type":"boolean","title":"Online"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"}},"type":"object","required":["node_id","name","firmware","is_demo","online","last_seen_at"],"title":"NodeOut"},"NodeStatusOut":{"properties":{"short_name":{"type":"string","title":"Short Name","default":""},"long_name":{"type":"string","title":"Long Name","default":""},"role":{"type":"string","title":"Role","default":"client"},"snr":{"type":"number","title":"Snr","default":0.0},"hops_away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hops Away"},"battery_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Battery Level"},"last_heard_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Heard At"},"online":{"type":"boolean","title":"Online","default":false}},"type":"object","title":"NodeStatusOut","description":"Live radio status for a listing's node, joined from MeshNode. Null on a\nlisting whose node the mesh has never heard (unverified)."},"NoteIn":{"properties":{"body":{"type":"string","maxLength":2000,"minLength":1,"title":"Body"},"pinned":{"type":"boolean","title":"Pinned","default":false}},"type":"object","required":["body"],"title":"NoteIn"},"OfficerDetail":{"properties":{"cert_number":{"type":"string","title":"Cert Number"},"state_code":{"type":"string","title":"State Code","default":"nm"},"state_name":{"type":"string","title":"State Name","default":"New Mexico"},"full_name":{"type":"string","title":"Full Name"},"cert_year":{"type":"integer","title":"Cert Year"},"cert_year_ok":{"type":"boolean","title":"Cert Year Ok"},"cert_class":{"type":"string","title":"Cert Class"},"cert_class_label":{"type":"string","title":"Cert Class Label"},"is_sworn":{"type":"boolean","title":"Is Sworn"},"identity_basis":{"type":"string","title":"Identity Basis"},"current_rank":{"type":"string","title":"Current Rank","default":""},"current_unit":{"type":"string","title":"Current Unit","default":""},"current_rank_as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Current Rank As Of"},"agencies":{"items":{"type":"string"},"type":"array","title":"Agencies"},"conduct_count":{"type":"integer","title":"Conduct Count","default":0},"adverse_count":{"type":"integer","title":"Adverse Count","default":0},"cleared_count":{"type":"integer","title":"Cleared Count","default":0},"first_name":{"type":"string","title":"First Name"},"middle_name":{"type":"string","title":"Middle Name"},"last_name":{"type":"string","title":"Last Name"},"employment":{"items":{"$ref":"#/components/schemas/EmploymentOut"},"type":"array","title":"Employment"},"conduct":{"items":{"$ref":"#/components/schemas/ConductOut"},"type":"array","title":"Conduct"},"recognition":{"items":{"$ref":"#/components/schemas/ConductOut"},"type":"array","title":"Recognition"},"portrait_url":{"type":"string","title":"Portrait Url","default":""},"portrait_credit":{"type":"string","title":"Portrait Credit","default":""},"portrait_source_url":{"type":"string","title":"Portrait Source Url","default":""},"withheld_assignments":{"type":"integer","title":"Withheld Assignments","default":0},"service_gap_note":{"type":"string","title":"Service Gap Note","default":""},"conduct_source_note":{"type":"string","title":"Conduct Source Note","default":""},"service_days":{"type":"integer","title":"Service Days","default":0},"service_length":{"type":"string","title":"Service Length","default":""},"service_note":{"type":"string","title":"Service Note","default":""},"first_sworn":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"First Sworn"},"last_recorded":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Recorded"},"pay":{"items":{"$ref":"#/components/schemas/PayDisclosureOut"},"type":"array","title":"Pay"},"lawsuits":{"items":{"$ref":"#/components/schemas/LitigantOut"},"type":"array","title":"Lawsuits"},"crossings":{"items":{"$ref":"#/components/schemas/CrossingOut"},"type":"array","title":"Crossings"},"brady":{"items":{"$ref":"#/components/schemas/BradyOut"},"type":"array","title":"Brady"},"discipline_candidates":{"items":{"$ref":"#/components/schemas/DisciplineCandidateOut"},"type":"array","title":"Discipline Candidates"},"brady_coverage_note":{"type":"string","title":"Brady Coverage Note","default":""},"replies":{"items":{"$ref":"#/components/schemas/ReplyOut"},"type":"array","title":"Replies"},"sources":{"items":{"$ref":"#/components/schemas/app__routes_police_academy__SourceOut"},"type":"array","title":"Sources"}},"type":"object","required":["cert_number","full_name","cert_year","cert_year_ok","cert_class","cert_class_label","is_sworn","identity_basis","first_name","middle_name","last_name"],"title":"OfficerDetail"},"OfficerPage":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"officers":{"items":{"$ref":"#/components/schemas/OfficerSummary"},"type":"array","title":"Officers"}},"type":"object","required":["total","page","per_page","officers"],"title":"OfficerPage"},"OfficerSummary":{"properties":{"cert_number":{"type":"string","title":"Cert Number"},"state_code":{"type":"string","title":"State Code","default":"nm"},"state_name":{"type":"string","title":"State Name","default":"New Mexico"},"full_name":{"type":"string","title":"Full Name"},"cert_year":{"type":"integer","title":"Cert Year"},"cert_year_ok":{"type":"boolean","title":"Cert Year Ok"},"cert_class":{"type":"string","title":"Cert Class"},"cert_class_label":{"type":"string","title":"Cert Class Label"},"is_sworn":{"type":"boolean","title":"Is Sworn"},"identity_basis":{"type":"string","title":"Identity Basis"},"current_rank":{"type":"string","title":"Current Rank","default":""},"current_unit":{"type":"string","title":"Current Unit","default":""},"current_rank_as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Current Rank As Of"},"agencies":{"items":{"type":"string"},"type":"array","title":"Agencies"},"conduct_count":{"type":"integer","title":"Conduct Count","default":0},"adverse_count":{"type":"integer","title":"Adverse Count","default":0},"cleared_count":{"type":"integer","title":"Cleared Count","default":0}},"type":"object","required":["cert_number","full_name","cert_year","cert_year_ok","cert_class","cert_class_label","is_sworn","identity_basis"],"title":"OfficerSummary"},"OnAirIn":{"properties":{"on":{"type":"boolean","title":"On"}},"type":"object","required":["on"],"title":"OnAirIn"},"OperatorOut":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"display_name":{"type":"string","title":"Display Name","default":""},"role":{"type":"string","title":"Role"},"title":{"type":"string","title":"Title"},"posted":{"type":"boolean","title":"Posted"}},"type":"object","required":["id","email","role","title","posted"],"title":"OperatorOut"},"OpinionFeed":{"properties":{"agency_slug":{"type":"string","title":"Agency Slug"},"agency_name":{"type":"string","title":"Agency Name"},"total":{"type":"integer","title":"Total","default":0},"named_count":{"type":"integer","title":"Named Count","default":0},"published_count":{"type":"integer","title":"Published Count","default":0},"posture_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Posture Counts"},"items":{"items":{"$ref":"#/components/schemas/OpinionItem"},"type":"array","title":"Items"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["agency_slug","agency_name"],"title":"OpinionFeed"},"OpinionItem":{"properties":{"id":{"type":"integer","title":"Id"},"case_name":{"type":"string","title":"Case Name"},"court":{"type":"string","title":"Court","default":""},"court_id":{"type":"string","title":"Court Id","default":""},"date_filed":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Filed"},"citation":{"type":"string","title":"Citation","default":""},"docket_number":{"type":"string","title":"Docket Number","default":""},"precedential_status":{"type":"string","title":"Precedential Status","default":""},"posture":{"type":"string","title":"Posture","default":"other"},"posture_note":{"type":"string","title":"Posture Note","default":""},"attribution_basis":{"type":"string","title":"Attribution Basis","default":"mentioned"},"url":{"type":"string","title":"Url","default":""}},"type":"object","required":["id","case_name"],"title":"OpinionItem"},"OptionGroupIn":{"properties":{"name":{"type":"string","title":"Name","default":""},"min_select":{"type":"integer","title":"Min Select","default":0},"max_select":{"type":"integer","title":"Max Select","default":0},"position":{"type":"integer","title":"Position","default":0},"choices":{"items":{"$ref":"#/components/schemas/ChoiceIn"},"type":"array","title":"Choices"}},"type":"object","title":"OptionGroupIn"},"OptionGroupOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"min_select":{"type":"integer","title":"Min Select","default":0},"max_select":{"type":"integer","title":"Max Select","default":0},"choices":{"items":{"$ref":"#/components/schemas/ChoiceOut"},"type":"array","title":"Choices"}},"type":"object","required":["id","name"],"title":"OptionGroupOut"},"OrderCard":{"properties":{"code":{"type":"string","title":"Code"},"store_slug":{"type":"string","title":"Store Slug"},"store_name":{"type":"string","title":"Store Name","default":""},"state":{"type":"string","title":"State"},"fulfillment":{"type":"string","title":"Fulfillment"},"placed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Placed At"},"total_cents":{"type":"integer","title":"Total Cents","default":0},"item_count":{"type":"integer","title":"Item Count","default":0}},"type":"object","required":["code","store_slug","state","fulfillment"],"title":"OrderCard","description":"An order, WITHOUT the dropoff. See the module docstring."},"OrderDetail":{"properties":{"code":{"type":"string","title":"Code"},"store_slug":{"type":"string","title":"Store Slug"},"store_name":{"type":"string","title":"Store Name","default":""},"state":{"type":"string","title":"State"},"fulfillment":{"type":"string","title":"Fulfillment"},"placed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Placed At"},"total_cents":{"type":"integer","title":"Total Cents","default":0},"item_count":{"type":"integer","title":"Item Count","default":0},"lines":{"items":{"$ref":"#/components/schemas/OrderLineOut"},"type":"array","title":"Lines"},"totals":{"$ref":"#/components/schemas/OrderTotals"},"customer_note":{"type":"string","title":"Customer Note","default":""},"refusal_reason":{"type":"string","title":"Refusal Reason","default":""},"pay_method":{"type":"string","title":"Pay Method","default":""},"pay_note":{"type":"string","title":"Pay Note","default":""},"customer":{"anyOf":[{"$ref":"#/components/schemas/app__routes_homie__MemberCard"},{"type":"null"}]},"run":{"anyOf":[{"$ref":"#/components/schemas/app__routes_homie__RunOut"},{"type":"null"}]},"receipt_sha256":{"type":"string","title":"Receipt Sha256","default":""}},"type":"object","required":["code","store_slug","state","fulfillment"],"title":"OrderDetail"},"OrderLineOut":{"properties":{"name":{"type":"string","title":"Name"},"quantity":{"type":"integer","title":"Quantity"},"unit_price_cents":{"type":"integer","title":"Unit Price Cents"},"line_total_cents":{"type":"integer","title":"Line Total Cents"},"choices":{"items":{"type":"string"},"type":"array","title":"Choices"}},"type":"object","required":["name","quantity","unit_price_cents","line_total_cents"],"title":"OrderLineOut"},"OrderTotals":{"properties":{"subtotal_cents":{"type":"integer","title":"Subtotal Cents","default":0},"delivery_fee_cents":{"type":"integer","title":"Delivery Fee Cents","default":0},"tip_cents":{"type":"integer","title":"Tip Cents","default":0},"total_cents":{"type":"integer","title":"Total Cents","default":0}},"type":"object","title":"OrderTotals","description":"What the customer is asked to pay. Mirrors `homie.price_order`.\n\nTHERE IS NO PLATFORM-FEE FIELD AND THERE IS NOWHERE TO PUT ONE. That is\nrule 5, and the test asserts it against `OrderTotals.model_fields` rather\nthan against a rendered page — a page can be checked and then changed, and\na field that exists gets filled in eventually."},"OutputOut":{"properties":{"id":{"type":"integer","title":"Id"},"run_id":{"type":"integer","title":"Run Id"},"kind":{"type":"string","title":"Kind"},"format":{"type":"string","title":"Format"},"bytes":{"type":"integer","title":"Bytes"},"sha256":{"type":"string","title":"Sha256"},"meta":{"type":"object","title":"Meta"},"published":{"type":"boolean","title":"Published"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"download_url":{"type":"string","title":"Download Url"},"tiles_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiles Url"}},"type":"object","required":["id","run_id","kind","format","bytes","sha256","meta","published","created_at","download_url"],"title":"OutputOut"},"OverrideIn":{"properties":{"action":{"type":"string","maxLength":400,"minLength":4,"title":"Action"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["action"],"title":"OverrideIn"},"Overview":{"properties":{"active_count":{"type":"integer","title":"Active Count"},"won_count":{"type":"integer","title":"Won Count"},"total_supporters":{"type":"integer","title":"Total Supporters"},"week_supporters":{"type":"integer","title":"Week Supporters"},"featured":{"items":{"$ref":"#/components/schemas/CampaignCard"},"type":"array","title":"Featured"},"recent":{"items":{"$ref":"#/components/schemas/CampaignCard"},"type":"array","title":"Recent"}},"type":"object","required":["active_count","won_count","total_supporters","week_supporters","featured","recent"],"title":"Overview"},"PasswordIn":{"properties":{"current_password":{"type":"string","maxLength":400,"title":"Current Password","default":""},"new_password":{"type":"string","maxLength":400,"minLength":1,"title":"New Password"}},"type":"object","required":["new_password"],"title":"PasswordIn"},"PatchIn":{"properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"sponsor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sponsor"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"link_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Url"},"zones":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zones"},"weight":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weight"}},"type":"object","title":"PatchIn"},"PayDisclosureOut":{"properties":{"agency_slug":{"type":"string","title":"Agency Slug"},"employer":{"type":"string","title":"Employer"},"custodian":{"type":"string","title":"Custodian"},"tool_url":{"type":"string","title":"Tool Url","default":""},"publishes_any_salaries":{"type":"boolean","title":"Publishes Any Salaries","default":false},"publishes_police_salaries":{"type":"boolean","title":"Publishes Police Salaries","default":false},"employees_published":{"type":"integer","title":"Employees Published","default":0},"departments_published":{"type":"integer","title":"Departments Published","default":0},"police_rows_published":{"type":"integer","title":"Police Rows Published","default":0},"comparison_service":{"type":"string","title":"Comparison Service","default":""},"comparison_rows_published":{"type":"integer","title":"Comparison Rows Published","default":0},"comparison_top":{"type":"string","title":"Comparison Top","default":""},"comparison_median":{"type":"string","title":"Comparison Median","default":""},"note":{"type":"string","title":"Note","default":""},"checked_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Checked On"}},"type":"object","required":["agency_slug","employer","custodian"],"title":"PayDisclosureOut","description":"What one employer publishes about what it pays its officers.\n\nCounts only — no individual's pay is stored or served. `note` states what\nthe employer's own tool returned, never why."},"PayoutOut":{"properties":{"fiscal_year":{"type":"integer","title":"Fiscal Year"},"paid_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Paid On"},"agency_name":{"type":"string","title":"Agency Name"},"agency_slug":{"type":"string","title":"Agency Slug","default":""},"loss_type":{"type":"string","title":"Loss Type"},"amount":{"type":"number","title":"Amount"},"source_url":{"type":"string","title":"Source Url","default":""}},"type":"object","required":["fiscal_year","agency_name","loss_type","amount"],"title":"PayoutOut","description":"One indemnity payment. No claimant — see AcademyPayout."},"PayoutSummary":{"properties":{"meaning":{"type":"string","title":"Meaning"},"local_gap":{"type":"string","title":"Local Gap"},"fiscal_years":{"items":{"type":"integer"},"type":"array","title":"Fiscal Years"},"total_payments":{"type":"integer","title":"Total Payments","default":0},"total_dollars":{"type":"number","title":"Total Dollars","default":0.0},"civil_rights_payments":{"type":"integer","title":"Civil Rights Payments","default":0},"civil_rights_dollars":{"type":"number","title":"Civil Rights Dollars","default":0.0},"by_agency":{"items":{"type":"object"},"type":"array","title":"By Agency"},"payouts":{"items":{"$ref":"#/components/schemas/PayoutOut"},"type":"array","title":"Payouts"}},"type":"object","required":["meaning","local_gap"],"title":"PayoutSummary","description":"What the state paid out, and the two things a reader must not conclude."},"PersonOut":{"properties":{"name":{"type":"string","title":"Name","default":""},"address":{"type":"string","title":"Address","default":""},"avatar_url":{"type":"string","title":"Avatar Url","default":""},"member_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Id"}},"type":"object","title":"PersonOut"},"PhotoEdit":{"properties":{"caption":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Caption"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"PhotoEdit"},"PhotostreamIn":{"properties":{"post_id":{"type":"integer","title":"Post Id"}},"type":"object","required":["post_id"],"title":"PhotostreamIn"},"PipelineSummary":{"properties":{"proposed_total":{"type":"integer","title":"Proposed Total"},"listed_total":{"type":"integer","title":"Listed Total"},"construction_complete":{"type":"integer","title":"Construction Complete"},"deleted":{"type":"integer","title":"Deleted"},"active_not_complete":{"type":"integer","title":"Active Not Complete"},"median_years_to_completion":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Years To Completion"},"median_years_to_deletion":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Years To Deletion"},"time_to_completion":{"items":{"$ref":"#/components/schemas/DurationBucket"},"type":"array","title":"Time To Completion"}},"type":"object","required":["proposed_total","listed_total","construction_complete","deleted","active_not_complete","median_years_to_completion","median_years_to_deletion","time_to_completion"],"title":"PipelineSummary"},"PitchCreate":{"properties":{"title":{"type":"string","maxLength":160,"minLength":4,"title":"Title"},"summary":{"type":"string","maxLength":4000,"minLength":20,"title":"Summary"},"plan":{"type":"string","maxLength":4000,"title":"Plan","default":""},"who_it_helps":{"type":"string","maxLength":2000,"title":"Who It Helps","default":""},"timeline":{"type":"string","maxLength":300,"title":"Timeline","default":""},"category":{"type":"string","maxLength":40,"title":"Category","default":"other"},"ask_dollars":{"type":"number","maximum":250000.0,"minimum":1.0,"title":"Ask Dollars"},"market_slug":{"type":"string","maxLength":120,"title":"Market Slug","default":""},"place":{"type":"string","maxLength":160,"title":"Place","default":""},"display_name":{"type":"string","maxLength":120,"title":"Display Name","default":""},"pitcher_name":{"type":"string","maxLength":160,"title":"Pitcher Name","default":""},"pitcher_contact":{"type":"string","maxLength":200,"minLength":3,"title":"Pitcher Contact"}},"type":"object","required":["title","summary","ask_dollars","pitcher_contact"],"title":"PitchCreate"},"PitchModerate":{"properties":{"status":{"type":"string","pattern":"^(pending|published|shortlisted|funded|declined)$","title":"Status"},"moderator_note":{"type":"string","maxLength":400,"title":"Moderator Note","default":""},"awarded_dollars":{"anyOf":[{"type":"number","maximum":250000.0,"minimum":0.0},{"type":"null"}],"title":"Awarded Dollars"},"report_back":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Report Back"},"report_url":{"anyOf":[{"type":"string","maxLength":800},{"type":"null"}],"title":"Report Url"}},"type":"object","required":["status"],"title":"PitchModerate"},"PlaceIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"market"},"value":{"type":"string","title":"Value"}},"type":"object","required":["value"],"title":"PlaceIn"},"PledgeIn":{"properties":{"tier":{"type":"string","maxLength":10,"title":"Tier","default":"paid"},"period":{"type":"string","maxLength":8,"title":"Period","default":"month"},"lane":{"type":"string","maxLength":40,"title":"Lane","default":""},"amount_cents":{"anyOf":[{"type":"integer","maximum":50000000.0,"minimum":0.0},{"type":"null"}],"title":"Amount Cents"},"note":{"type":"string","maxLength":400,"title":"Note","default":""}},"type":"object","title":"PledgeIn"},"PledgeOut":{"properties":{"version":{"type":"string","title":"Version"},"title":{"type":"string","title":"Title"},"text":{"type":"string","title":"Text"},"signed":{"type":"boolean","title":"Signed"},"stars":{"type":"integer","title":"Stars"},"would_collect":{"type":"integer","title":"Would Collect","default":0}},"type":"object","required":["version","title","text","signed","stars"],"title":"PledgeOut"},"PolygonIn":{"properties":{"coordinates":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Coordinates"},"base":{"type":"string","title":"Base","default":"rim"}},"type":"object","required":["coordinates"],"title":"PolygonIn"},"PositionIn":{"properties":{"seconds":{"type":"integer","title":"Seconds","default":0},"token":{"type":"string","title":"Token","default":""}},"type":"object","title":"PositionIn"},"PostBrief":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"subtitle":{"type":"string","title":"Subtitle","default":""},"audience":{"type":"string","title":"Audience","default":"everyone"},"status":{"type":"string","title":"Status","default":"published"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"word_count":{"type":"integer","title":"Word Count","default":0},"read_minutes":{"type":"integer","title":"Read Minutes","default":1},"excerpt":{"type":"string","title":"Excerpt","default":""},"locked":{"type":"boolean","title":"Locked","default":false},"comment_count":{"type":"integer","title":"Comment Count","default":0},"like_count":{"type":"integer","title":"Like Count","default":0},"stack":{"anyOf":[{"$ref":"#/components/schemas/StackBrief"},{"type":"null"}]}},"type":"object","required":["id","slug","title"],"title":"PostBrief"},"PostCreate":{"properties":{"title":{"type":"string","maxLength":300,"minLength":1,"title":"Title"},"body":{"type":"string","maxLength":20000,"title":"Body","default":""}},"type":"object","required":["title"],"title":"PostCreate"},"PostFlags":{"properties":{"id":{"type":"integer","title":"Id"},"is_pinned":{"type":"boolean","title":"Is Pinned"},"is_locked":{"type":"boolean","title":"Is Locked"}},"type":"object","required":["id","is_pinned","is_locked"],"title":"PostFlags"},"PostIn":{"properties":{"body":{"type":"string","minLength":1,"title":"Body"},"reply_to":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reply To"},"quote_of":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quote Of"},"market":{"type":"string","title":"Market","default":""}},"type":"object","required":["body"],"title":"PostIn"},"PostListItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"author":{"anyOf":[{"$ref":"#/components/schemas/AuthorOut"},{"type":"null"}]},"is_pinned":{"type":"boolean","title":"Is Pinned"},"is_locked":{"type":"boolean","title":"Is Locked"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"comment_count":{"type":"integer","title":"Comment Count","default":0},"like_count":{"type":"integer","title":"Like Count","default":0}},"type":"object","required":["id","title","author","is_pinned","is_locked","created_at"],"title":"PostListItem"},"PostModerate":{"properties":{"is_pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pinned"},"is_locked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Locked"}},"type":"object","title":"PostModerate","description":"Admin toggles for a post. Omit a field to leave it unchanged."},"PostOut":{"properties":{"id":{"type":"integer","title":"Id"},"author":{"$ref":"#/components/schemas/ProfileBrief"},"kind":{"type":"string","title":"Kind"},"caption":{"type":"string","title":"Caption"},"location_text":{"type":"string","title":"Location Text"},"market_slug":{"type":"string","title":"Market Slug"},"market_name":{"type":"string","title":"Market Name"},"visibility":{"type":"string","title":"Visibility"},"like_count":{"type":"integer","title":"Like Count"},"comment_count":{"type":"integer","title":"Comment Count"},"comments_disabled":{"type":"boolean","title":"Comments Disabled"},"created_at":{"type":"string","title":"Created At"},"media":{"items":{"$ref":"#/components/schemas/app__routes_instag__MediaOut"},"type":"array","title":"Media"},"liked":{"type":"boolean","title":"Liked","default":false},"is_mine":{"type":"boolean","title":"Is Mine","default":false}},"type":"object","required":["id","author","kind","caption","location_text","market_slug","market_name","visibility","like_count","comment_count","comments_disabled","created_at","media"],"title":"PostOut"},"PostPage":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"posts":{"items":{"$ref":"#/components/schemas/PostBrief"},"type":"array","title":"Posts"}},"type":"object","required":["total","page","per_page"],"title":"PostPage"},"PostThread":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"author":{"anyOf":[{"$ref":"#/components/schemas/AuthorOut"},{"type":"null"}]},"is_pinned":{"type":"boolean","title":"Is Pinned"},"is_locked":{"type":"boolean","title":"Is Locked"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"comment_count":{"type":"integer","title":"Comment Count","default":0},"like_count":{"type":"integer","title":"Like Count","default":0},"body":{"type":"string","title":"Body"},"board":{"$ref":"#/components/schemas/BoardOut"},"liked_by_me":{"type":"boolean","title":"Liked By Me","default":false},"comments":{"items":{"$ref":"#/components/schemas/app__schemas__CommentOut"},"type":"array","title":"Comments"}},"type":"object","required":["id","title","author","is_pinned","is_locked","created_at","body","board","comments"],"title":"PostThread"},"PostWrite":{"properties":{"title":{"type":"string","maxLength":300,"title":"Title","default":""},"subtitle":{"type":"string","maxLength":400,"title":"Subtitle","default":""},"body_md":{"type":"string","maxLength":400000,"title":"Body Md","default":""},"audience":{"type":"string","maxLength":12,"title":"Audience","default":"everyone"}},"type":"object","title":"PostWrite"},"PressEmailIn":{"properties":{"to":{"type":"string","title":"To"},"reporter":{"type":"string","title":"Reporter","default":""},"png":{"type":"string","title":"Png"}},"type":"object","required":["to","png"],"title":"PressEmailIn"},"PressFeed":{"properties":{"agency_slug":{"type":"string","title":"Agency Slug"},"agency_name":{"type":"string","title":"Agency Name"},"total":{"type":"integer","title":"Total","default":0},"kind_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Kind Counts"},"items":{"items":{"$ref":"#/components/schemas/PressItem"},"type":"array","title":"Items"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["agency_slug","agency_name"],"title":"PressFeed"},"PressItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url","default":""},"published_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published On"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"},"excerpt":{"type":"string","title":"Excerpt","default":""}},"type":"object","required":["id","title","kind","kind_label"],"title":"PressItem"},"PreviewIn":{"properties":{"body_md":{"type":"string","maxLength":400000,"title":"Body Md","default":""}},"type":"object","title":"PreviewIn"},"PriceIn":{"properties":{"min_cents":{"type":"integer","title":"Min Cents","default":0},"suggested_cents":{"type":"integer","title":"Suggested Cents","default":0},"max_cents":{"type":"integer","title":"Max Cents","default":100000},"note":{"type":"string","title":"Note","default":""},"tiers":{"items":{"type":"object"},"type":"array","title":"Tiers"}},"type":"object","title":"PriceIn"},"PricingIn":{"properties":{"policy":{"type":"object","title":"Policy"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["policy"],"title":"PricingIn"},"ProbeIn":{"properties":{"kind":{"type":"string","pattern":"^(nws|socrata|arcgis|json)$","title":"Kind"},"url":{"type":"string","title":"Url","default":""},"agency":{"type":"string","title":"Agency","default":""},"config":{"type":"object","title":"Config"}},"type":"object","required":["kind"],"title":"ProbeIn"},"ProcurementStateRollup":{"properties":{"state":{"type":"string","title":"State"},"name":{"type":"string","title":"Name"},"jurisdictions_total":{"type":"integer","title":"Jurisdictions Total"},"jurisdictions_swept":{"type":"integer","title":"Jurisdictions Swept"},"jurisdictions_with_contracts":{"type":"integer","title":"Jurisdictions With Contracts"},"contracts_total":{"type":"integer","title":"Contracts Total"},"earliest_contract":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Earliest Contract"},"total_contracted":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Contracted"},"finding_count":{"type":"integer","title":"Finding Count"},"gap_count":{"type":"integer","title":"Gap Count"}},"type":"object","required":["state","name","jurisdictions_total","jurisdictions_swept","jurisdictions_with_contracts","contracts_total","earliest_contract","total_contracted","finding_count","gap_count"],"title":"ProcurementStateRollup"},"ProcurementSummary":{"properties":{"state":{"type":"string","title":"State"},"state_name":{"type":"string","title":"State Name"},"jurisdictions_total":{"type":"integer","title":"Jurisdictions Total"},"jurisdictions_swept":{"type":"integer","title":"Jurisdictions Swept"},"jurisdictions_with_contracts":{"type":"integer","title":"Jurisdictions With Contracts"},"contracts_total":{"type":"integer","title":"Contracts Total"},"earliest_contract":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Earliest Contract"},"total_contracted":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Contracted"},"documented_cameras":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Documented Cameras"},"findings_by_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"Findings By Category"},"gaps_by_kind":{"additionalProperties":{"type":"integer"},"type":"object","title":"Gaps By Kind"},"funding_by_source":{"additionalProperties":{"type":"integer"},"type":"object","title":"Funding By Source"},"gap_caveat":{"type":"string","title":"Gap Caveat","default":"A gap means the record was not found on the jurisdiction's public portal. It is not a statement that the record does not exist, and it is not a statement about whether the jurisdiction operates ALPR."}},"type":"object","required":["state","state_name","jurisdictions_total","jurisdictions_swept","jurisdictions_with_contracts","contracts_total","earliest_contract","total_contracted","documented_cameras","findings_by_category","gaps_by_kind","funding_by_source"],"title":"ProcurementSummary"},"ProductCreate":{"properties":{"section":{"type":"string","maxLength":80,"title":"Section","default":""},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":4000,"title":"Description","default":""},"price_cents":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Price Cents"},"price_note":{"type":"string","maxLength":120,"title":"Price Note","default":""},"is_featured":{"type":"boolean","title":"Is Featured","default":false}},"type":"object","required":["name"],"title":"ProductCreate"},"ProductEdit":{"properties":{"section":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Section"},"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description"},"price_cents":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Price Cents"},"price_note":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Price Note"},"is_featured":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Featured"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ProductEdit"},"ProductOut":{"properties":{"id":{"type":"integer","title":"Id"},"section":{"type":"string","title":"Section"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Cents"},"price_note":{"type":"string","title":"Price Note"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"},"is_featured":{"type":"boolean","title":"Is Featured"},"is_published":{"type":"boolean","title":"Is Published"},"sort_order":{"type":"integer","title":"Sort Order"}},"type":"object","required":["id","section","name","description","price_cents","price_note","is_featured","is_published","sort_order"],"title":"ProductOut"},"ProfileBrief":{"properties":{"handle":{"type":"string","title":"Handle"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"type":"string","title":"Avatar Url"},"is_private":{"type":"boolean","title":"Is Private"}},"type":"object","required":["handle","display_name","avatar_url","is_private"],"title":"ProfileBrief"},"ProfileOut":{"properties":{"handle":{"type":"string","title":"Handle"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"type":"string","title":"Avatar Url"},"is_private":{"type":"boolean","title":"Is Private"},"bio":{"type":"string","title":"Bio"},"link_url":{"type":"string","title":"Link Url"},"post_count":{"type":"integer","title":"Post Count"},"follower_count":{"type":"integer","title":"Follower Count"},"following_count":{"type":"integer","title":"Following Count"},"home_market":{"type":"string","title":"Home Market"},"is_me":{"type":"boolean","title":"Is Me","default":false},"is_following":{"type":"boolean","title":"Is Following","default":false},"follow_pending":{"type":"boolean","title":"Follow Pending","default":false},"can_change_handle":{"type":"boolean","title":"Can Change Handle","default":false},"handle_change_allowed_at":{"type":"string","title":"Handle Change Allowed At","default":""},"handle_cooldown_days":{"type":"integer","title":"Handle Cooldown Days","default":0}},"type":"object","required":["handle","display_name","avatar_url","is_private","bio","link_url","post_count","follower_count","following_count","home_market"],"title":"ProfileOut"},"ProfilePatch":{"properties":{"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"display_name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Display Name"},"bio":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Bio"},"link_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Link Url"},"is_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Private"},"home_market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Market"}},"type":"object","title":"ProfilePatch","description":"Omit a field to leave it unchanged."},"ProgressIn":{"properties":{"status":{"type":"string","title":"Status"},"pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pct"},"note":{"type":"string","title":"Note","default":""},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"log_excerpt":{"type":"string","title":"Log Excerpt","default":""}},"type":"object","required":["status"],"title":"ProgressIn"},"ProjectCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"client_name":{"type":"string","maxLength":200,"title":"Client Name","default":""},"status":{"type":"string","maxLength":60,"title":"Status","default":""},"description":{"type":"string","maxLength":4000,"title":"Description","default":""}},"type":"object","required":["title"],"title":"ProjectCreate"},"ProjectEdit":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"client_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Client Name"},"status":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Status"},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ProjectEdit"},"ProjectOut":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"client_name":{"type":"string","title":"Client Name"},"status":{"type":"string","title":"Status"},"description":{"type":"string","title":"Description"},"photos":{"items":{"$ref":"#/components/schemas/app__routes_portfolio__PhotoOut"},"type":"array","title":"Photos","default":[]},"is_published":{"type":"boolean","title":"Is Published"},"sort_order":{"type":"integer","title":"Sort Order"}},"type":"object","required":["id","title","client_name","status","description","is_published","sort_order"],"title":"ProjectOut"},"ProposalIn":{"properties":{"title":{"type":"string","maxLength":200,"minLength":4,"title":"Title"},"summary":{"type":"string","maxLength":300,"title":"Summary","default":""},"body":{"type":"string","title":"Body","default":""},"water_finding":{"type":"string","title":"Water Finding","default":""},"gallery":{"type":"string","title":"Gallery","default":""}},"type":"object","required":["title"],"title":"ProposalIn"},"PublishPatch":{"properties":{"ids":{"items":{"type":"integer"},"type":"array","title":"Ids"},"published":{"type":"boolean","title":"Published","default":true}},"type":"object","title":"PublishPatch"},"QueuedReply":{"properties":{"id":{"type":"integer","title":"Id"},"officer_cert":{"type":"string","title":"Officer Cert","default":""},"officer_name":{"type":"string","title":"Officer Name","default":""},"conduct_record_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conduct Record Id"},"disputes":{"type":"string","title":"Disputes","default":""},"kind":{"type":"string","title":"Kind"},"body":{"type":"string","title":"Body"},"evidence_url":{"type":"string","title":"Evidence Url","default":""},"attested":{"type":"boolean","title":"Attested","default":false},"submitter_role":{"type":"string","title":"Submitter Role","default":""},"submitter_name":{"type":"string","title":"Submitter Name","default":""},"submitter_contact":{"type":"string","title":"Submitter Contact","default":""},"status":{"type":"string","title":"Status"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"days_waiting":{"type":"integer","title":"Days Waiting","default":0},"overdue":{"type":"boolean","title":"Overdue","default":false}},"type":"object","required":["id","kind","body","status"],"title":"QueuedReply"},"QuickNavIn":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":40,"title":"Ids"}},"type":"object","title":"QuickNavIn"},"ReasonCount":{"properties":{"reason":{"type":"string","title":"Reason"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["reason","count"],"title":"ReasonCount"},"RebuildIn":{"properties":{"reason":{"type":"string","title":"Reason","default":""},"format_slug":{"type":"string","title":"Format Slug","default":""}},"type":"object","title":"RebuildIn"},"RecognitionOut":{"properties":{"spotlight":{"items":{"$ref":"#/components/schemas/ConductOut"},"type":"array","title":"Spotlight"},"records":{"items":{"$ref":"#/components/schemas/ConductOut"},"type":"array","title":"Records"},"total":{"type":"integer","title":"Total","default":0},"asks":{"items":{"$ref":"#/components/schemas/RecordsAskOut"},"type":"array","title":"Asks"},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"RecognitionOut","description":"The good record, and — while it is empty — why it is empty.\n\nCommendations are not published the way discipline is. The state board\nrecords sanctions and has no category for good work at all, so the only\nroute to an award is a records request to the employing agency. Until those\ncome back this endpoint returns nothing, and says so with the asks attached\nrather than rendering a blank panel the reader has to interpret."},"ReconReport":{"properties":{"host":{"type":"string","title":"Host"},"resolved":{"$ref":"#/components/schemas/Resolved"},"dns":{"$ref":"#/components/schemas/DnsRecords"},"subdomains":{"items":{"type":"string"},"type":"array","title":"Subdomains"},"subdomain_count":{"type":"integer","title":"Subdomain Count"},"registration":{"anyOf":[{"$ref":"#/components/schemas/RegistrationInfo"},{"type":"null"}]},"asn":{"anyOf":[{"$ref":"#/components/schemas/AsnInfo"},{"type":"null"}]},"tls":{"anyOf":[{"$ref":"#/components/schemas/TlsInfo"},{"type":"null"}]},"http":{"anyOf":[{"$ref":"#/components/schemas/HttpInfo"},{"type":"null"}]},"flags":{"items":{"$ref":"#/components/schemas/Flag"},"type":"array","title":"Flags"},"error":{"type":"string","title":"Error"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["host","resolved","dns","subdomains","subdomain_count","registration","asn","tls","http","flags","error","notes"],"title":"ReconReport"},"ReconRequest":{"properties":{"host":{"type":"string","maxLength":253,"title":"Host"}},"type":"object","required":["host"],"title":"ReconRequest"},"RecordOut":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"retrieved":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retrieved"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"elevation_monthly":{"items":{"type":"object"},"type":"array","title":"Elevation Monthly","default":[]},"storage_monthly":{"items":{"type":"object"},"type":"array","title":"Storage Monthly","default":[]}},"type":"object","title":"RecordOut"},"RecordPoint":{"properties":{"value":{"type":"number","title":"Value"},"ym":{"type":"string","title":"Ym"}},"type":"object","required":["value","ym"],"title":"RecordPoint"},"RecordPreview":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"parent_id":{"type":"string","title":"Parent Id","default":""},"size_bytes":{"type":"integer","title":"Size Bytes"},"sha256":{"type":"string","title":"Sha256"},"detected":{"$ref":"#/components/schemas/Detected"},"adapter":{"type":"string","title":"Adapter"},"status":{"type":"string","title":"Status"},"lossy":{"type":"boolean","title":"Lossy"},"needs":{"items":{"type":"string"},"type":"array","title":"Needs"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"},"chars":{"type":"integer","title":"Chars"},"words":{"type":"integer","title":"Words"},"pages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pages"},"metadata":{"additionalProperties":{"type":"string"},"type":"object","title":"Metadata"},"text":{"type":"string","title":"Text"},"text_truncated":{"type":"boolean","title":"Text Truncated"},"tables":{"items":{"$ref":"#/components/schemas/TablePreview"},"type":"array","title":"Tables"}},"type":"object","required":["id","name","size_bytes","sha256","detected","adapter","status","lossy","needs","notes","chars","words","metadata","text","text_truncated","tables"],"title":"RecordPreview"},"RecordsAskOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"custodian":{"type":"string","title":"Custodian"},"agency_slug":{"type":"string","title":"Agency Slug","default":""},"agency_name":{"type":"string","title":"Agency Name","default":""},"channel":{"type":"string","title":"Channel"},"portal_url":{"type":"string","title":"Portal Url","default":""},"reference":{"type":"string","title":"Reference","default":""},"scope":{"type":"string","title":"Scope"},"status":{"type":"string","title":"Status"},"status_label":{"type":"string","title":"Status Label"},"outcome":{"type":"string","title":"Outcome","default":""},"denial_basis":{"type":"string","title":"Denial Basis","default":""},"produced_count":{"type":"integer","title":"Produced Count","default":0},"filed_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Filed On"},"ack_due":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Ack Due"},"inspection_due":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Inspection Due"},"attempts":{"items":{"$ref":"#/components/schemas/AskAttempt"},"type":"array","title":"Attempts","default":[]},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["id","kind","kind_label","custodian","channel","scope","status","status_label"],"title":"RecordsAskOut"},"RecordsRequestCreate":{"properties":{"market_slug":{"type":"string","title":"Market Slug"},"agency_id":{"type":"integer","title":"Agency Id"},"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"},"requested_by":{"type":"string","title":"Requested By","default":""}},"type":"object","required":["market_slug","agency_id","subject","body"],"title":"RecordsRequestCreate"},"RecordsRequestDetail":{"properties":{"id":{"type":"integer","title":"Id"},"market_id":{"type":"integer","title":"Market Id"},"agency_id":{"type":"integer","title":"Agency Id"},"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"},"status":{"type":"string","title":"Status"},"requested_by":{"type":"string","title":"Requested By"},"messages":{"items":{"$ref":"#/components/schemas/RecordsRequestMessageOut"},"type":"array","title":"Messages"}},"type":"object","required":["id","market_id","agency_id","subject","body","status","requested_by","messages"],"title":"RecordsRequestDetail"},"RecordsRequestMessageOut":{"properties":{"id":{"type":"integer","title":"Id"},"direction":{"type":"string","title":"Direction"},"from_addr":{"type":"string","title":"From Addr"},"to_addr":{"type":"string","title":"To Addr"},"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"},"received_at":{"type":"string","format":"date-time","title":"Received At"}},"type":"object","required":["id","direction","from_addr","to_addr","subject","body","received_at"],"title":"RecordsRequestMessageOut"},"RecordsRequestOut":{"properties":{"id":{"type":"integer","title":"Id"},"market_id":{"type":"integer","title":"Market Id"},"agency_id":{"type":"integer","title":"Agency Id"},"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"},"status":{"type":"string","title":"Status"},"requested_by":{"type":"string","title":"Requested By"}},"type":"object","required":["id","market_id","agency_id","subject","body","status","requested_by"],"title":"RecordsRequestOut"},"RegisterDoc":{"properties":{"kind":{"type":"string","title":"Kind"},"label":{"type":"string","title":"Label"},"source":{"type":"string","title":"Source"},"proves":{"type":"string","title":"Proves"},"does_not_prove":{"type":"string","title":"Does Not Prove"},"count":{"type":"integer","title":"Count","default":0},"count_label":{"type":"string","title":"Count Label","default":""}},"type":"object","required":["kind","label","source","proves","does_not_prove"],"title":"RegisterDoc"},"RegistrationInfo":{"properties":{"registrar":{"type":"string","title":"Registrar"},"created":{"type":"string","title":"Created"},"updated":{"type":"string","title":"Updated"},"expires":{"type":"string","title":"Expires"},"days_to_expiry":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days To Expiry"},"nameservers":{"items":{"type":"string"},"type":"array","title":"Nameservers"},"status":{"items":{"type":"string"},"type":"array","title":"Status"},"registrant_org":{"type":"string","title":"Registrant Org"},"error":{"type":"string","title":"Error"}},"type":"object","required":["registrar","created","updated","expires","days_to_expiry","nameservers","status","registrant_org","error"],"title":"RegistrationInfo"},"RehearseIn":{"properties":{"digits":{"type":"string","title":"Digits","default":""},"road":{"type":"string","title":"Road","default":"forward"}},"type":"object","title":"RehearseIn","description":"One keypress. `road` only matters on the first leg."},"RejectIn":{"properties":{"reason":{"type":"string","maxLength":400,"title":"Reason","default":""}},"type":"object","title":"RejectIn"},"RemarkOut":{"properties":{"id":{"type":"integer","title":"Id"},"meeting_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meeting Date"},"body":{"type":"string","title":"Body"},"quote":{"type":"string","title":"Quote"},"line_start":{"type":"integer","title":"Line Start"},"line_end":{"type":"integer","title":"Line End"},"offset_ratio":{"type":"number","title":"Offset Ratio"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"},"matched_terms":{"items":{"type":"string"},"type":"array","title":"Matched Terms"},"speaker":{"type":"string","title":"Speaker"},"speaker_role":{"type":"string","title":"Speaker Role"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"},"source_kind":{"type":"string","title":"Source Kind"},"video_url":{"type":"string","title":"Video Url"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"caption_caveat":{"type":"string","title":"Caption Caveat","default":"Meeting quotes come from automatic captions and are approximate. They record what subject was discussed, not exact wording and never a figure spoken aloud. Check the recording before relying on any number."}},"type":"object","required":["id","meeting_date","body","quote","line_start","line_end","offset_ratio","topics","matched_terms","speaker","speaker_role","is_public","source_kind","video_url","document_id"],"title":"RemarkOut","description":"A passage from a meeting where ALPR was discussed.\n\n`topics` is what the passage raises, never what it concludes. The quote is\nautomatic-caption text and is labelled as such wherever it is shown, so a\nreader knows to check the recording rather than take the wording as\nverbatim."},"ReorderIn":{"properties":{"ids":{"items":{"type":"integer"},"type":"array","title":"Ids"}},"type":"object","required":["ids"],"title":"ReorderIn"},"ReplyIn":{"properties":{"cert_number":{"type":"string","title":"Cert Number"},"state_code":{"type":"string","title":"State Code","default":""},"conduct_record_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conduct Record Id"},"kind":{"type":"string","pattern":"^(correction|response)$","title":"Kind","default":"correction"},"body":{"type":"string","maxLength":8000,"minLength":20,"title":"Body"},"evidence_url":{"type":"string","title":"Evidence Url","default":""},"submitter_role":{"type":"string","pattern":"^(officer|agency|attorney|family|other)$","title":"Submitter Role","default":"other"},"submitter_name":{"type":"string","title":"Submitter Name","default":""},"submitter_contact":{"type":"string","title":"Submitter Contact","default":""},"attested":{"type":"boolean","title":"Attested","default":false}},"type":"object","required":["cert_number","body"],"title":"ReplyIn"},"ReplyOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"body":{"type":"string","title":"Body"},"evidence_url":{"type":"string","title":"Evidence Url"},"submitter_role":{"type":"string","title":"Submitter Role"},"submitter_name":{"type":"string","title":"Submitter Name"},"attested":{"type":"boolean","title":"Attested"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"}},"type":"object","required":["id","kind","body","evidence_url","submitter_role","submitter_name","attested","published_at"],"title":"ReplyOut"},"ReplyQueue":{"properties":{"total":{"type":"integer","title":"Total","default":0},"status_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Status Counts"},"oldest_days_waiting":{"type":"integer","title":"Oldest Days Waiting","default":0},"overdue_count":{"type":"integer","title":"Overdue Count","default":0},"items":{"items":{"$ref":"#/components/schemas/QueuedReply"},"type":"array","title":"Items"},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"ReplyQueue"},"ReplyReview":{"properties":{"status":{"type":"string","pattern":"^(pending|accepted|published|rejected)$","title":"Status"},"review_note":{"type":"string","title":"Review Note","default":""}},"type":"object","required":["status"],"title":"ReplyReview"},"Report":{"properties":{"file":{"$ref":"#/components/schemas/FileInfo"},"metadata":{"additionalProperties":{"type":"string"},"type":"object","title":"Metadata"},"xmp":{"additionalProperties":{"type":"string"},"type":"object","title":"Xmp"},"structure":{"$ref":"#/components/schemas/Structure"},"active_content":{"$ref":"#/components/schemas/ActiveContent"},"text":{"$ref":"#/components/schemas/TextInfo"},"flags":{"items":{"$ref":"#/components/schemas/Flag"},"type":"array","title":"Flags"},"parse_error":{"type":"string","title":"Parse Error"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["file","metadata","xmp","structure","active_content","text","flags","parse_error","notes"],"title":"Report"},"ReportCreate":{"properties":{"subject_name":{"type":"string","maxLength":200,"minLength":2,"title":"Subject Name"},"subject_office":{"type":"string","maxLength":200,"title":"Subject Office","default":""},"jurisdiction":{"type":"string","maxLength":160,"title":"Jurisdiction","default":""},"claim":{"type":"string","maxLength":4000,"minLength":8,"title":"Claim"},"context":{"type":"string","maxLength":4000,"title":"Context","default":""},"statement_date":{"type":"string","maxLength":20,"title":"Statement Date","default":""},"source_url":{"type":"string","maxLength":800,"title":"Source Url","default":""},"category":{"type":"string","maxLength":60,"title":"Category","default":"other"},"reporter_name":{"type":"string","maxLength":160,"title":"Reporter Name","default":""},"reporter_contact":{"type":"string","maxLength":200,"title":"Reporter Contact","default":""},"is_whistleblower":{"type":"boolean","title":"Is Whistleblower","default":false}},"type":"object","required":["subject_name","claim"],"title":"ReportCreate"},"ReportStolenIn":{"properties":{"serial_number":{"type":"string","maxLength":32,"title":"Serial Number"},"note":{"type":"string","maxLength":300,"title":"Note","default":""}},"type":"object","required":["serial_number"],"title":"ReportStolenIn"},"ReservoirRow":{"properties":{"elevation_ft":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Elevation Ft"},"elevation_observed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Elevation Observed At"},"elevation_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Elevation Source"},"elevation_is_daily":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Elevation Is Daily"},"storage_af":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Storage Af"},"storage_observed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Observed At"},"storage_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Source"},"pct_full":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Full"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"dam":{"type":"string","title":"Dam"},"river":{"type":"string","title":"River"},"states":{"items":{"type":"string"},"type":"array","title":"States"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"tz":{"type":"string","title":"Tz"},"capacity_af":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Capacity Af"},"capacity_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity Source"},"capacity_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity Date"},"capacity_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity Basis"},"full_pool_ft":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Full Pool Ft"},"dead_pool_ft":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dead Pool Ft"},"elevation_datum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Elevation Datum"},"why":{"type":"string","title":"Why"},"system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System"},"drought_cat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drought Cat"},"drought_week":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drought Week"},"trend_30d":{"anyOf":[{"$ref":"#/components/schemas/TrendOut"},{"type":"null"}]},"standing_rank_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Standing Rank Pct"},"standing_years":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Standing Years"},"standing_measure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Standing Measure"}},"type":"object","required":["slug","name","dam","river","states","lat","lng","tz","why"],"title":"ReservoirRow","description":"One national-map row: roster identity plus the current overlay."},"ResetIn":{"properties":{"token":{"type":"string","maxLength":200,"title":"Token","default":""},"new_password":{"type":"string","maxLength":400,"minLength":1,"title":"New Password"}},"type":"object","required":["new_password"],"title":"ResetIn"},"ResolveOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"reason":{"type":"string","title":"Reason","default":""},"kind":{"type":"string","title":"Kind","default":""},"label":{"type":"string","title":"Label","default":""}},"type":"object","required":["ok"],"title":"ResolveOut"},"Resolved":{"properties":{"a":{"items":{"type":"string"},"type":"array","title":"A"},"aaaa":{"items":{"type":"string"},"type":"array","title":"Aaaa"},"all_public":{"type":"boolean","title":"All Public"}},"type":"object","required":["a","aaaa","all_public"],"title":"Resolved"},"RevisionOut":{"properties":{"id":{"type":"integer","title":"Id"},"meeting_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Meeting Id"},"meeting_title":{"type":"string","title":"Meeting Title","default":""},"remote_url":{"type":"string","title":"Remote Url"},"revision":{"type":"integer","title":"Revision"},"content_hash":{"type":"string","title":"Content Hash"},"replaced_hash":{"type":"string","title":"Replaced Hash"},"words_added":{"type":"integer","title":"Words Added"},"words_removed":{"type":"integer","title":"Words Removed"},"diff_summary":{"type":"string","title":"Diff Summary"},"first_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Seen At"}},"type":"object","required":["id","meeting_id","remote_url","revision","content_hash","replaced_hash","words_added","words_removed","diff_summary","first_seen_at"],"title":"RevisionOut"},"RideCard":{"properties":{"code":{"type":"string","title":"Code"},"direction":{"type":"string","title":"Direction"},"lane":{"type":"string","title":"Lane"},"purpose":{"type":"string","title":"Purpose"},"origin_label":{"type":"string","title":"Origin Label"},"destination_label":{"type":"string","title":"Destination Label"},"pickup_kind":{"type":"string","title":"Pickup Kind"},"depart_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Depart At"},"flexible":{"type":"boolean","title":"Flexible"},"seats":{"type":"integer","title":"Seats"},"seats_left":{"type":"integer","title":"Seats Left"},"notes":{"type":"string","title":"Notes"},"state":{"type":"string","title":"State"},"poster_id":{"type":"integer","title":"Poster Id"},"poster_name":{"type":"string","title":"Poster Name"},"vehicle":{"type":"string","title":"Vehicle"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["code","direction","lane","purpose","origin_label","destination_label","pickup_kind","depart_at","flexible","seats","seats_left","notes","state","poster_id","poster_name","vehicle","created_at"],"title":"RideCard","description":"The board. NO pickup point, NO phone, NO plate, NO handle — see the\nmodule docstring. Adding one of those fields here is the bug this module\nis most likely to have."},"RideDetail":{"properties":{"code":{"type":"string","title":"Code"},"direction":{"type":"string","title":"Direction"},"lane":{"type":"string","title":"Lane"},"purpose":{"type":"string","title":"Purpose"},"origin_label":{"type":"string","title":"Origin Label"},"destination_label":{"type":"string","title":"Destination Label"},"pickup_kind":{"type":"string","title":"Pickup Kind"},"depart_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Depart At"},"flexible":{"type":"boolean","title":"Flexible"},"seats":{"type":"integer","title":"Seats"},"seats_left":{"type":"integer","title":"Seats Left"},"notes":{"type":"string","title":"Notes"},"state":{"type":"string","title":"State"},"poster_id":{"type":"integer","title":"Poster Id"},"poster_name":{"type":"string","title":"Poster Name"},"vehicle":{"type":"string","title":"Vehicle"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"details":{"anyOf":[{"$ref":"#/components/schemas/RideDetails"},{"type":"null"}]},"my_claim_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"My Claim Id"},"my_claim_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"My Claim Status"},"claim_count":{"type":"integer","title":"Claim Count","default":0}},"type":"object","required":["code","direction","lane","purpose","origin_label","destination_label","pickup_kind","depart_at","flexible","seats","seats_left","notes","state","poster_id","poster_name","vehicle","created_at"],"title":"RideDetail","description":"One ride. Same public fields, plus the gated half as a nested object."},"RideDetails":{"properties":{"pickup_point":{"type":"string","title":"Pickup Point"},"contact_phone":{"type":"string","title":"Contact Phone"},"other_phone":{"type":"string","title":"Other Phone"},"plate":{"type":"string","title":"Plate"},"code_word":{"type":"string","title":"Code Word"},"contribution_cents":{"type":"integer","title":"Contribution Cents"},"pay_methods":{"items":{"type":"string"},"type":"array","title":"Pay Methods"},"pay_handle":{"type":"string","title":"Pay Handle"},"closes_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closes At"}},"type":"object","required":["pickup_point","contact_phone","other_phone","plate","code_word","contribution_cents","pay_methods","pay_handle","closes_at"],"title":"RideDetails","description":"THE PRIVATE HALF. Present only when `taxi.ride_details_visible_to()`\nreturns True, and absent — the whole object `None` — otherwise.\n\nEverything in here is a thing that, published, would tell a stranger where\na named person will be standing and when."},"RideIn":{"properties":{"direction":{"type":"string","title":"Direction","default":"offer"},"lane":{"type":"string","title":"Lane","default":"free"},"purpose":{"type":"string","title":"Purpose","default":"other"},"origin_label":{"type":"string","title":"Origin Label","default":""},"destination_label":{"type":"string","title":"Destination Label","default":""},"pickup_point":{"type":"string","title":"Pickup Point","default":""},"pickup_kind":{"type":"string","title":"Pickup Kind","default":"public"},"contact_phone":{"type":"string","title":"Contact Phone","default":""},"depart_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Depart At"},"flexible":{"type":"boolean","title":"Flexible","default":false},"notes":{"type":"string","title":"Notes","default":""},"seats":{"type":"integer","title":"Seats","default":1},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"contribution_cents":{"type":"integer","title":"Contribution Cents","default":0}},"type":"object","title":"RideIn"},"RosterEntry":{"properties":{"display_name":{"type":"string","title":"Display Name"},"display_public":{"type":"boolean","title":"Display Public"},"comment":{"type":"string","title":"Comment"},"postal_code":{"type":"string","title":"Postal Code"},"rsvp":{"type":"string","title":"Rsvp"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["display_name","display_public","comment","postal_code","rsvp","created_at"],"title":"RosterEntry"},"RotationOut":{"properties":{"zone":{"type":"string","title":"Zone"},"banners":{"items":{"$ref":"#/components/schemas/AdOut"},"type":"array","title":"Banners"},"commercials":{"items":{"$ref":"#/components/schemas/AdOut"},"type":"array","title":"Commercials"}},"type":"object","required":["zone","banners","commercials"],"title":"RotationOut"},"RunBrief":{"properties":{"id":{"type":"integer","title":"Id"},"ref":{"type":"string","title":"Ref"},"seq":{"type":"integer","title":"Seq"},"engine":{"type":"string","title":"Engine"},"status":{"type":"string","title":"Status"},"progress_pct":{"type":"integer","title":"Progress Pct"},"accuracy_class":{"type":"string","title":"Accuracy Class"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"}},"type":"object","required":["id","ref","seq","engine","status","progress_pct","accuracy_class","created_at","finished_at"],"title":"RunBrief"},"RunIn":{"properties":{"engine":{"type":"string","title":"Engine","default":"odm"},"params":{"type":"object","title":"Params"},"priority":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Priority","default":100}},"type":"object","title":"RunIn"},"SaveRemixRequest":{"properties":{"mixToken":{"type":"string","title":"Mixtoken"},"title":{"type":"string","title":"Title","default":""},"synopsis":{"type":"string","title":"Synopsis","default":""},"coverId":{"type":"string","title":"Coverid","default":""}},"type":"object","required":["mixToken"],"title":"SaveRemixRequest"},"ScopeIn":{"properties":{"question":{"type":"string","maxLength":600,"minLength":15,"title":"Question"},"subject":{"type":"string","maxLength":300,"minLength":3,"title":"Subject"},"jurisdiction":{"type":"string","maxLength":200,"minLength":2,"title":"Jurisdiction"},"reply_to":{"type":"string","maxLength":200,"minLength":3,"title":"Reply To"},"sources":{"items":{"type":"object"},"type":"array","title":"Sources"},"source_pages":{"type":"integer","maximum":100000.0,"minimum":0.0,"title":"Source Pages","default":0}},"type":"object","required":["question","subject","jurisdiction","reply_to"],"title":"ScopeIn"},"SectionCreate":{"properties":{"name":{"type":"string","maxLength":160,"minLength":1,"title":"Name"},"kind":{"type":"string","pattern":"^(yellow|white|blue)$","title":"Kind","default":"yellow"},"emoji":{"type":"string","maxLength":16,"title":"Emoji","default":"📖"},"blurb":{"type":"string","maxLength":300,"title":"Blurb","default":""}},"type":"object","required":["name"],"title":"SectionCreate"},"SectionGroup":{"properties":{"name":{"type":"string","title":"Name"},"products":{"items":{"$ref":"#/components/schemas/ProductOut"},"type":"array","title":"Products"}},"type":"object","required":["name","products"],"title":"SectionGroup"},"SectionWithCount":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"emoji":{"type":"string","title":"Emoji"},"blurb":{"type":"string","title":"Blurb"},"listing_count":{"type":"integer","title":"Listing Count","default":0}},"type":"object","required":["id","slug","name","kind","emoji","blurb"],"title":"SectionWithCount"},"SeedIn":{"properties":{"cultivar":{"type":"string","maxLength":140,"minLength":1,"title":"Cultivar"},"breeder":{"type":"string","maxLength":140,"title":"Breeder","default":""},"scientific_name":{"type":"string","maxLength":160,"title":"Scientific Name","default":""},"lifecycle":{"type":"string","title":"Lifecycle","default":"unknown"},"description":{"type":"string","maxLength":8000,"title":"Description","default":""},"planting_instructions":{"type":"string","maxLength":4000,"title":"Planting Instructions","default":""},"care_notes":{"type":"string","maxLength":4000,"title":"Care Notes","default":""},"days_to_maturity":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":0.0},{"type":"null"}],"title":"Days To Maturity"},"sun":{"type":"string","maxLength":12,"title":"Sun","default":""},"water":{"type":"string","maxLength":10,"title":"Water","default":""},"spacing":{"type":"string","maxLength":60,"title":"Spacing","default":""},"book_page_no":{"type":"string","maxLength":20,"title":"Book Page No","default":""},"elevation":{"type":"string","maxLength":40,"title":"Elevation","default":""},"packaged_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Packaged Date"},"planting_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Planting Date"},"harvest_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Harvest Date"},"quantity_note":{"type":"string","maxLength":80,"title":"Quantity Note","default":""},"image_url":{"type":"string","maxLength":2000,"title":"Image Url","default":""},"thumbnail_url":{"type":"string","maxLength":2000,"title":"Thumbnail Url","default":""},"is_public":{"type":"boolean","title":"Is Public","default":true}},"type":"object","required":["cultivar"],"title":"SeedIn"},"SeedOut":{"properties":{"ref":{"type":"string","title":"Ref"},"seed_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seed Code"},"cultivar":{"type":"string","title":"Cultivar"},"breeder":{"type":"string","title":"Breeder"},"scientific_name":{"type":"string","title":"Scientific Name"},"lifecycle":{"type":"string","title":"Lifecycle"},"description":{"type":"string","title":"Description"},"planting_instructions":{"type":"string","title":"Planting Instructions"},"care_notes":{"type":"string","title":"Care Notes"},"days_to_maturity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days To Maturity"},"sun":{"type":"string","title":"Sun"},"water":{"type":"string","title":"Water"},"spacing":{"type":"string","title":"Spacing"},"book_page_no":{"type":"string","title":"Book Page No"},"elevation":{"type":"string","title":"Elevation"},"packaged_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Packaged Date"},"planting_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Planting Date"},"harvest_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Harvest Date"},"quantity_note":{"type":"string","title":"Quantity Note"},"image_url":{"type":"string","title":"Image Url"},"thumbnail_url":{"type":"string","title":"Thumbnail Url"},"additional_images":{"items":{"type":"string"},"type":"array","title":"Additional Images"},"market":{"type":"string","title":"Market"},"owner_id":{"type":"integer","title":"Owner Id"},"owner_name":{"type":"string","title":"Owner Name"},"is_public":{"type":"boolean","title":"Is Public"},"is_hidden":{"type":"boolean","title":"Is Hidden"},"path":{"type":"string","title":"Path"},"qr_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qr Code"},"qr_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qr Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["ref","seed_code","cultivar","breeder","scientific_name","lifecycle","description","planting_instructions","care_notes","days_to_maturity","sun","water","spacing","book_page_no","elevation","packaged_date","planting_date","harvest_date","quantity_note","image_url","thumbnail_url","additional_images","market","owner_id","owner_name","is_public","is_hidden","path","created_at"],"title":"SeedOut"},"SensorIn":{"properties":{"kind":{"type":"string","title":"Kind"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"meta":{"type":"object","title":"Meta"}},"type":"object","required":["kind","name"],"title":"SensorIn"},"SeriesOut":{"properties":{"note":{"type":"string","title":"Note"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"series_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Series Url"},"retrieved":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retrieved"},"quotient":{"$ref":"#/components/schemas/Indicator"},"monthly":{"items":{"type":"object"},"type":"array","title":"Monthly"}},"type":"object","required":["note","quotient","monthly"],"title":"SeriesOut"},"SettingsPatch":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"sources":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Sources"},"lanes":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Lanes"},"require_local":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Local"},"blocked_terms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Blocked Terms"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"home_market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Market"},"pinned":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Pinned"},"max_items":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Items"},"per_source":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Per Source"},"max_age_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Age Days"},"show_weather":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Weather"},"show_aboard":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Aboard"}},"type":"object","title":"SettingsPatch","description":"A sparse patch. Anything absent is left alone; anything null is CLEARED.\n\nCleared is not the same as false, and the desk needs both: false means \"this\nmarket says no\", null means \"this market has no opinion, follow the house\"."},"SettleIn":{"properties":{"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"SettleIn"},"SharingOrg":{"properties":{"name":{"type":"string","title":"Name"},"is_federal":{"type":"boolean","title":"Is Federal"}},"type":"object","required":["name","is_federal"],"title":"SharingOrg"},"ShiftOut":{"properties":{"id":{"type":"integer","title":"Id"},"store_slug":{"type":"string","title":"Store Slug","default":""},"store_name":{"type":"string","title":"Store Name","default":""},"business_date":{"type":"string","format":"date","title":"Business Date"},"state":{"type":"string","title":"State"},"settled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Settled At"},"settle_note":{"type":"string","title":"Settle Note","default":""},"rows":{"items":{"$ref":"#/components/schemas/ShiftRowOut"},"type":"array","title":"Rows"},"totals":{"items":{"type":"object"},"type":"array","title":"Totals"},"unacknowledged":{"items":{"type":"integer"},"type":"array","title":"Unacknowledged"},"acknowledged_by":{"items":{"type":"integer"},"type":"array","title":"Acknowledged By"},"entry_hash":{"type":"string","title":"Entry Hash","default":""}},"type":"object","required":["id","business_date","state"],"title":"ShiftOut","description":"The closeout, as BOTH sides see it. One shape, deliberately.\n\nThere is no `for_driver` variant of this model and no field that renders\ndifferently depending on who asked. Two renderings of a payment record is\nhow two people end up arguing about different numbers."},"ShiftRowOut":{"properties":{"run_id":{"type":"integer","title":"Run Id"},"driver_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Driver Id"},"driver_name":{"type":"string","title":"Driver Name","default":""},"order_code":{"type":"string","title":"Order Code","default":""},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"pay_cents":{"type":"integer","title":"Pay Cents","default":0}},"type":"object","required":["run_id"],"title":"ShiftRowOut"},"ShipIn":{"properties":{"carrier":{"type":"string","title":"Carrier","default":""},"tracking":{"type":"string","title":"Tracking","default":""},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"ShipIn"},"SightingPoint":{"properties":{"ts":{"type":"string","format":"date-time","title":"Ts"},"rssi":{"type":"integer","title":"Rssi"}},"type":"object","required":["ts","rssi"],"title":"SightingPoint"},"SignalsSummary":{"properties":{"active_devices":{"type":"integer","title":"Active Devices"},"wifi_count":{"type":"integer","title":"Wifi Count"},"ble_count":{"type":"integer","title":"Ble Count"},"node_count":{"type":"integer","title":"Node Count"},"online_node_count":{"type":"integer","title":"Online Node Count"},"randomized_pct":{"type":"integer","title":"Randomized Pct"},"demo_only":{"type":"boolean","title":"Demo Only"},"by_class":{"items":{"$ref":"#/components/schemas/ClassBreakdown"},"type":"array","title":"By Class"},"top_vendors":{"items":{"$ref":"#/components/schemas/VendorCount"},"type":"array","title":"Top Vendors"}},"type":"object","required":["active_devices","wifi_count","ble_count","node_count","online_node_count","randomized_pct","demo_only","by_class","top_vendors"],"title":"SignalsSummary"},"SilenceIn":{"properties":{"level":{"type":"string","title":"Level","default":"silence"},"reason":{"type":"string","maxLength":200,"title":"Reason","default":""}},"type":"object","title":"SilenceIn"},"SiteDetail":{"properties":{"id":{"type":"integer","title":"Id"},"sems_id":{"type":"integer","title":"Sems Id"},"epa_id":{"type":"string","title":"Epa Id"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"county":{"type":"string","title":"County"},"state":{"type":"string","title":"State"},"state_code":{"type":"string","title":"State Code"},"region":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Region"},"status":{"type":"string","title":"Status"},"industry":{"type":"string","title":"Industry"},"subindustry":{"type":"string","title":"Subindustry"},"hrs_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hrs Score"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"proposed_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Proposed Date"},"listing_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Listing Date"},"construction_completion_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Construction Completion Date"},"noid_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Noid Date"},"deletion_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deletion Date"},"partial_deletion":{"type":"boolean","title":"Partial Deletion"},"narrative_url":{"type":"string","title":"Narrative Url"},"progress_url":{"type":"string","title":"Progress Url"},"events":{"items":{"$ref":"#/components/schemas/EventItem"},"type":"array","title":"Events"}},"type":"object","required":["id","sems_id","epa_id","name","city","county","state","state_code","region","status","industry","subindustry","hrs_score","lat","lng","proposed_date","listing_date","construction_completion_date","noid_date","deletion_date","partial_deletion","narrative_url","progress_url","events"],"title":"SiteDetail"},"SiteDeviceOut":{"properties":{"location":{"type":"string","title":"Location"},"function":{"type":"string","title":"Function"},"manufacturer":{"type":"string","title":"Manufacturer"},"model":{"type":"string","title":"Model"},"vendor":{"type":"string","title":"Vendor"},"category":{"type":"string","title":"Category"},"category_label":{"type":"string","title":"Category Label"},"identifies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Identifies"},"note":{"type":"string","title":"Note"},"request_ref":{"type":"string","title":"Request Ref"},"disclosed_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Disclosed On"}},"type":"object","required":["location","function","manufacturer","model","vendor","category","category_label","identifies","note","request_ref","disclosed_on"],"title":"SiteDeviceOut"},"SiteHardwareIn":{"properties":{"jurisdiction":{"type":"string","maxLength":160,"title":"Jurisdiction"},"location":{"type":"string","maxLength":240,"title":"Location"},"function":{"type":"string","maxLength":120,"title":"Function","default":""},"manufacturer":{"type":"string","maxLength":160,"title":"Manufacturer","default":""},"model":{"type":"string","maxLength":160,"title":"Model","default":""},"identifies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Identifies"},"note":{"type":"string","title":"Note","default":""},"request_ref":{"type":"string","maxLength":200,"title":"Request Ref","default":""},"requested_on":{"type":"string","title":"Requested On","default":""},"disclosed_on":{"type":"string","title":"Disclosed On","default":""},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"}},"type":"object","required":["jurisdiction","location"],"title":"SiteHardwareIn","description":"One device on one pole, from a records disclosure."},"SiteIn":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":8000,"title":"Description","default":""},"visibility":{"type":"string","title":"Visibility","default":"private"},"boundary":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Boundary"},"center_lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lat"},"center_lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lng"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"project_ids":{"items":{"type":"string"},"type":"array","title":"Project Ids"},"market_slug":{"type":"string","maxLength":120,"title":"Market Slug","default":""}},"type":"object","required":["name"],"title":"SiteIn"},"SiteOut":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"visibility":{"type":"string","title":"Visibility"},"owner_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Owner User Id"},"market_slug":{"type":"string","title":"Market Slug"},"boundary_geojson":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Boundary Geojson"},"center_lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lat"},"center_lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lng"},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"tags":{"items":{},"type":"array","title":"Tags"},"project_ids":{"items":{},"type":"array","title":"Project Ids"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"mission_count":{"type":"integer","title":"Mission Count","default":0},"last_captured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Captured At"}},"type":"object","required":["id","slug","name","description","visibility","owner_user_id","market_slug","boundary_geojson","center_lat","center_lng","bbox","area_m2","tags","project_ids","created_at","updated_at","role"],"title":"SiteOut"},"SitePatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Description"},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visibility"},"boundary":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Boundary"},"clear_boundary":{"type":"boolean","title":"Clear Boundary","default":false},"center_lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lat"},"center_lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Center Lng"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"project_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Project Ids"},"market_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Slug"}},"type":"object","title":"SitePatch"},"SiteSummary":{"properties":{"id":{"type":"integer","title":"Id"},"sems_id":{"type":"integer","title":"Sems Id"},"epa_id":{"type":"string","title":"Epa Id"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"county":{"type":"string","title":"County"},"state":{"type":"string","title":"State"},"state_code":{"type":"string","title":"State Code"},"region":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Region"},"status":{"type":"string","title":"Status"},"industry":{"type":"string","title":"Industry"},"subindustry":{"type":"string","title":"Subindustry"},"hrs_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hrs Score"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"proposed_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Proposed Date"},"listing_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Listing Date"},"construction_completion_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Construction Completion Date"},"noid_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Noid Date"},"deletion_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deletion Date"},"partial_deletion":{"type":"boolean","title":"Partial Deletion"}},"type":"object","required":["id","sems_id","epa_id","name","city","county","state","state_code","region","status","industry","subindustry","hrs_score","lat","lng","proposed_date","listing_date","construction_completion_date","noid_date","deletion_date","partial_deletion"],"title":"SiteSummary"},"SnowCurrentOut":{"properties":{"swe_in":{"type":"number","title":"Swe In"},"median_in":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median In"},"pct_median":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Median"},"date":{"type":"string","title":"Date"}},"type":"object","required":["swe_in","date"],"title":"SnowCurrentOut"},"SnowOut":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"stations":{"items":{"type":"string"},"type":"array","title":"Stations","default":[]},"season":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Season"},"last_season":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Last Season"},"current":{"anyOf":[{"$ref":"#/components/schemas/SnowCurrentOut"},{"type":"null"}]},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"retrieved":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retrieved"}},"type":"object","title":"SnowOut","description":"The feeding basin's snowpack: pinned SNOTEL stations, the season's\nmedian timing, last winter's peak, and today's reading in season."},"SquelchIn":{"properties":{"mode":{"type":"string","pattern":"^(off|curated|live)$","title":"Mode","default":"off"},"delivery":{"type":"string","pattern":"^(none|inapp|push|digest)$","title":"Delivery","default":"inapp"},"digest_hour":{"type":"integer","maximum":23.0,"minimum":0.0,"title":"Digest Hour","default":8},"categories":{"additionalProperties":{"type":"integer"},"type":"object","title":"Categories"},"radius_km":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Radius Km","default":0.0},"home_lat":{"type":"number","title":"Home Lat","default":0.0},"home_lng":{"type":"number","title":"Home Lng","default":0.0},"market_ids":{"items":{"type":"integer"},"type":"array","title":"Market Ids"},"mirror_to_tweeter":{"type":"boolean","title":"Mirror To Tweeter","default":false},"max_per_day":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Max Per Day","default":8}},"type":"object","title":"SquelchIn"},"StackBrief":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"tagline":{"type":"string","title":"Tagline"},"home_market":{"type":"string","title":"Home Market","default":""},"home_market_name":{"type":"string","title":"Home Market Name","default":""},"subscriber_count":{"type":"integer","title":"Subscriber Count","default":0},"post_count":{"type":"integer","title":"Post Count","default":0},"is_listed":{"type":"boolean","title":"Is Listed","default":false},"is_suspended":{"type":"boolean","title":"Is Suspended","default":false},"owner":{"anyOf":[{"$ref":"#/components/schemas/AuthorBrief"},{"type":"null"}]}},"type":"object","required":["slug","name","tagline"],"title":"StackBrief"},"StackCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"},"slug":{"type":"string","maxLength":60,"title":"Slug","default":""},"pen_name":{"type":"string","maxLength":80,"title":"Pen Name","default":""},"byline_mode":{"type":"string","maxLength":10,"title":"Byline Mode","default":"account"},"tagline":{"type":"string","maxLength":200,"title":"Tagline","default":""},"about":{"type":"string","maxLength":8000,"title":"About","default":""},"home_market":{"type":"string","maxLength":120,"title":"Home Market","default":""}},"type":"object","required":["name"],"title":"StackCreate"},"StackDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"tagline":{"type":"string","title":"Tagline"},"home_market":{"type":"string","title":"Home Market","default":""},"home_market_name":{"type":"string","title":"Home Market Name","default":""},"subscriber_count":{"type":"integer","title":"Subscriber Count","default":0},"post_count":{"type":"integer","title":"Post Count","default":0},"is_listed":{"type":"boolean","title":"Is Listed","default":false},"is_suspended":{"type":"boolean","title":"Is Suspended","default":false},"owner":{"anyOf":[{"$ref":"#/components/schemas/AuthorBrief"},{"type":"null"}]},"about":{"type":"string","title":"About","default":""},"price_month_cents":{"type":"integer","title":"Price Month Cents","default":0},"price_year_cents":{"type":"integer","title":"Price Year Cents","default":0},"founding_min_cents":{"type":"integer","title":"Founding Min Cents","default":0},"paywall_after_blocks":{"type":"integer","title":"Paywall After Blocks","default":3},"announce_board_slug":{"type":"string","title":"Announce Board Slug","default":""},"pen_name":{"type":"string","title":"Pen Name","default":""},"byline_mode":{"type":"string","title":"Byline Mode","default":"account"},"account_name":{"type":"string","title":"Account Name","default":""},"has_paid_tier":{"type":"boolean","title":"Has Paid Tier","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"my_tier":{"type":"string","title":"My Tier","default":"none"},"paid_through":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid Through"}},"type":"object","required":["slug","name","tagline"],"title":"StackDetail"},"StackEdit":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":2},{"type":"null"}],"title":"Name"},"tagline":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Tagline"},"about":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"About"},"home_market":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Home Market"},"price_month_cents":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Price Month Cents"},"price_year_cents":{"anyOf":[{"type":"integer","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Price Year Cents"},"founding_min_cents":{"anyOf":[{"type":"integer","maximum":50000000.0,"minimum":0.0},{"type":"null"}],"title":"Founding Min Cents"},"paywall_after_blocks":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Paywall After Blocks"},"announce_board_slug":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Announce Board Slug"},"pen_name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Pen Name"},"byline_mode":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Byline Mode"}},"type":"object","title":"StackEdit"},"StackPage":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"stacks":{"items":{"$ref":"#/components/schemas/StackBrief"},"type":"array","title":"Stacks"}},"type":"object","required":["total","page","per_page"],"title":"StackPage"},"StandingOut":{"properties":{"rank_pct":{"type":"number","title":"Rank Pct"},"n_years":{"type":"integer","title":"N Years"},"record_low":{"$ref":"#/components/schemas/RecordPoint"},"record_high":{"$ref":"#/components/schemas/RecordPoint"}},"type":"object","required":["rank_pct","n_years","record_low","record_high"],"title":"StandingOut","description":"Where the latest reading sits among all SAME-CALENDAR-MONTH readings\nin the record: rank_pct 0.0 = the lowest such month ever seen."},"StateDetail":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"markets":{"items":{"$ref":"#/components/schemas/MarketOut"},"type":"array","title":"Markets"}},"type":"object","required":["code","name","markets"],"title":"StateDetail"},"StateIn":{"properties":{"on":{"type":"boolean","title":"On"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["on"],"title":"StateIn"},"StateLowest":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"pct_full":{"type":"number","title":"Pct Full"}},"type":"object","required":["slug","name","pct_full"],"title":"StateLowest"},"StateWater":{"properties":{"code":{"type":"string","title":"Code"},"count":{"type":"integer","title":"Count"},"lowest":{"anyOf":[{"$ref":"#/components/schemas/StateLowest"},{"type":"null"}]},"worst_drought":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worst Drought"}},"type":"object","required":["code","count"],"title":"StateWater"},"StatesOut":{"properties":{"states":{"items":{"$ref":"#/components/schemas/StateWater"},"type":"array","title":"States"}},"type":"object","required":["states"],"title":"StatesOut"},"StationPatch":{"properties":{"listed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Listed"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"default_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Default On"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"},"blurb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blurb"},"sort":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort"}},"type":"object","title":"StationPatch"},"StationSwitch":{"properties":{"slug":{"type":"string","title":"Slug"},"subscribed":{"type":"boolean","title":"Subscribed","default":true},"push":{"type":"boolean","title":"Push","default":true}},"type":"object","required":["slug"],"title":"StationSwitch"},"StatsOut":{"properties":{"market":{"type":"string","title":"Market"},"meetings_with_minutes":{"type":"integer","title":"Meetings With Minutes"},"audited":{"type":"integer","title":"Audited"},"findings_total":{"type":"integer","title":"Findings Total"},"findings_high":{"type":"integer","title":"Findings High"},"findings_open":{"type":"integer","title":"Findings Open"},"revisions_after_publication":{"type":"integer","title":"Revisions After Publication"},"average_fidelity":{"type":"number","title":"Average Fidelity"},"corrections_pending":{"type":"integer","title":"Corrections Pending"}},"type":"object","required":["market","meetings_with_minutes","audited","findings_total","findings_high","findings_open","revisions_after_publication","average_fidelity","corrections_pending"],"title":"StatsOut"},"StatusIn":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"StatusIn"},"StatusRollup":{"properties":{"status":{"type":"string","title":"Status"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["status","count"],"title":"StatusRollup"},"StayIn":{"properties":{"arrive_on":{"type":"string","format":"date","title":"Arrive On"},"depart_on":{"type":"string","format":"date","title":"Depart On"},"party_size":{"type":"integer","maximum":12.0,"minimum":1.0,"title":"Party Size","default":1},"purpose":{"type":"string","title":"Purpose","default":"other"},"campaign":{"type":"string","maxLength":120,"title":"Campaign","default":""},"message":{"type":"string","maxLength":1500,"title":"Message","default":""}},"type":"object","required":["arrive_on","depart_on"],"title":"StayIn"},"StayOut":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"arrive_on":{"type":"string","title":"Arrive On"},"depart_on":{"type":"string","title":"Depart On"},"nights":{"type":"integer","title":"Nights"},"party_size":{"type":"integer","title":"Party Size"},"purpose":{"type":"string","title":"Purpose"},"purpose_label":{"type":"string","title":"Purpose Label","default":""},"campaign":{"type":"string","title":"Campaign","default":""},"message":{"type":"string","title":"Message","default":""},"host_reply":{"type":"string","title":"Host Reply","default":""},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"decided_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided At"},"listing":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingCard"},{"type":"null"}]},"guest":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodbnb__MemberCard"},{"type":"null"}]},"host":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodbnb__MemberCard"},{"type":"null"}]},"street_address":{"type":"string","title":"Street Address","default":""},"arrival_notes":{"type":"string","title":"Arrival Notes","default":""},"pay_handle":{"type":"string","title":"Pay Handle","default":""},"reviewable":{"type":"boolean","title":"Reviewable","default":false},"my_review_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"My Review Id"}},"type":"object","required":["id","status","arrive_on","depart_on","nights","party_size","purpose"],"title":"StayOut"},"StoreCard":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label","default":""},"blurb":{"type":"string","title":"Blurb","default":""},"status":{"type":"string","title":"Status"},"city":{"type":"string","title":"City","default":""},"fulfillment":{"type":"string","title":"Fulfillment"},"delivery_fee_cents":{"type":"integer","title":"Delivery Fee Cents","default":0},"min_order_cents":{"type":"integer","title":"Min Order Cents","default":0},"prep_minutes":{"type":"integer","title":"Prep Minutes","default":0},"pay_methods":{"items":{"type":"string"},"type":"array","title":"Pay Methods"}},"type":"object","required":["slug","name","kind","status","fulfillment"],"title":"StoreCard"},"StoreDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label","default":""},"blurb":{"type":"string","title":"Blurb","default":""},"status":{"type":"string","title":"Status"},"city":{"type":"string","title":"City","default":""},"fulfillment":{"type":"string","title":"Fulfillment"},"delivery_fee_cents":{"type":"integer","title":"Delivery Fee Cents","default":0},"min_order_cents":{"type":"integer","title":"Min Order Cents","default":0},"prep_minutes":{"type":"integer","title":"Prep Minutes","default":0},"pay_methods":{"items":{"type":"string"},"type":"array","title":"Pay Methods"},"address":{"type":"string","title":"Address","default":""},"address2":{"type":"string","title":"Address2","default":""},"region":{"type":"string","title":"Region","default":""},"postal":{"type":"string","title":"Postal","default":""},"phone":{"type":"string","title":"Phone","default":""},"lat":{"type":"number","title":"Lat","default":0.0},"lng":{"type":"number","title":"Lng","default":0.0},"hours":{"items":{"type":"object"},"type":"array","title":"Hours"},"pay_note":{"type":"string","title":"Pay Note","default":""},"delivery_radius_km":{"type":"number","title":"Delivery Radius Km","default":0.0},"owner":{"anyOf":[{"$ref":"#/components/schemas/app__routes_homie__MemberCard"},{"type":"null"}]}},"type":"object","required":["slug","name","kind","status","fulfillment"],"title":"StoreDetail"},"StoreIn":{"properties":{"name":{"type":"string","title":"Name","default":""},"kind":{"type":"string","title":"Kind","default":"food"},"blurb":{"type":"string","title":"Blurb","default":""},"address":{"type":"string","title":"Address","default":""},"address2":{"type":"string","title":"Address2","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"postal":{"type":"string","title":"Postal","default":""},"phone":{"type":"string","title":"Phone","default":""},"lat":{"type":"number","title":"Lat","default":0.0},"lng":{"type":"number","title":"Lng","default":0.0},"fulfillment":{"type":"string","title":"Fulfillment","default":"both"},"delivery_radius_km":{"type":"number","title":"Delivery Radius Km","default":0.0},"delivery_fee_cents":{"type":"integer","title":"Delivery Fee Cents","default":0},"min_order_cents":{"type":"integer","title":"Min Order Cents","default":0},"prep_minutes":{"type":"integer","title":"Prep Minutes","default":20},"pay_methods":{"items":{"type":"string"},"type":"array","title":"Pay Methods"},"pay_note":{"type":"string","title":"Pay Note","default":""},"verification_policy":{"type":"string","title":"Verification Policy","default":"homie"},"default_run_pay_cents":{"type":"integer","title":"Default Run Pay Cents","default":0},"hours":{"items":{"type":"object"},"type":"array","title":"Hours"},"status":{"type":"string","title":"Status","default":"draft"}},"type":"object","title":"StoreIn"},"Structure":{"properties":{"page_count":{"type":"integer","title":"Page Count"},"is_encrypted":{"type":"boolean","title":"Is Encrypted"},"incremental_updates":{"type":"integer","title":"Incremental Updates"},"annotation_count":{"type":"integer","title":"Annotation Count"},"has_acroform":{"type":"boolean","title":"Has Acroform"}},"type":"object","required":["page_count","is_encrypted","incremental_updates","annotation_count","has_acroform"],"title":"Structure"},"SubIndustryCount":{"properties":{"name":{"type":"string","title":"Name"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["name","count"],"title":"SubIndustryCount"},"SubscribeIn":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"p256dh":{"type":"string","title":"P256Dh"},"auth":{"type":"string","title":"Auth"},"standalone":{"type":"boolean","title":"Standalone","default":false},"label":{"type":"string","title":"Label","default":""}},"type":"object","required":["endpoint","p256dh","auth"],"title":"SubscribeIn"},"SubscriptionOut":{"properties":{"tier":{"type":"string","title":"Tier"},"status":{"type":"string","title":"Status"},"paid_through":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid Through"},"stack":{"anyOf":[{"$ref":"#/components/schemas/StackBrief"},{"type":"null"}]}},"type":"object","required":["tier","status"],"title":"SubscriptionOut"},"SummaryOut":{"properties":{"officer_count":{"type":"integer","title":"Officer Count"},"employment_count":{"type":"integer","title":"Employment Count"},"agency_count":{"type":"integer","title":"Agency Count"},"conduct_count":{"type":"integer","title":"Conduct Count"},"cleared_count":{"type":"integer","title":"Cleared Count"},"adverse_count":{"type":"integer","title":"Adverse Count"},"favorable_count":{"type":"integer","title":"Favorable Count","default":0},"recognition_asks_open":{"type":"integer","title":"Recognition Asks Open","default":0},"officers_named_in_suits":{"type":"integer","title":"Officers Named In Suits","default":0},"federal_cases":{"type":"integer","title":"Federal Cases","default":0},"brady_disclosures":{"type":"integer","title":"Brady Disclosures","default":0},"brady_offices_publishing":{"type":"integer","title":"Brady Offices Publishing","default":0},"brady_offices_total":{"type":"integer","title":"Brady Offices Total","default":0},"payout_dollars":{"type":"number","title":"Payout Dollars","default":0.0},"ia_report_years":{"type":"integer","title":"Ia Report Years","default":0},"ia_figures":{"type":"integer","title":"Ia Figures","default":0},"crossings":{"type":"integer","title":"Crossings","default":0},"records_asks":{"type":"integer","title":"Records Asks","default":0},"records_asks_filed":{"type":"integer","title":"Records Asks Filed","default":0},"class_years":{"items":{"type":"integer"},"type":"array","title":"Class Years"},"states":{"items":{"$ref":"#/components/schemas/AcademyStateOut"},"type":"array","title":"States"},"roster_as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Roster As Of"},"conduct_as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Conduct As Of"},"sources":{"items":{"$ref":"#/components/schemas/app__routes_police_academy__SourceOut"},"type":"array","title":"Sources"}},"type":"object","required":["officer_count","employment_count","agency_count","conduct_count","cleared_count","adverse_count","class_years","roster_as_of","conduct_as_of","sources"],"title":"SummaryOut"},"SuperfundSummary":{"properties":{"site_count":{"type":"integer","title":"Site Count"},"state_count":{"type":"integer","title":"State Count"},"active_count":{"type":"integer","title":"Active Count"},"proposed_count":{"type":"integer","title":"Proposed Count"},"deleted_count":{"type":"integer","title":"Deleted Count"},"construction_complete_count":{"type":"integer","title":"Construction Complete Count"},"partial_deletion_count":{"type":"integer","title":"Partial Deletion Count"},"event_count":{"type":"integer","title":"Event Count"},"states":{"items":{"$ref":"#/components/schemas/app__routes_superfund__StateRollup"},"type":"array","title":"States"},"statuses":{"items":{"$ref":"#/components/schemas/StatusRollup"},"type":"array","title":"Statuses"}},"type":"object","required":["site_count","state_count","active_count","proposed_count","deleted_count","construction_complete_count","partial_deletion_count","event_count","states","statuses"],"title":"SuperfundSummary"},"SupportIn":{"properties":{"display_public":{"type":"boolean","title":"Display Public","default":true},"comment":{"type":"string","maxLength":500,"title":"Comment","default":""},"postal_code":{"type":"string","maxLength":12,"title":"Postal Code","default":""},"rsvp":{"type":"string","title":"Rsvp","default":""}},"type":"object","title":"SupportIn"},"SuspendIn":{"properties":{"email":{"type":"string","title":"Email"},"active":{"type":"boolean","title":"Active"}},"type":"object","required":["email","active"],"title":"SuspendIn"},"SystemsOut":{"properties":{"systems":{"items":{"$ref":"#/components/schemas/app__routes_hydrology__SystemOut"},"type":"array","title":"Systems"},"note":{"type":"string","title":"Note"}},"type":"object","required":["systems","note"],"title":"SystemsOut"},"TablePreview":{"properties":{"name":{"type":"string","title":"Name"},"columns":{"items":{"type":"string"},"type":"array","title":"Columns"},"rows":{"items":{"items":{"type":"string"},"type":"array"},"type":"array","title":"Rows"},"total_rows":{"type":"integer","title":"Total Rows"},"truncated":{"type":"boolean","title":"Truncated"}},"type":"object","required":["name","columns","rows","total_rows","truncated"],"title":"TablePreview"},"TemplateIn":{"properties":{"title":{"type":"string","maxLength":200,"minLength":3,"title":"Title"},"category":{"type":"string","title":"Category","default":"custom"},"emoji":{"type":"string","maxLength":8,"title":"Emoji","default":"📣"},"description":{"type":"string","maxLength":2000,"title":"Description","default":""},"blueprint":{"type":"object","title":"Blueprint","default":{}},"is_public":{"type":"boolean","title":"Is Public","default":false}},"type":"object","required":["title"],"title":"TemplateIn"},"TemplateOut":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"category":{"type":"string","title":"Category"},"emoji":{"type":"string","title":"Emoji"},"description":{"type":"string","title":"Description"},"blueprint":{"type":"object","title":"Blueprint"},"is_builtin":{"type":"boolean","title":"Is Builtin"},"is_public":{"type":"boolean","title":"Is Public"},"mine":{"type":"boolean","title":"Mine","default":false}},"type":"object","required":["id","slug","title","category","emoji","description","blueprint","is_builtin","is_public"],"title":"TemplateOut"},"TemplateShelf":{"properties":{"builtin":{"items":{"$ref":"#/components/schemas/TemplateOut"},"type":"array","title":"Builtin"},"community":{"items":{"$ref":"#/components/schemas/TemplateOut"},"type":"array","title":"Community"},"mine":{"items":{"$ref":"#/components/schemas/TemplateOut"},"type":"array","title":"Mine"}},"type":"object","required":["builtin","community","mine"],"title":"TemplateShelf"},"TextInfo":{"properties":{"extractable_chars":{"type":"integer","title":"Extractable Chars"},"pages_with_text":{"type":"integer","title":"Pages With Text"},"preview":{"type":"string","title":"Preview"}},"type":"object","required":["extractable_chars","pages_with_text","preview"],"title":"TextInfo"},"TlsInfo":{"properties":{"subject":{"type":"string","title":"Subject"},"issuer":{"type":"string","title":"Issuer"},"not_before":{"type":"string","title":"Not Before"},"not_after":{"type":"string","title":"Not After"},"days_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Left"},"sans":{"items":{"type":"string"},"type":"array","title":"Sans"},"error":{"type":"string","title":"Error"}},"type":"object","required":["subject","issuer","not_before","not_after","days_left","sans","error"],"title":"TlsInfo"},"TopicCount":{"properties":{"topic":{"type":"string","title":"Topic"},"videos":{"type":"integer","title":"Videos"}},"type":"object","required":["topic","videos"],"title":"TopicCount"},"TradeActionIn":{"properties":{"action":{"type":"string","title":"Action"}},"type":"object","required":["action"],"title":"TradeActionIn"},"TradeIn":{"properties":{"to_seed_ref":{"type":"string","minLength":1,"title":"To Seed Ref"},"from_seed_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Seed Ref"},"message":{"type":"string","maxLength":2000,"title":"Message","default":""}},"type":"object","required":["to_seed_ref"],"title":"TradeIn"},"TradeOut":{"properties":{"slug":{"type":"string","title":"Slug"},"from_user_id":{"type":"integer","title":"From User Id"},"from_user_name":{"type":"string","title":"From User Name"},"to_user_id":{"type":"integer","title":"To User Id"},"to_user_name":{"type":"string","title":"To User Name"},"from_seed":{"anyOf":[{"$ref":"#/components/schemas/SeedOut"},{"type":"null"}]},"to_seed":{"anyOf":[{"$ref":"#/components/schemas/SeedOut"},{"type":"null"}]},"message":{"type":"string","title":"Message"},"status":{"type":"string","title":"Status"},"market":{"type":"string","title":"Market"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["slug","from_user_id","from_user_name","to_user_id","to_user_name","from_seed","to_seed","message","status","market","expires_at","created_at"],"title":"TradeOut"},"TranscriptDetail":{"properties":{"video_id":{"type":"string","title":"Video Id"},"provider":{"type":"string","title":"Provider"},"topic":{"type":"string","title":"Topic"},"title":{"type":"string","title":"Title"},"channel":{"type":"string","title":"Channel"},"channel_id":{"type":"string","title":"Channel Id"},"url":{"type":"string","title":"Url"},"published":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published"},"duration_seconds":{"type":"integer","title":"Duration Seconds"},"view_count":{"type":"integer","title":"View Count"},"like_count":{"type":"integer","title":"Like Count"},"description":{"type":"string","title":"Description"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"transcript":{"type":"string","title":"Transcript"},"transcript_words":{"type":"integer","title":"Transcript Words"},"lang":{"type":"string","title":"Lang"},"ingest_status":{"type":"string","title":"Ingest Status"},"summary_status":{"type":"string","title":"Summary Status"},"summary_md":{"type":"string","title":"Summary Md"},"summary":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Summary"},"summarized_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summarized At"}},"type":"object","required":["video_id","provider","topic","title","channel","channel_id","url","published","duration_seconds","view_count","like_count","description","tags","transcript","transcript_words","lang","ingest_status","summary_status","summary_md","summary","summarized_at"],"title":"TranscriptDetail"},"TranscriptIngestIn":{"properties":{"jurisdiction":{"type":"string","maxLength":160,"title":"Jurisdiction"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"meeting_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Meeting Id"},"body":{"type":"string","maxLength":160,"title":"Body","default":""}},"type":"object","required":["jurisdiction"],"title":"TranscriptIngestIn","description":"Read a meeting transcript for ALPR discussion."},"TranscriptListItem":{"properties":{"video_id":{"type":"string","title":"Video Id"},"provider":{"type":"string","title":"Provider"},"topic":{"type":"string","title":"Topic"},"title":{"type":"string","title":"Title"},"channel":{"type":"string","title":"Channel"},"url":{"type":"string","title":"Url"},"published":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published"},"duration_seconds":{"type":"integer","title":"Duration Seconds"},"view_count":{"type":"integer","title":"View Count"},"like_count":{"type":"integer","title":"Like Count"},"transcript_words":{"type":"integer","title":"Transcript Words"},"has_summary":{"type":"boolean","title":"Has Summary"},"tldr":{"type":"string","title":"Tldr","default":""},"snippet":{"type":"string","title":"Snippet","default":""}},"type":"object","required":["video_id","provider","topic","title","channel","url","published","duration_seconds","view_count","like_count","transcript_words","has_summary"],"title":"TranscriptListItem"},"TranscriptPage":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"items":{"items":{"$ref":"#/components/schemas/TranscriptListItem"},"type":"array","title":"Items"}},"type":"object","required":["total","page","per_page","items"],"title":"TranscriptPage"},"TranscriptsStats":{"properties":{"videos":{"type":"integer","title":"Videos"},"with_transcript":{"type":"integer","title":"With Transcript"},"with_summary":{"type":"integer","title":"With Summary"},"total_words":{"type":"integer","title":"Total Words"},"total_views":{"type":"integer","title":"Total Views"},"total_hours":{"type":"number","title":"Total Hours"},"topics":{"items":{"$ref":"#/components/schemas/TopicCount"},"type":"array","title":"Topics"},"top_channels":{"items":{"$ref":"#/components/schemas/ChannelCount"},"type":"array","title":"Top Channels"}},"type":"object","required":["videos","with_transcript","with_summary","total_words","total_views","total_hours","topics","top_channels"],"title":"TranscriptsStats"},"TrendOut":{"properties":{"delta":{"type":"number","title":"Delta"},"per_day":{"type":"number","title":"Per Day"},"from_date":{"type":"string","title":"From Date"},"to_date":{"type":"string","title":"To Date"},"measure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Measure"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"}},"type":"object","required":["delta","per_day","from_date","to_date"],"title":"TrendOut","description":"A measured net change across a trailing window — what HAS happened,\nnever a forecast. Units ride along (af or ft) with the measure name."},"UnsubscribeIn":{"properties":{"endpoint":{"type":"string","title":"Endpoint"}},"type":"object","required":["endpoint"],"title":"UnsubscribeIn"},"UpdateIn":{"properties":{"body":{"type":"string","maxLength":4000,"minLength":2,"title":"Body"}},"type":"object","required":["body"],"title":"UpdateIn"},"UpdateOut":{"properties":{"id":{"type":"integer","title":"Id"},"author_name":{"type":"string","title":"Author Name"},"body":{"type":"string","title":"Body"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","author_name","body","created_at"],"title":"UpdateOut"},"UploadInit":{"properties":{"filename":{"type":"string","maxLength":255,"minLength":1,"title":"Filename"},"bytes":{"type":"integer","exclusiveMinimum":0.0,"title":"Bytes"},"mime":{"type":"string","maxLength":120,"title":"Mime","default":""},"sha256":{"type":"string","maxLength":64,"title":"Sha256","default":""},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},"type":"object","required":["filename","bytes"],"title":"UploadInit"},"UploadOut":{"properties":{"ref":{"type":"string","title":"Ref"},"mission_id":{"type":"integer","title":"Mission Id"},"filename":{"type":"string","title":"Filename"},"declared_bytes":{"type":"integer","title":"Declared Bytes"},"chunk_bytes":{"type":"integer","title":"Chunk Bytes"},"chunks_total":{"type":"integer","title":"Chunks Total"},"received":{"items":{"type":"integer"},"type":"array","title":"Received"},"missing":{"items":{"type":"integer"},"type":"array","title":"Missing"},"status":{"type":"string","title":"Status"},"error":{"type":"string","title":"Error"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"file_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Id"}},"type":"object","required":["ref","mission_id","filename","declared_bytes","chunk_bytes","chunks_total","received","missing","status","error","expires_at"],"title":"UploadOut"},"UserOut":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"type":"string","title":"Avatar Url"},"is_admin":{"type":"boolean","title":"Is Admin"},"has_google":{"type":"boolean","title":"Has Google","default":false},"two_factor_enabled":{"type":"boolean","title":"Two Factor Enabled","default":false}},"type":"object","required":["id","email","display_name","avatar_url","is_admin"],"title":"UserOut"},"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"},"VendorCount":{"properties":{"vendor":{"type":"string","title":"Vendor"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["vendor","count"],"title":"VendorCount"},"VideoCreate":{"properties":{"url":{"type":"string","maxLength":500,"minLength":1,"title":"Url"},"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"collection":{"type":"string","maxLength":80,"title":"Collection","default":""}},"type":"object","required":["url","title"],"title":"VideoCreate"},"VideoEdit":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Url"},"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"collection":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Collection"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"VideoEdit"},"VideoOut":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"provider":{"type":"string","title":"Provider"},"watch_url":{"type":"string","title":"Watch Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"collection":{"type":"string","title":"Collection"},"is_published":{"type":"boolean","title":"Is Published"},"sort_order":{"type":"integer","title":"Sort Order"}},"type":"object","required":["id","title","provider","watch_url","thumbnail_url","collection","is_published","sort_order"],"title":"VideoOut"},"ViewerIn":{"properties":{"id":{"type":"string","title":"Id"}},"type":"object","required":["id"],"title":"ViewerIn"},"Vocabulary":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"meaning":{"type":"string","title":"Meaning"},"counts_against":{"type":"boolean","title":"Counts Against","default":false}},"type":"object","required":["key","label","meaning"],"title":"Vocabulary"},"VoteIn":{"properties":{"choice":{"type":"string","title":"Choice"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["choice"],"title":"VoteIn"},"VouchIn":{"properties":{"body":{"type":"string","title":"Body","default":""}},"type":"object","title":"VouchIn"},"WallEntry":{"properties":{"display_name":{"type":"string","title":"Display Name"},"comment":{"type":"string","title":"Comment"},"rsvp":{"type":"string","title":"Rsvp"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["display_name","comment","rsvp","created_at"],"title":"WallEntry"},"WaterOut":{"properties":{"gages":{"anyOf":[{"items":{"type":"object"},"type":"array"},{"type":"null"}],"title":"Gages"},"hydrograph":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Hydrograph"},"annual":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Annual"},"decades":{"items":{"type":"object"},"type":"array","title":"Decades","default":[]},"drought":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Drought"}},"type":"object","title":"WaterOut","description":"Everything the water panel needs, in one response.\n\nAny field may be None. The live halves come from USGS and are allowed to\nfail; the committed halves come off disk. A caller that sees None renders\nthat section away — it NEVER renders a zero, because \"the gage is down\" and\n\"the ditch is dry\" are different sentences and only one of them is news."},"YearActivity":{"properties":{"year":{"type":"integer","title":"Year"},"proposed":{"type":"integer","title":"Proposed"},"listed":{"type":"integer","title":"Listed"},"deleted":{"type":"integer","title":"Deleted"},"construction_complete":{"type":"integer","title":"Construction Complete"},"on_list_cumulative":{"type":"integer","title":"On List Cumulative"}},"type":"object","required":["year","proposed","listed","deleted","construction_complete","on_list_cumulative"],"title":"YearActivity"},"ZoneOut":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"blurb":{"type":"string","title":"Blurb"},"gap":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gap"},"min_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Pct"},"worst_drought":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worst Drought"},"members":{"items":{"$ref":"#/components/schemas/ReservoirRow"},"type":"array","title":"Members"},"watch":{"items":{"$ref":"#/components/schemas/ReservoirRow"},"type":"array","title":"Watch"}},"type":"object","required":["key","name","blurb","members","watch"],"title":"ZoneOut","description":"A delicate water zone: curated city prose over the members' own\nnumbers. `gap` names what this desk cannot verify, out loud."},"ZonesOut":{"properties":{"zones":{"items":{"$ref":"#/components/schemas/ZoneOut"},"type":"array","title":"Zones"},"note":{"type":"string","title":"Note"}},"type":"object","required":["zones","note"],"title":"ZonesOut"},"app__news_schedule__EntryIn":{"properties":{"title":{"type":"string","title":"Title"},"start":{"type":"string","title":"Start"},"duration_min":{"type":"integer","title":"Duration Min"},"source":{"$ref":"#/components/schemas/app__news_schedule__SourceIn","default":{"kind":"studio"}},"takeover":{"type":"boolean","title":"Takeover","default":false},"repeat":{"type":"string","title":"Repeat","default":"none"}},"type":"object","required":["title","start","duration_min"],"title":"EntryIn"},"app__news_schedule__SourceIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"studio"},"feed_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feed Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"SourceIn"},"app__routes_air__ProfileIn":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline"},"genre":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Genre"},"crawl_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Crawl Text"},"format_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Slug"}},"type":"object","title":"ProfileIn"},"app__routes_alpr_admin__ReviewIn":{"properties":{"status":{"type":"string","title":"Status","description":"promoted | rejected | candidate"},"claim":{"type":"string","maxLength":2000,"title":"Claim","default":""},"reviewer":{"type":"string","maxLength":120,"minLength":1,"title":"Reviewer"},"review_note":{"type":"string","maxLength":2000,"title":"Review Note","default":""}},"type":"object","required":["status","reviewer"],"title":"ReviewIn"},"app__routes_bigstacks__CommentOut":{"properties":{"id":{"type":"integer","title":"Id"},"body":{"type":"string","title":"Body"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"author":{"anyOf":[{"$ref":"#/components/schemas/AuthorBrief"},{"type":"null"}]},"can_edit":{"type":"boolean","title":"Can Edit","default":false}},"type":"object","required":["id","body"],"title":"CommentOut"},"app__routes_bigstacks__MarkPaidIn":{"properties":{"note":{"type":"string","maxLength":400,"title":"Note","default":""}},"type":"object","title":"MarkPaidIn"},"app__routes_bigstacks__PostDetail":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"subtitle":{"type":"string","title":"Subtitle","default":""},"audience":{"type":"string","title":"Audience","default":"everyone"},"status":{"type":"string","title":"Status","default":"published"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"word_count":{"type":"integer","title":"Word Count","default":0},"read_minutes":{"type":"integer","title":"Read Minutes","default":1},"excerpt":{"type":"string","title":"Excerpt","default":""},"locked":{"type":"boolean","title":"Locked","default":false},"comment_count":{"type":"integer","title":"Comment Count","default":0},"like_count":{"type":"integer","title":"Like Count","default":0},"stack":{"anyOf":[{"$ref":"#/components/schemas/StackBrief"},{"type":"null"}]},"blocks":{"items":{"type":"object"},"type":"array","title":"Blocks"},"liked_by_me":{"type":"boolean","title":"Liked By Me","default":false},"author":{"anyOf":[{"$ref":"#/components/schemas/AuthorBrief"},{"type":"null"}]}},"type":"object","required":["id","slug","title"],"title":"PostDetail"},"app__routes_bigstacks__PostEdit":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Title"},"subtitle":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Subtitle"},"body_md":{"anyOf":[{"type":"string","maxLength":400000},{"type":"null"}],"title":"Body Md"},"audience":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}],"title":"Audience"}},"type":"object","title":"PostEdit"},"app__routes_bigstacks__PublishIn":{"properties":{"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"}},"type":"object","title":"PublishIn"},"app__routes_bodega__CancelIn":{"properties":{"reason":{"type":"string","title":"Reason","default":""},"refunded":{"type":"boolean","title":"Refunded","default":false}},"type":"object","title":"CancelIn"},"app__routes_bodega__CartLine":{"properties":{"slug":{"type":"string","maxLength":120,"minLength":1,"title":"Slug"},"variant":{"type":"string","title":"Variant","default":""},"qty":{"type":"integer","title":"Qty","default":1}},"type":"object","required":["slug"],"title":"CartLine"},"app__routes_bodega__CodesIn":{"properties":{"count":{"type":"integer","title":"Count","default":1},"percent_off":{"type":"integer","title":"Percent Off","default":100},"product_slug":{"type":"string","title":"Product Slug","default":""},"max_uses":{"type":"integer","title":"Max Uses","default":1},"days":{"type":"integer","title":"Days","default":0},"label":{"type":"string","title":"Label","default":""},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"CodesIn"},"app__routes_bodega__MarkPaidIn":{"properties":{"method":{"type":"string","title":"Method","default":""},"reference":{"type":"string","title":"Reference","default":""},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"MarkPaidIn"},"app__routes_bodega__OrderIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/app__routes_bodega__CartLine"},"type":"array","title":"Items"},"fulfillment":{"type":"string","title":"Fulfillment","default":"ship"},"payment":{"type":"string","title":"Payment","default":"invoice"},"code":{"type":"string","title":"Code","default":""},"name":{"type":"string","maxLength":160,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"phone":{"type":"string","title":"Phone","default":""},"note":{"type":"string","title":"Note","default":""},"ship_name":{"type":"string","title":"Ship Name","default":""},"ship_line1":{"type":"string","title":"Ship Line1","default":""},"ship_line2":{"type":"string","title":"Ship Line2","default":""},"ship_city":{"type":"string","title":"Ship City","default":""},"ship_state":{"type":"string","title":"Ship State","default":""},"ship_postal":{"type":"string","title":"Ship Postal","default":""},"ship_country":{"type":"string","title":"Ship Country","default":"US"}},"type":"object","required":["name","email"],"title":"OrderIn"},"app__routes_bodega__QuoteIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/app__routes_bodega__CartLine"},"type":"array","title":"Items"},"fulfillment":{"type":"string","title":"Fulfillment","default":"ship"},"code":{"type":"string","title":"Code","default":""}},"type":"object","title":"QuoteIn"},"app__routes_bookstore__CancelIn":{"properties":{"note":{"type":"string","title":"Note","default":""},"refund":{"type":"boolean","title":"Refund","default":false}},"type":"object","title":"CancelIn"},"app__routes_bookstore__ClaimIn":{"properties":{"code":{"type":"string","maxLength":40,"minLength":4,"title":"Code"},"name":{"type":"string","maxLength":160,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"accept_license":{"type":"boolean","title":"Accept License","default":false},"license_version":{"type":"string","title":"License Version","default":""}},"type":"object","required":["code","name","email"],"title":"ClaimIn"},"app__routes_bookstore__GiftIn":{"properties":{"book_slug":{"type":"string","maxLength":120,"minLength":1,"title":"Book Slug"},"recipient_name":{"type":"string","title":"Recipient Name","default":""},"recipient_email":{"type":"string","title":"Recipient Email","default":""},"from_name":{"type":"string","title":"From Name","default":""},"message":{"type":"string","title":"Message","default":""},"count":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Count","default":1}},"type":"object","required":["book_slug"],"title":"GiftIn","description":"A comped copy — the shop giving a book away."},"app__routes_bookstore__MarkPaidIn":{"properties":{"payment_method":{"type":"string","title":"Payment Method","default":"invoice"},"payment_ref":{"type":"string","title":"Payment Ref","default":""},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"MarkPaidIn"},"app__routes_bookstore__OrderIn":{"properties":{"book_slug":{"type":"string","maxLength":120,"minLength":1,"title":"Book Slug"},"license_type":{"type":"string","title":"License Type","default":"personal"},"name":{"type":"string","maxLength":160,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"organization":{"type":"string","title":"Organization","default":""},"note":{"type":"string","title":"Note","default":""},"method":{"type":"string","title":"Method","default":"invoice"},"accept_license":{"type":"boolean","title":"Accept License","default":false},"license_version":{"type":"string","title":"License Version","default":""},"is_gift":{"type":"boolean","title":"Is Gift","default":false},"recipient_name":{"type":"string","title":"Recipient Name","default":""},"recipient_email":{"type":"string","title":"Recipient Email","default":""},"gift_message":{"type":"string","title":"Gift Message","default":""}},"type":"object","required":["book_slug","name","email"],"title":"OrderIn"},"app__routes_controlroom__AccessOut":{"properties":{"allowed":{"type":"boolean","title":"Allowed"},"role":{"type":"string","title":"Role"},"title":{"type":"string","title":"Title"},"posted":{"type":"boolean","title":"Posted"},"reason":{"type":"string","title":"Reason"},"desk":{"type":"string","title":"Desk","default":"control-room"}},"type":"object","required":["allowed","role","title","posted","reason"],"title":"AccessOut"},"app__routes_donors__CardIn":{"properties":{"ref":{"type":"string","maxLength":60,"title":"Ref","default":""},"question":{"type":"string","maxLength":400,"title":"Question","default":""},"square_answer":{"type":"string","maxLength":700,"title":"Square Answer","default":""},"correct_decision":{"type":"string","maxLength":10,"title":"Correct Decision","default":"agree"},"correct_answer":{"type":"string","maxLength":700,"title":"Correct Answer","default":""},"explanation":{"type":"string","maxLength":900,"title":"Explanation","default":""},"difficulty":{"type":"string","maxLength":10,"title":"Difficulty","default":"medium"},"category":{"type":"string","maxLength":60,"title":"Category","default":""},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","title":"CardIn","description":"One card. Field names match the JSON D's card decks arrive in, so a deck\nwritten elsewhere pastes straight into the importer without a rename."},"app__routes_donors__GiftIn":{"properties":{"amount":{"type":"string","maxLength":40,"title":"Amount","default":""},"date":{"type":"string","maxLength":40,"title":"Date","default":""},"in_kind":{"type":"string","maxLength":200,"title":"In Kind","default":""},"shoutout":{"type":"string","maxLength":400,"title":"Shoutout","default":""}},"type":"object","title":"GiftIn"},"app__routes_donors__ImportIn":{"properties":{"text":{"type":"string","maxLength":400000,"title":"Text","default":""},"commit":{"type":"boolean","title":"Commit","default":false},"publish":{"type":"boolean","title":"Publish","default":false}},"type":"object","title":"ImportIn"},"app__routes_fieldreporter__AssignIn":{"properties":{"email":{"type":"string","title":"Email"},"badge":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Badge"}},"type":"object","required":["email"],"title":"AssignIn"},"app__routes_fieldreporter__SlateIn":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"place":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"device":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device"},"location_mode":{"type":"string","title":"Location Mode","default":"exact"}},"type":"object","title":"SlateIn"},"app__routes_flock__FindingOut":{"properties":{"id":{"type":"integer","title":"Id"},"category":{"type":"string","title":"Category"},"claim":{"type":"string","title":"Claim"},"staff_report_quote":{"type":"string","title":"Staff Report Quote"},"staff_report_locator":{"type":"string","title":"Staff Report Locator"},"staff_report_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Staff Report Document Id"},"contract_quote":{"type":"string","title":"Contract Quote"},"contract_locator":{"type":"string","title":"Contract Locator"},"contract_document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Document Id"},"jurisdiction_slug":{"type":"string","title":"Jurisdiction Slug"},"jurisdiction_name":{"type":"string","title":"Jurisdiction Name"},"state":{"type":"string","title":"State"},"state_name":{"type":"string","title":"State Name"},"contract_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Contract Date"}},"type":"object","required":["id","category","claim","staff_report_quote","staff_report_locator","staff_report_document_id","contract_quote","contract_locator","contract_document_id","jurisdiction_slug","jurisdiction_name","state","state_name","contract_date"],"title":"FindingOut"},"app__routes_flock__MediaOut":{"properties":{"vendor":{"type":"string","title":"Vendor"},"vendor_name":{"type":"string","title":"Vendor Name"},"category":{"type":"string","title":"Category"},"category_label":{"type":"string","title":"Category Label"},"title":{"type":"string","title":"Title"},"publisher":{"type":"string","title":"Publisher"},"url":{"type":"string","title":"Url"},"embed_url":{"type":"string","title":"Embed Url"},"thumbnail_url":{"type":"string","title":"Thumbnail Url"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"published_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published On"},"summary":{"type":"string","title":"Summary"},"claim":{"type":"string","title":"Claim"},"claim_at":{"type":"string","title":"Claim At"},"unavailable":{"type":"boolean","title":"Unavailable"}},"type":"object","required":["vendor","vendor_name","category","category_label","title","publisher","url","embed_url","thumbnail_url","kind","kind_label","published_on","summary","claim","claim_at","unavailable"],"title":"MediaOut"},"app__routes_flock__StateRollup":{"properties":{"state":{"type":"string","title":"State"},"agency_count":{"type":"integer","title":"Agency Count"},"search_count":{"type":"integer","title":"Search Count"}},"type":"object","required":["state","agency_count","search_count"],"title":"StateRollup"},"app__routes_flock__SystemOut":{"properties":{"vendor":{"type":"string","title":"Vendor"},"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"category_label":{"type":"string","title":"Category Label"},"matched":{"type":"string","title":"Matched"},"basis":{"type":"string","title":"Basis"},"confidence":{"type":"number","title":"Confidence"},"quote":{"type":"string","title":"Quote"},"flock_integration":{"type":"boolean","title":"Flock Integration"},"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Document Id"},"document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Url"}},"type":"object","required":["vendor","name","category","category_label","matched","basis","confidence","quote","flock_integration","document_id","document_url"],"title":"SystemOut","description":"One surveillance system a document names."},"app__routes_flock_dossier__ClaimOut":{"properties":{"id":{"type":"string","title":"Id"},"statement":{"type":"string","title":"Statement"},"supported_by":{"items":{"type":"string"},"type":"array","title":"Supported By"},"strength":{"type":"string","title":"Strength"},"counterpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counterpoint"},"vendor_claim_only":{"type":"boolean","title":"Vendor Claim Only"},"sources_unread":{"type":"integer","title":"Sources Unread"},"sources_total":{"type":"integer","title":"Sources Total"}},"type":"object","required":["id","statement","supported_by","strength","counterpoint","vendor_claim_only","sources_unread","sources_total"],"title":"ClaimOut"},"app__routes_flock_dossier__SourceOut":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"publisher":{"type":"string","title":"Publisher"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"url":{"type":"string","title":"Url"},"archive_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archive Url"},"type":{"type":"string","title":"Type"},"tier":{"type":"string","title":"Tier"},"jurisdiction":{"type":"string","title":"Jurisdiction"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"},"summary":{"type":"string","title":"Summary"},"key_findings":{"items":{"type":"string"},"type":"array","title":"Key Findings"},"notes":{"type":"string","title":"Notes"},"is_vendor_claim":{"type":"boolean","title":"Is Vendor Claim"},"unread":{"type":"boolean","title":"Unread"},"undated":{"type":"boolean","title":"Undated"}},"type":"object","required":["id","title","publisher","authors","date","url","archive_url","type","tier","jurisdiction","topics","summary","key_findings","notes","is_vendor_claim","unread","undated"],"title":"SourceOut"},"app__routes_garden__ListingIn":{"properties":{"title":{"type":"string","maxLength":160,"minLength":1,"title":"Title"},"description":{"type":"string","maxLength":6000,"title":"Description","default":""},"category":{"type":"string","maxLength":40,"title":"Category","default":"seeds"},"price_cents":{"type":"integer","maximum":10000000.0,"minimum":0.0,"title":"Price Cents","default":0},"quantity":{"type":"integer","maximum":100000.0,"minimum":0.0,"title":"Quantity","default":1},"open_to_trade":{"type":"boolean","title":"Open To Trade","default":true},"seed_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seed Ref"},"image_url":{"type":"string","maxLength":2000,"title":"Image Url","default":""},"pay_via":{"type":"string","maxLength":600,"title":"Pay Via","default":""},"pay_handle":{"type":"string","maxLength":200,"title":"Pay Handle","default":""}},"type":"object","required":["title"],"title":"ListingIn"},"app__routes_garden__ListingOut":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"category":{"type":"string","title":"Category"},"price_cents":{"type":"integer","title":"Price Cents"},"quantity":{"type":"integer","title":"Quantity"},"open_to_trade":{"type":"boolean","title":"Open To Trade"},"image_url":{"type":"string","title":"Image Url"},"status":{"type":"string","title":"Status"},"is_featured":{"type":"boolean","title":"Is Featured"},"seller_id":{"type":"integer","title":"Seller Id"},"seller_name":{"type":"string","title":"Seller Name"},"seed_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seed Ref"},"market":{"type":"string","title":"Market"},"path":{"type":"string","title":"Path"},"pay_via":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pay Via"},"pay_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pay Handle"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["slug","title","description","category","price_cents","quantity","open_to_trade","image_url","status","is_featured","seller_id","seller_name","seed_ref","market","path","created_at"],"title":"ListingOut"},"app__routes_genetics__EntryIn":{"properties":{"kind":{"type":"string","title":"Kind"},"payload":{"type":"object","title":"Payload"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"supersedes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supersedes"}},"type":"object","required":["kind","payload"],"title":"EntryIn"},"app__routes_genetics__RevokeIn":{"properties":{"pen":{"type":"string","title":"Pen"}},"type":"object","required":["pen"],"title":"RevokeIn"},"app__routes_homie__CartLine":{"properties":{"item_id":{"type":"integer","title":"Item Id"},"quantity":{"type":"integer","title":"Quantity","default":1},"choice_ids":{"items":{"type":"integer"},"type":"array","title":"Choice Ids"}},"type":"object","required":["item_id"],"title":"CartLine"},"app__routes_homie__DriverIn":{"properties":{"vehicle_kind":{"type":"string","title":"Vehicle Kind","default":"car"}},"type":"object","title":"DriverIn"},"app__routes_homie__DriverOut":{"properties":{"id":{"type":"integer","title":"Id"},"market":{"type":"string","title":"Market","default":""},"status":{"type":"string","title":"Status"},"vehicle_kind":{"type":"string","title":"Vehicle Kind","default":""},"agreement_version":{"type":"integer","title":"Agreement Version","default":0},"verified":{"type":"boolean","title":"Verified","default":false},"verified_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified Until"},"docs":{"items":{"type":"object"},"type":"array","title":"Docs"},"member":{"anyOf":[{"$ref":"#/components/schemas/app__routes_homie__MemberCard"},{"type":"null"}]}},"type":"object","required":["id","status"],"title":"DriverOut"},"app__routes_homie__MemberCard":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"type":"string","title":"Display Name","default":""},"avatar_url":{"type":"string","title":"Avatar Url","default":""}},"type":"object","required":["id"],"title":"MemberCard"},"app__routes_homie__OrderIn":{"properties":{"lines":{"items":{"$ref":"#/components/schemas/app__routes_homie__CartLine"},"type":"array","title":"Lines"},"fulfillment":{"type":"string","title":"Fulfillment","default":"delivery"},"tip_cents":{"type":"integer","title":"Tip Cents","default":0},"dropoff_line1":{"type":"string","title":"Dropoff Line1","default":""},"dropoff_line2":{"type":"string","title":"Dropoff Line2","default":""},"dropoff_city":{"type":"string","title":"Dropoff City","default":""},"dropoff_notes":{"type":"string","title":"Dropoff Notes","default":""},"dropoff_lat":{"type":"number","title":"Dropoff Lat","default":0.0},"dropoff_lng":{"type":"number","title":"Dropoff Lng","default":0.0},"contact_phone":{"type":"string","title":"Contact Phone","default":""},"customer_note":{"type":"string","title":"Customer Note","default":""},"pay_method":{"type":"string","title":"Pay Method","default":""}},"type":"object","title":"OrderIn"},"app__routes_homie__QuoteIn":{"properties":{"lines":{"items":{"$ref":"#/components/schemas/app__routes_homie__CartLine"},"type":"array","title":"Lines"},"fulfillment":{"type":"string","title":"Fulfillment","default":"delivery"},"tip_cents":{"type":"integer","title":"Tip Cents","default":0}},"type":"object","title":"QuoteIn"},"app__routes_homie__ReviewIn":{"properties":{"decision":{"type":"string","title":"Decision","default":"accepted"},"reason":{"type":"string","title":"Reason","default":""},"license_expires_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"License Expires On"},"insurance_expires_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Insurance Expires On"},"assist_used":{"type":"boolean","title":"Assist Used","default":false}},"type":"object","title":"ReviewIn"},"app__routes_homie__RunOut":{"properties":{"id":{"type":"integer","title":"Id"},"order_code":{"type":"string","title":"Order Code","default":""},"store_slug":{"type":"string","title":"Store Slug","default":""},"store_name":{"type":"string","title":"Store Name","default":""},"state":{"type":"string","title":"State"},"pay_cents":{"type":"integer","title":"Pay Cents","default":0},"offered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Offered At"},"claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed At"},"picked_up_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Picked Up At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"driver":{"anyOf":[{"$ref":"#/components/schemas/app__routes_homie__MemberCard"},{"type":"null"}]},"dropoff_area":{"type":"string","title":"Dropoff Area","default":""}},"type":"object","required":["id","state"],"title":"RunOut"},"app__routes_homie__SectionIn":{"properties":{"name":{"type":"string","title":"Name","default":""},"position":{"type":"integer","title":"Position","default":0},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false}},"type":"object","title":"SectionIn"},"app__routes_homie__SectionOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"items":{"items":{"$ref":"#/components/schemas/ItemOut"},"type":"array","title":"Items"}},"type":"object","required":["id","name"],"title":"SectionOut"},"app__routes_hoodbnb__AgreementOut":{"properties":{"version":{"type":"string","title":"Version"},"title":{"type":"string","title":"Title"},"text":{"type":"string","title":"Text"},"signed":{"type":"boolean","title":"Signed","default":false},"signed_version":{"type":"string","title":"Signed Version","default":""},"signed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed At"}},"type":"object","required":["version","title","text"],"title":"AgreementOut"},"app__routes_hoodbnb__DecisionIn":{"properties":{"action":{"type":"string","title":"Action"},"reply":{"type":"string","maxLength":1500,"title":"Reply","default":""}},"type":"object","required":["action"],"title":"DecisionIn"},"app__routes_hoodbnb__Desk":{"properties":{"signed_in":{"type":"boolean","title":"Signed In","default":false},"can_publish":{"type":"boolean","title":"Can Publish","default":false},"publish_blocked":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Publish Blocked"},"home_market":{"type":"string","title":"Home Market","default":""},"home_market_name":{"type":"string","title":"Home Market Name","default":""},"agreement_signed":{"type":"boolean","title":"Agreement Signed","default":false},"agreement_version":{"type":"string","title":"Agreement Version","default":""},"listings":{"items":{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingCard"},"type":"array","title":"Listings","default":[]},"incoming":{"items":{"$ref":"#/components/schemas/StayOut"},"type":"array","title":"Incoming","default":[]},"trips":{"items":{"$ref":"#/components/schemas/StayOut"},"type":"array","title":"Trips","default":[]},"standing":{"type":"object","title":"Standing","default":{}}},"type":"object","title":"Desk","description":"One page for \"what is HoodBnB doing for me\": what I am offering, who\nhas asked, and where I am going."},"app__routes_hoodbnb__HideIn":{"properties":{"hidden":{"type":"boolean","title":"Hidden"},"reason":{"type":"string","maxLength":300,"title":"Reason","default":""}},"type":"object","required":["hidden"],"title":"HideIn"},"app__routes_hoodbnb__ListingCard":{"properties":{"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"emoji":{"type":"string","title":"Emoji"},"title":{"type":"string","title":"Title"},"market":{"type":"string","title":"Market","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"area_note":{"type":"string","title":"Area Note","default":""},"place":{"type":"string","title":"Place","default":""},"sleeps":{"type":"integer","title":"Sleeps","default":1},"max_nights":{"type":"integer","title":"Max Nights","default":3},"terms":{"type":"string","title":"Terms","default":"free"},"terms_label":{"type":"string","title":"Terms Label","default":"Free"},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_note":{"type":"string","title":"Price Note","default":""},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"welcomes":{"items":{"type":"string"},"type":"array","title":"Welcomes","default":[]},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities","default":[]},"host":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodbnb__MemberCard"},{"type":"null"}]},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["slug","kind","kind_label","emoji","title"],"title":"ListingCard"},"app__routes_hoodbnb__ListingDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"emoji":{"type":"string","title":"Emoji"},"title":{"type":"string","title":"Title"},"market":{"type":"string","title":"Market","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"area_note":{"type":"string","title":"Area Note","default":""},"place":{"type":"string","title":"Place","default":""},"sleeps":{"type":"integer","title":"Sleeps","default":1},"max_nights":{"type":"integer","title":"Max Nights","default":3},"terms":{"type":"string","title":"Terms","default":"free"},"terms_label":{"type":"string","title":"Terms Label","default":"Free"},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_note":{"type":"string","title":"Price Note","default":""},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"welcomes":{"items":{"type":"string"},"type":"array","title":"Welcomes","default":[]},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities","default":[]},"host":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodbnb__MemberCard"},{"type":"null"}]},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"about":{"type":"string","title":"About","default":""},"house_rules":{"type":"string","title":"House Rules","default":""},"accessibility":{"type":"string","title":"Accessibility","default":""},"notice_days":{"type":"integer","title":"Notice Days","default":1},"hidden_reason":{"type":"string","title":"Hidden Reason","default":""},"reviews":{"items":{"$ref":"#/components/schemas/app__routes_hoodbnb__ReviewOut"},"type":"array","title":"Reviews","default":[]},"booked_nights":{"items":{"type":"string"},"type":"array","title":"Booked Nights","default":[]},"mine":{"type":"boolean","title":"Mine","default":false},"can_request":{"type":"boolean","title":"Can Request","default":false},"request_blocked":{"type":"string","title":"Request Blocked","default":""},"request_blocked_by":{"type":"string","title":"Request Blocked By","default":""}},"type":"object","required":["slug","kind","kind_label","emoji","title"],"title":"ListingDetail"},"app__routes_hoodbnb__ListingIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"air-mattress"},"title":{"type":"string","maxLength":140,"title":"Title","default":""},"about":{"type":"string","maxLength":2000,"title":"About","default":""},"house_rules":{"type":"string","maxLength":1200,"title":"House Rules","default":""},"market":{"type":"string","maxLength":120,"title":"Market","default":""},"city":{"type":"string","maxLength":120,"title":"City","default":""},"region":{"type":"string","maxLength":40,"title":"Region","default":""},"postal":{"type":"string","maxLength":20,"title":"Postal","default":""},"area_note":{"type":"string","maxLength":200,"title":"Area Note","default":""},"street_address":{"type":"string","maxLength":300,"title":"Street Address","default":""},"arrival_notes":{"type":"string","maxLength":600,"title":"Arrival Notes","default":""},"sleeps":{"type":"integer","maximum":12.0,"minimum":1.0,"title":"Sleeps","default":1},"max_nights":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Max Nights","default":3},"notice_days":{"type":"integer","maximum":60.0,"minimum":0.0,"title":"Notice Days","default":1},"terms":{"type":"string","title":"Terms","default":"free"},"price_cents":{"type":"integer","maximum":100000.0,"minimum":0.0,"title":"Price Cents","default":0},"price_note":{"type":"string","maxLength":300,"title":"Price Note","default":""},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"pay_handle":{"type":"string","maxLength":200,"title":"Pay Handle","default":""},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities","default":[]},"welcomes":{"items":{"type":"string"},"type":"array","title":"Welcomes","default":[]},"accessibility":{"type":"string","maxLength":400,"title":"Accessibility","default":""},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","title":"ListingIn"},"app__routes_hoodbnb__ListingPage":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"scope":{"type":"string","title":"Scope"},"market":{"type":"string","title":"Market","default":""},"market_name":{"type":"string","title":"Market Name","default":""},"counts":{"type":"object","title":"Counts","default":{}},"items":{"items":{"$ref":"#/components/schemas/app__routes_hoodbnb__ListingCard"},"type":"array","title":"Items","default":[]}},"type":"object","required":["total","page","per_page","scope"],"title":"ListingPage"},"app__routes_hoodbnb__MemberCard":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"type":"string","title":"Avatar Url","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"about":{"type":"string","title":"About","default":""},"member_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Since"},"email_verified":{"type":"boolean","title":"Email Verified","default":false},"nights_hosted":{"type":"integer","title":"Nights Hosted","default":0},"stays_taken":{"type":"integer","title":"Stays Taken","default":0},"host_reviews":{"type":"integer","title":"Host Reviews","default":0},"host_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Host Rating"},"guest_reviews":{"type":"integer","title":"Guest Reviews","default":0},"guest_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Guest Rating"}},"type":"object","required":["id","display_name"],"title":"MemberCard","description":"A member, as HoodBnB shows them — the membership card plus what this\nmodule knows. No email, ever: a host learns how to reach a guest when they\nconfirm the stay, not when they are browsing requests."},"app__routes_hoodbnb__Meta":{"properties":{"kinds":{"type":"object","title":"Kinds"},"terms":{"type":"object","title":"Terms"},"pay_methods":{"type":"object","title":"Pay Methods"},"agreement_version":{"type":"string","title":"Agreement Version"},"purposes":{"type":"object","title":"Purposes"},"amenities":{"type":"object","title":"Amenities"},"welcomes":{"type":"object","title":"Welcomes"},"report_reasons":{"type":"object","title":"Report Reasons"},"max_listings":{"type":"integer","title":"Max Listings"},"max_nights":{"type":"integer","title":"Max Nights"}},"type":"object","required":["kinds","terms","pay_methods","agreement_version","purposes","amenities","welcomes","report_reasons","max_listings","max_nights"],"title":"Meta"},"app__routes_hoodbnb__ReportIn":{"properties":{"reason":{"type":"string","title":"Reason","default":"other"},"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"type":"object","title":"ReportIn"},"app__routes_hoodbnb__ReviewIn":{"properties":{"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating","default":5},"body":{"type":"string","maxLength":1500,"title":"Body","default":""}},"type":"object","title":"ReviewIn"},"app__routes_hoodbnb__ReviewOut":{"properties":{"id":{"type":"integer","title":"Id"},"direction":{"type":"string","title":"Direction"},"rating":{"type":"integer","title":"Rating"},"body":{"type":"string","title":"Body"},"author":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodbnb__MemberCard"},{"type":"null"}]},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","direction","rating","body"],"title":"ReviewOut"},"app__routes_hoodbnb__SignIn":{"properties":{"version":{"type":"string","title":"Version"}},"type":"object","required":["version"],"title":"SignIn"},"app__routes_hoodbnb__Stats":{"properties":{"market":{"type":"string","title":"Market","default":""},"local":{"type":"integer","title":"Local","default":0},"state":{"type":"integer","title":"State","default":0},"nationwide":{"type":"integer","title":"Nationwide","default":0},"hosts":{"type":"integer","title":"Hosts","default":0},"nights_hosted":{"type":"integer","title":"Nights Hosted","default":0}},"type":"object","title":"Stats"},"app__routes_hoodmail__BulkIn":{"properties":{"ids":{"items":{"type":"integer"},"type":"array","title":"Ids"},"action":{"type":"string","title":"Action","default":""}},"type":"object","title":"BulkIn"},"app__routes_hoodmail__ClaimIn":{"properties":{"address":{"type":"string","maxLength":80,"title":"Address","default":""}},"type":"object","title":"ClaimIn"},"app__routes_hoodmail__CompIn":{"properties":{"address":{"type":"string","maxLength":200,"title":"Address","default":""},"term":{"type":"string","title":"Term","default":"annual"},"note":{"type":"string","maxLength":200,"title":"Note","default":""}},"type":"object","title":"CompIn"},"app__routes_hoodmail__MarkPaidIn":{"properties":{"method":{"type":"string","maxLength":20,"title":"Method","default":"transfer"},"note":{"type":"string","maxLength":200,"title":"Note","default":""}},"type":"object","title":"MarkPaidIn"},"app__routes_hoodmail__SendIn":{"properties":{"to":{"type":"string","maxLength":600,"title":"To","default":""},"cc":{"type":"string","maxLength":600,"title":"Cc","default":""},"bcc":{"type":"string","maxLength":600,"title":"Bcc","default":""},"subject":{"type":"string","maxLength":200,"title":"Subject","default":""},"body":{"type":"string","maxLength":100000,"title":"Body","default":""},"in_reply_to":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"In Reply To"},"draft_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Draft Id"},"photostream":{"items":{"type":"integer"},"type":"array","title":"Photostream"}},"type":"object","title":"SendIn"},"app__routes_hoodride__AgreementOut":{"properties":{"version":{"type":"string","title":"Version"},"title":{"type":"string","title":"Title"},"text":{"type":"string","title":"Text"},"prohibited":{"items":{"type":"object"},"type":"array","title":"Prohibited"},"signed":{"type":"boolean","title":"Signed","default":false},"signed_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Version"},"signed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed At"}},"type":"object","required":["version","title","text","prohibited"],"title":"AgreementOut"},"app__routes_hoodride__AskIn":{"properties":{"offer_cents":{"type":"integer","title":"Offer Cents","default":0},"trade_offer":{"type":"string","maxLength":400,"title":"Trade Offer","default":""},"see_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"See On"},"message":{"type":"string","maxLength":1500,"title":"Message","default":""}},"type":"object","title":"AskIn"},"app__routes_hoodride__AskOut":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"offer_cents":{"type":"integer","title":"Offer Cents","default":0},"trade_offer":{"type":"string","title":"Trade Offer","default":""},"see_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"See On"},"message":{"type":"string","title":"Message","default":""},"seller_reply":{"type":"string","title":"Seller Reply","default":""},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"decided_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided At"},"listing":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride__ListingCard"},{"type":"null"}]},"buyer":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride__MemberCard"},{"type":"null"}]},"seller":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride__MemberCard"},{"type":"null"}]},"meet_address":{"type":"string","title":"Meet Address","default":""},"meet_notes":{"type":"string","title":"Meet Notes","default":""},"pay_handle":{"type":"string","title":"Pay Handle","default":""}},"type":"object","required":["id","status"],"title":"AskOut"},"app__routes_hoodride__DecisionIn":{"properties":{"status":{"type":"string","title":"Status"},"reply":{"type":"string","maxLength":1500,"title":"Reply","default":""}},"type":"object","required":["status"],"title":"DecisionIn"},"app__routes_hoodride__Desk":{"properties":{"listings":{"items":{"$ref":"#/components/schemas/app__routes_hoodride__ListingCard"},"type":"array","title":"Listings","default":[]},"asks_made":{"items":{"$ref":"#/components/schemas/app__routes_hoodride__AskOut"},"type":"array","title":"Asks Made","default":[]},"asks_received":{"items":{"$ref":"#/components/schemas/app__routes_hoodride__AskOut"},"type":"array","title":"Asks Received","default":[]},"signed":{"type":"boolean","title":"Signed","default":false},"agreement_version":{"type":"string","title":"Agreement Version","default":""},"email_verified":{"type":"boolean","title":"Email Verified","default":false}},"type":"object","title":"Desk"},"app__routes_hoodride__HideIn":{"properties":{"hidden":{"type":"boolean","title":"Hidden","default":true},"reason":{"type":"string","maxLength":300,"title":"Reason","default":""}},"type":"object","title":"HideIn"},"app__routes_hoodride__ListingCard":{"properties":{"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"emoji":{"type":"string","title":"Emoji"},"year":{"type":"integer","title":"Year"},"make":{"type":"string","title":"Make"},"model":{"type":"string","title":"Model"},"trim":{"type":"string","title":"Trim","default":""},"ride":{"type":"string","title":"Ride"},"body":{"type":"string","title":"Body"},"body_label":{"type":"string","title":"Body Label"},"body_emoji":{"type":"string","title":"Body Emoji"},"transmission":{"type":"string","title":"Transmission"},"transmission_label":{"type":"string","title":"Transmission Label"},"drivetrain":{"type":"string","title":"Drivetrain","default":""},"fuel":{"type":"string","title":"Fuel","default":""},"color":{"type":"string","title":"Color","default":""},"runs":{"type":"string","title":"Runs"},"runs_label":{"type":"string","title":"Runs Label"},"runs_emoji":{"type":"string","title":"Runs Emoji"},"drivable":{"type":"boolean","title":"Drivable","default":false},"odometer_miles":{"type":"integer","title":"Odometer Miles","default":0},"odometer_unknown":{"type":"boolean","title":"Odometer Unknown","default":false},"odometer_label":{"type":"string","title":"Odometer Label","default":""},"title_status":{"type":"string","title":"Title Status"},"title_status_label":{"type":"string","title":"Title Status Label"},"title_clear":{"type":"boolean","title":"Title Clear","default":false},"title_warning":{"type":"string","title":"Title Warning","default":""},"headline":{"type":"string","title":"Headline","default":""},"market":{"type":"string","title":"Market","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"area_note":{"type":"string","title":"Area Note","default":""},"place":{"type":"string","title":"Place"},"meet":{"type":"string","title":"Meet"},"meet_label":{"type":"string","title":"Meet Label"},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_firm":{"type":"boolean","title":"Price Firm","default":false},"price_note":{"type":"string","title":"Price Note","default":""},"price_label":{"type":"string","title":"Price Label"},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"analog":{"items":{"type":"string"},"type":"array","title":"Analog","default":[]},"analog_score":{"type":"integer","title":"Analog Score","default":0},"keeps":{"items":{"type":"string"},"type":"array","title":"Keeps","default":[]},"photos":{"items":{"$ref":"#/components/schemas/app__routes_hoodride__PhotoOut"},"type":"array","title":"Photos","default":[]},"seller":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride__MemberCard"},{"type":"null"}]},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"is_taken":{"type":"boolean","title":"Is Taken","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["slug","kind","kind_label","emoji","year","make","model","ride","body","body_label","body_emoji","transmission","transmission_label","runs","runs_label","runs_emoji","title_status","title_status_label","place","meet","meet_label","price_label"],"title":"ListingCard","description":"What a stranger sees. Note what is NOT here: `meet_address`,\n`meet_notes`, `pay_handle`, `vin`. Their absence from this model is the\nenforcement — a field that does not exist cannot be leaked by a new\nendpoint that forgot to check."},"app__routes_hoodride__ListingDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"emoji":{"type":"string","title":"Emoji"},"year":{"type":"integer","title":"Year"},"make":{"type":"string","title":"Make"},"model":{"type":"string","title":"Model"},"trim":{"type":"string","title":"Trim","default":""},"ride":{"type":"string","title":"Ride"},"body":{"type":"string","title":"Body"},"body_label":{"type":"string","title":"Body Label"},"body_emoji":{"type":"string","title":"Body Emoji"},"transmission":{"type":"string","title":"Transmission"},"transmission_label":{"type":"string","title":"Transmission Label"},"drivetrain":{"type":"string","title":"Drivetrain","default":""},"fuel":{"type":"string","title":"Fuel","default":""},"color":{"type":"string","title":"Color","default":""},"runs":{"type":"string","title":"Runs"},"runs_label":{"type":"string","title":"Runs Label"},"runs_emoji":{"type":"string","title":"Runs Emoji"},"drivable":{"type":"boolean","title":"Drivable","default":false},"odometer_miles":{"type":"integer","title":"Odometer Miles","default":0},"odometer_unknown":{"type":"boolean","title":"Odometer Unknown","default":false},"odometer_label":{"type":"string","title":"Odometer Label","default":""},"title_status":{"type":"string","title":"Title Status"},"title_status_label":{"type":"string","title":"Title Status Label"},"title_clear":{"type":"boolean","title":"Title Clear","default":false},"title_warning":{"type":"string","title":"Title Warning","default":""},"headline":{"type":"string","title":"Headline","default":""},"market":{"type":"string","title":"Market","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"area_note":{"type":"string","title":"Area Note","default":""},"place":{"type":"string","title":"Place"},"meet":{"type":"string","title":"Meet"},"meet_label":{"type":"string","title":"Meet Label"},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_firm":{"type":"boolean","title":"Price Firm","default":false},"price_note":{"type":"string","title":"Price Note","default":""},"price_label":{"type":"string","title":"Price Label"},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"analog":{"items":{"type":"string"},"type":"array","title":"Analog","default":[]},"analog_score":{"type":"integer","title":"Analog Score","default":0},"keeps":{"items":{"type":"string"},"type":"array","title":"Keeps","default":[]},"photos":{"items":{"$ref":"#/components/schemas/app__routes_hoodride__PhotoOut"},"type":"array","title":"Photos","default":[]},"seller":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride__MemberCard"},{"type":"null"}]},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"is_taken":{"type":"boolean","title":"Is Taken","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"about":{"type":"string","title":"About","default":""},"faults":{"type":"string","title":"Faults","default":""},"title_note":{"type":"string","title":"Title Note","default":""},"vin":{"type":"string","title":"Vin","default":""},"recall_url":{"type":"string","title":"Recall Url","default":""},"vin_withheld":{"type":"boolean","title":"Vin Withheld","default":false},"my_ask":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride__AskOut"},{"type":"null"}]},"asks_open":{"type":"integer","title":"Asks Open","default":0},"is_mine":{"type":"boolean","title":"Is Mine","default":false}},"type":"object","required":["slug","kind","kind_label","emoji","year","make","model","ride","body","body_label","body_emoji","transmission","transmission_label","runs","runs_label","runs_emoji","title_status","title_status_label","place","meet","meet_label","price_label"],"title":"ListingDetail"},"app__routes_hoodride__ListingIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"sale"},"year":{"type":"integer","title":"Year","default":0},"make":{"type":"string","maxLength":40,"title":"Make","default":""},"model":{"type":"string","maxLength":60,"title":"Model","default":""},"trim":{"type":"string","maxLength":60,"title":"Trim","default":""},"body":{"type":"string","title":"Body","default":"sedan"},"transmission":{"type":"string","title":"Transmission","default":"auto"},"drivetrain":{"type":"string","title":"Drivetrain","default":"fwd"},"fuel":{"type":"string","title":"Fuel","default":"gas"},"color":{"type":"string","maxLength":30,"title":"Color","default":""},"runs":{"type":"string","title":"Runs","default":"runs"},"odometer_miles":{"type":"integer","title":"Odometer Miles","default":0},"odometer_unknown":{"type":"boolean","title":"Odometer Unknown","default":false},"title_status":{"type":"string","title":"Title Status","default":"clean"},"title_note":{"type":"string","maxLength":300,"title":"Title Note","default":""},"vin":{"type":"string","maxLength":32,"title":"Vin","default":""},"headline":{"type":"string","maxLength":140,"title":"Headline","default":""},"about":{"type":"string","maxLength":2000,"title":"About","default":""},"faults":{"type":"string","maxLength":1200,"title":"Faults","default":""},"market":{"type":"string","maxLength":120,"title":"Market","default":""},"city":{"type":"string","maxLength":120,"title":"City","default":""},"region":{"type":"string","maxLength":40,"title":"Region","default":""},"postal":{"type":"string","maxLength":20,"title":"Postal","default":""},"area_note":{"type":"string","maxLength":200,"title":"Area Note","default":""},"lat":{"type":"number","title":"Lat","default":0.0},"lng":{"type":"number","title":"Lng","default":0.0},"meet":{"type":"string","title":"Meet","default":"public-meet"},"meet_address":{"type":"string","maxLength":300,"title":"Meet Address","default":""},"meet_notes":{"type":"string","maxLength":600,"title":"Meet Notes","default":""},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_firm":{"type":"boolean","title":"Price Firm","default":false},"price_note":{"type":"string","maxLength":300,"title":"Price Note","default":""},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"pay_handle":{"type":"string","maxLength":200,"title":"Pay Handle","default":""},"analog":{"items":{"type":"string"},"type":"array","title":"Analog","default":[]},"keeps":{"items":{"type":"string"},"type":"array","title":"Keeps","default":[]},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","title":"ListingIn"},"app__routes_hoodride__ListingPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/app__routes_hoodride__ListingCard"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts","default":{}},"scope":{"type":"string","title":"Scope","default":"local"}},"type":"object","required":["items","total","page","per_page"],"title":"ListingPage"},"app__routes_hoodride__MemberCard":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"type":"string","title":"Avatar Url","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"about":{"type":"string","title":"About","default":""},"member_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Since"},"email_verified":{"type":"boolean","title":"Email Verified","default":false},"cars_sold":{"type":"integer","title":"Cars Sold","default":0},"cars_bought":{"type":"integer","title":"Cars Bought","default":0},"listings_live":{"type":"integer","title":"Listings Live","default":0}},"type":"object","required":["id","display_name"],"title":"MemberCard"},"app__routes_hoodride__Meta":{"properties":{"year_ceiling":{"type":"integer","title":"Year Ceiling"},"year_floor":{"type":"integer","title":"Year Floor"},"kinds":{"items":{"type":"object"},"type":"array","title":"Kinds"},"runs":{"items":{"type":"object"},"type":"array","title":"Runs"},"bodies":{"items":{"type":"object"},"type":"array","title":"Bodies"},"title_status":{"items":{"type":"object"},"type":"array","title":"Title Status"},"transmissions":{"items":{"type":"object"},"type":"array","title":"Transmissions"},"drivetrains":{"items":{"type":"object"},"type":"array","title":"Drivetrains"},"fuels":{"items":{"type":"object"},"type":"array","title":"Fuels"},"analog":{"items":{"type":"object"},"type":"array","title":"Analog"},"keeps":{"items":{"type":"object"},"type":"array","title":"Keeps"},"meets":{"items":{"type":"object"},"type":"array","title":"Meets"},"pay_methods":{"items":{"type":"object"},"type":"array","title":"Pay Methods"},"report_reasons":{"items":{"type":"object"},"type":"array","title":"Report Reasons"},"prohibited":{"items":{"type":"object"},"type":"array","title":"Prohibited"},"max_listings":{"type":"integer","title":"Max Listings"},"max_price_cents":{"type":"integer","title":"Max Price Cents"},"max_odometer":{"type":"integer","title":"Max Odometer"},"max_photos":{"type":"integer","title":"Max Photos"},"photo_max_bytes":{"type":"integer","title":"Photo Max Bytes"},"photo_exts":{"items":{"type":"string"},"type":"array","title":"Photo Exts"},"agreement_version":{"type":"string","title":"Agreement Version"},"agreement_title":{"type":"string","title":"Agreement Title"}},"type":"object","required":["year_ceiling","year_floor","kinds","runs","bodies","title_status","transmissions","drivetrains","fuels","analog","keeps","meets","pay_methods","report_reasons","prohibited","max_listings","max_price_cents","max_odometer","max_photos","photo_max_bytes","photo_exts","agreement_version","agreement_title"],"title":"Meta"},"app__routes_hoodride__PhotoOut":{"properties":{"id":{"type":"integer","title":"Id"},"card_url":{"type":"string","title":"Card Url"},"full_url":{"type":"string","title":"Full Url"},"caption":{"type":"string","title":"Caption","default":""},"width":{"type":"integer","title":"Width","default":0},"height":{"type":"integer","title":"Height","default":0},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["id","card_url","full_url"],"title":"PhotoOut"},"app__routes_hoodride__ReportIn":{"properties":{"reason":{"type":"string","title":"Reason","default":"other"},"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"type":"object","title":"ReportIn"},"app__routes_hoodride__ResolveIn":{"properties":{"status":{"type":"string","title":"Status"},"note":{"type":"string","maxLength":400,"title":"Note","default":""}},"type":"object","required":["status"],"title":"ResolveIn"},"app__routes_hoodride__SignIn":{"properties":{"version":{"type":"string","title":"Version"},"accept":{"type":"boolean","title":"Accept","default":false}},"type":"object","required":["version"],"title":"SignIn"},"app__routes_hoodride__Stats":{"properties":{"listings":{"type":"integer","title":"Listings","default":0},"live":{"type":"integer","title":"Live","default":0},"free":{"type":"integer","title":"Free","default":0},"drivable":{"type":"integer","title":"Drivable","default":0},"oldest_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Oldest Year"},"newest_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Newest Year"},"sellers":{"type":"integer","title":"Sellers","default":0}},"type":"object","title":"Stats"},"app__routes_hoodride_bicycles__AgreementOut":{"properties":{"version":{"type":"string","title":"Version"},"title":{"type":"string","title":"Title"},"text":{"type":"string","title":"Text"},"prohibited":{"items":{"type":"object"},"type":"array","title":"Prohibited"},"signed":{"type":"boolean","title":"Signed","default":false},"signed_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Version"},"signed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed At"}},"type":"object","required":["version","title","text","prohibited"],"title":"AgreementOut"},"app__routes_hoodride_bicycles__AskIn":{"properties":{"offer_cents":{"type":"integer","title":"Offer Cents","default":0},"trade_offer":{"type":"string","maxLength":400,"title":"Trade Offer","default":""},"message":{"type":"string","maxLength":1500,"title":"Message","default":""}},"type":"object","title":"AskIn"},"app__routes_hoodride_bicycles__AskOut":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"offer_cents":{"type":"integer","title":"Offer Cents","default":0},"trade_offer":{"type":"string","title":"Trade Offer","default":""},"message":{"type":"string","title":"Message","default":""},"seller_reply":{"type":"string","title":"Seller Reply","default":""},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"decided_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided At"},"listing":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingCard"},{"type":"null"}]},"buyer":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__MemberCard"},{"type":"null"}]},"seller":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__MemberCard"},{"type":"null"}]},"meet_address":{"type":"string","title":"Meet Address","default":""},"meet_notes":{"type":"string","title":"Meet Notes","default":""},"pay_handle":{"type":"string","title":"Pay Handle","default":""}},"type":"object","required":["id","status"],"title":"AskOut"},"app__routes_hoodride_bicycles__DecisionIn":{"properties":{"status":{"type":"string","title":"Status"},"reply":{"type":"string","maxLength":1500,"title":"Reply","default":""}},"type":"object","required":["status"],"title":"DecisionIn"},"app__routes_hoodride_bicycles__Desk":{"properties":{"listings":{"items":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingCard"},"type":"array","title":"Listings","default":[]},"asks_made":{"items":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__AskOut"},"type":"array","title":"Asks Made","default":[]},"asks_received":{"items":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__AskOut"},"type":"array","title":"Asks Received","default":[]},"signed":{"type":"boolean","title":"Signed","default":false},"agreement_version":{"type":"string","title":"Agreement Version","default":""},"email_verified":{"type":"boolean","title":"Email Verified","default":false}},"type":"object","title":"Desk"},"app__routes_hoodride_bicycles__HideIn":{"properties":{"hidden":{"type":"boolean","title":"Hidden","default":true},"reason":{"type":"string","maxLength":300,"title":"Reason","default":""}},"type":"object","title":"HideIn"},"app__routes_hoodride_bicycles__ListingCard":{"properties":{"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"emoji":{"type":"string","title":"Emoji"},"bike_type":{"type":"string","title":"Bike Type"},"bike_type_label":{"type":"string","title":"Bike Type Label"},"bike_type_emoji":{"type":"string","title":"Bike Type Emoji"},"make":{"type":"string","title":"Make","default":""},"model":{"type":"string","title":"Model","default":""},"year":{"type":"integer","title":"Year","default":0},"bike":{"type":"string","title":"Bike"},"frame_size":{"type":"string","title":"Frame Size","default":""},"color":{"type":"string","title":"Color","default":""},"condition":{"type":"string","title":"Condition"},"condition_label":{"type":"string","title":"Condition Label"},"condition_emoji":{"type":"string","title":"Condition Emoji"},"headline":{"type":"string","title":"Headline","default":""},"market":{"type":"string","title":"Market","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"place":{"type":"string","title":"Place"},"meet":{"type":"string","title":"Meet"},"meet_label":{"type":"string","title":"Meet Label"},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_firm":{"type":"boolean","title":"Price Firm","default":false},"price_note":{"type":"string","title":"Price Note","default":""},"price_label":{"type":"string","title":"Price Label"},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"serial_flagged":{"type":"boolean","title":"Serial Flagged","default":false},"seller":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__MemberCard"},{"type":"null"}]},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"is_taken":{"type":"boolean","title":"Is Taken","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["slug","kind","kind_label","emoji","bike_type","bike_type_label","bike_type_emoji","bike","condition","condition_label","condition_emoji","place","meet","meet_label","price_label"],"title":"ListingCard","description":"What a stranger sees. The serial is NOT here — see `ListingDetail`,\nwhich gates it behind `hb.serial_visible_to` the same way HoodRide's own\ndetail gates the VIN. A field absent from this model cannot be leaked by\nan endpoint that forgot to check."},"app__routes_hoodride_bicycles__ListingDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"emoji":{"type":"string","title":"Emoji"},"bike_type":{"type":"string","title":"Bike Type"},"bike_type_label":{"type":"string","title":"Bike Type Label"},"bike_type_emoji":{"type":"string","title":"Bike Type Emoji"},"make":{"type":"string","title":"Make","default":""},"model":{"type":"string","title":"Model","default":""},"year":{"type":"integer","title":"Year","default":0},"bike":{"type":"string","title":"Bike"},"frame_size":{"type":"string","title":"Frame Size","default":""},"color":{"type":"string","title":"Color","default":""},"condition":{"type":"string","title":"Condition"},"condition_label":{"type":"string","title":"Condition Label"},"condition_emoji":{"type":"string","title":"Condition Emoji"},"headline":{"type":"string","title":"Headline","default":""},"market":{"type":"string","title":"Market","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"place":{"type":"string","title":"Place"},"meet":{"type":"string","title":"Meet"},"meet_label":{"type":"string","title":"Meet Label"},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_firm":{"type":"boolean","title":"Price Firm","default":false},"price_note":{"type":"string","title":"Price Note","default":""},"price_label":{"type":"string","title":"Price Label"},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"serial_flagged":{"type":"boolean","title":"Serial Flagged","default":false},"seller":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__MemberCard"},{"type":"null"}]},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"is_taken":{"type":"boolean","title":"Is Taken","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"about":{"type":"string","title":"About","default":""},"faults":{"type":"string","title":"Faults","default":""},"serial_number":{"type":"string","title":"Serial Number","default":""},"serial_withheld":{"type":"boolean","title":"Serial Withheld","default":false},"my_ask":{"anyOf":[{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__AskOut"},{"type":"null"}]},"asks_open":{"type":"integer","title":"Asks Open","default":0},"is_mine":{"type":"boolean","title":"Is Mine","default":false}},"type":"object","required":["slug","kind","kind_label","emoji","bike_type","bike_type_label","bike_type_emoji","bike","condition","condition_label","condition_emoji","place","meet","meet_label","price_label"],"title":"ListingDetail"},"app__routes_hoodride_bicycles__ListingIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"sale"},"bike_type":{"type":"string","title":"Bike Type","default":"hybrid"},"make":{"type":"string","maxLength":40,"title":"Make","default":""},"model":{"type":"string","maxLength":60,"title":"Model","default":""},"year":{"type":"integer","title":"Year","default":0},"frame_size":{"type":"string","maxLength":20,"title":"Frame Size","default":""},"color":{"type":"string","maxLength":30,"title":"Color","default":""},"condition":{"type":"string","title":"Condition","default":"good"},"serial_number":{"type":"string","maxLength":32,"title":"Serial Number","default":""},"headline":{"type":"string","maxLength":140,"title":"Headline","default":""},"about":{"type":"string","maxLength":2000,"title":"About","default":""},"faults":{"type":"string","maxLength":1200,"title":"Faults","default":""},"market":{"type":"string","maxLength":120,"title":"Market","default":""},"city":{"type":"string","maxLength":120,"title":"City","default":""},"region":{"type":"string","maxLength":40,"title":"Region","default":""},"postal":{"type":"string","maxLength":20,"title":"Postal","default":""},"meet":{"type":"string","title":"Meet","default":"public-meet"},"meet_address":{"type":"string","maxLength":300,"title":"Meet Address","default":""},"meet_notes":{"type":"string","maxLength":600,"title":"Meet Notes","default":""},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_firm":{"type":"boolean","title":"Price Firm","default":false},"price_note":{"type":"string","maxLength":300,"title":"Price Note","default":""},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"pay_handle":{"type":"string","maxLength":200,"title":"Pay Handle","default":""},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","title":"ListingIn"},"app__routes_hoodride_bicycles__ListingPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/app__routes_hoodride_bicycles__ListingCard"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts","default":{}},"scope":{"type":"string","title":"Scope","default":"local"}},"type":"object","required":["items","total","page","per_page"],"title":"ListingPage"},"app__routes_hoodride_bicycles__MemberCard":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"type":"string","title":"Avatar Url","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"about":{"type":"string","title":"About","default":""},"member_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Since"},"email_verified":{"type":"boolean","title":"Email Verified","default":false},"bikes_sold":{"type":"integer","title":"Bikes Sold","default":0},"bikes_bought":{"type":"integer","title":"Bikes Bought","default":0},"listings_live":{"type":"integer","title":"Listings Live","default":0}},"type":"object","required":["id","display_name"],"title":"MemberCard"},"app__routes_hoodride_bicycles__Meta":{"properties":{"kinds":{"items":{"type":"object"},"type":"array","title":"Kinds"},"bike_types":{"items":{"type":"object"},"type":"array","title":"Bike Types"},"condition":{"items":{"type":"object"},"type":"array","title":"Condition"},"meets":{"items":{"type":"object"},"type":"array","title":"Meets"},"pay_methods":{"items":{"type":"object"},"type":"array","title":"Pay Methods"},"report_reasons":{"items":{"type":"object"},"type":"array","title":"Report Reasons"},"prohibited":{"items":{"type":"object"},"type":"array","title":"Prohibited"},"max_listings":{"type":"integer","title":"Max Listings"},"max_price_cents":{"type":"integer","title":"Max Price Cents"},"agreement_version":{"type":"string","title":"Agreement Version"},"agreement_title":{"type":"string","title":"Agreement Title"}},"type":"object","required":["kinds","bike_types","condition","meets","pay_methods","report_reasons","prohibited","max_listings","max_price_cents","agreement_version","agreement_title"],"title":"Meta"},"app__routes_hoodride_bicycles__ReportIn":{"properties":{"reason":{"type":"string","title":"Reason","default":"other"},"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"type":"object","title":"ReportIn"},"app__routes_hoodride_bicycles__ResolveIn":{"properties":{"status":{"type":"string","title":"Status"},"note":{"type":"string","maxLength":400,"title":"Note","default":""}},"type":"object","required":["status"],"title":"ResolveIn"},"app__routes_hoodride_bicycles__SignIn":{"properties":{"version":{"type":"string","title":"Version"},"accept":{"type":"boolean","title":"Accept","default":false}},"type":"object","required":["version"],"title":"SignIn"},"app__routes_hydrology__SystemOut":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"note":{"type":"string","title":"Note"},"member_count":{"type":"integer","title":"Member Count"},"counted_members":{"type":"integer","title":"Counted Members"},"storage_af":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Storage Af"},"capacity_af":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Capacity Af"},"pct_full":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Full"},"slugs":{"items":{"type":"string"},"type":"array","title":"Slugs"}},"type":"object","required":["key","name","note","member_count","counted_members","slugs"],"title":"SystemOut","description":"A river-system rollup. Storage acre-feet sum physically across\noperators; the percent counts only members carrying BOTH halves, and\nthe note names the capacity-basis mix."},"app__routes_instag__MediaOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"status":{"type":"string","title":"Status"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"},"alt_text":{"type":"string","title":"Alt Text"},"thumb_url":{"type":"string","title":"Thumb Url"},"feed_url":{"type":"string","title":"Feed Url"},"full_url":{"type":"string","title":"Full Url"},"poster_url":{"type":"string","title":"Poster Url","default":""},"video_url":{"type":"string","title":"Video Url","default":""}},"type":"object","required":["id","kind","status","width","height","alt_text","thumb_url","feed_url","full_url"],"title":"MediaOut"},"app__routes_instag__ReportIn":{"properties":{"target_kind":{"type":"string","title":"Target Kind","default":"post"},"target_id":{"type":"integer","title":"Target Id"},"reason":{"type":"string","maxLength":40,"title":"Reason"},"detail":{"type":"string","maxLength":600,"title":"Detail","default":""}},"type":"object","required":["target_id","reason"],"title":"ReportIn"},"app__routes_kussr__CancelIn":{"properties":{"admin_note":{"type":"string","title":"Admin Note","default":""},"refund":{"type":"boolean","title":"Refund","default":false}},"type":"object","title":"CancelIn"},"app__routes_kussr__CodesIn":{"properties":{"count":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Count","default":1},"percent_off":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Percent Off","default":100},"episode_slug":{"type":"string","title":"Episode Slug","default":""},"max_uses":{"type":"integer","maximum":10000.0,"minimum":0.0,"title":"Max Uses","default":1},"label":{"type":"string","title":"Label","default":""},"note":{"type":"string","title":"Note","default":""},"expires_days":{"type":"integer","maximum":3650.0,"minimum":0.0,"title":"Expires Days","default":0}},"type":"object","title":"CodesIn"},"app__routes_kussr__CompIn":{"properties":{"episode_slug":{"type":"string","title":"Episode Slug"},"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name","default":""},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["episode_slug","email"],"title":"CompIn"},"app__routes_kussr__MarkPaidIn":{"properties":{"payment_method":{"type":"string","title":"Payment Method","default":""},"payment_ref":{"type":"string","title":"Payment Ref","default":""},"admin_note":{"type":"string","title":"Admin Note","default":""}},"type":"object","title":"MarkPaidIn"},"app__routes_kussr__OrderIn":{"properties":{"episode":{"type":"string","maxLength":120,"minLength":1,"title":"Episode"},"amount_cents":{"type":"integer","title":"Amount Cents","default":0},"payment":{"type":"string","title":"Payment","default":"invoice"},"code":{"type":"string","title":"Code","default":""},"name":{"type":"string","maxLength":160,"title":"Name","default":""},"email":{"type":"string","maxLength":200,"title":"Email","default":""},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["episode"],"title":"OrderIn"},"app__routes_kussr__SectionIn":{"properties":{"id":{"type":"string","maxLength":80,"title":"Id","default":""},"name":{"type":"string","maxLength":120,"title":"Name","default":""},"topic":{"type":"string","maxLength":80,"title":"Topic","default":""},"tagline":{"type":"string","maxLength":200,"title":"Tagline","default":""},"blurb":{"type":"string","maxLength":2000,"title":"Blurb","default":""},"hue":{"type":"integer","title":"Hue","default":32},"theme":{"type":"string","maxLength":60,"title":"Theme","default":""},"status":{"type":"string","title":"Status","default":"live"},"order":{"type":"integer","title":"Order","default":0}},"type":"object","title":"SectionIn"},"app__routes_member_admin__BulkIn":{"properties":{"user_ids":{"items":{"type":"integer"},"type":"array","maxItems":200,"title":"User Ids"},"action":{"type":"string","title":"Action"},"reason_code":{"type":"string","title":"Reason Code","default":"other"},"public_note":{"type":"string","maxLength":1000,"title":"Public Note","default":""},"internal_note":{"type":"string","maxLength":1000,"title":"Internal Note","default":""},"hours":{"type":"integer","maximum":87600.0,"minimum":0.0,"title":"Hours","default":0},"scope":{"type":"string","maxLength":40,"title":"Scope","default":""},"strike":{"type":"boolean","title":"Strike","default":true}},"type":"object","required":["action"],"title":"BulkIn"},"app__routes_member_admin__ResolveIn":{"properties":{"status":{"type":"string","title":"Status","default":"actioned"},"note":{"type":"string","maxLength":400,"title":"Note","default":""},"remove_content":{"type":"boolean","title":"Remove Content","default":false},"member_action":{"type":"string","title":"Member Action","default":""},"member_hours":{"type":"integer","maximum":87600.0,"minimum":0.0,"title":"Member Hours","default":0},"member_reason":{"type":"string","title":"Member Reason","default":"other"},"member_note":{"type":"string","maxLength":1000,"title":"Member Note","default":""}},"type":"object","title":"ResolveIn"},"app__routes_membership__CardIn":{"properties":{"display_name":{"type":"string","maxLength":120,"title":"Display Name","default":""},"city":{"type":"string","maxLength":120,"title":"City","default":""},"region":{"type":"string","maxLength":80,"title":"Region","default":""},"postal":{"type":"string","maxLength":20,"title":"Postal","default":""},"phone":{"type":"string","maxLength":40,"title":"Phone","default":""},"about":{"type":"string","maxLength":600,"title":"About","default":""},"listed_white":{"type":"boolean","title":"Listed White","default":false},"listed_yellow":{"type":"boolean","title":"Listed Yellow","default":false},"listed_market":{"type":"string","maxLength":120,"title":"Listed Market","default":""},"listed_show_phone":{"type":"boolean","title":"Listed Show Phone","default":false},"listed_show_city":{"type":"boolean","title":"Listed Show City","default":true},"listed_show_about":{"type":"boolean","title":"Listed Show About","default":true},"listed_online":{"type":"boolean","title":"Listed Online","default":false},"business_name":{"type":"string","maxLength":200,"title":"Business Name","default":""},"business_section":{"type":"string","maxLength":80,"title":"Business Section","default":""},"business_tagline":{"type":"string","maxLength":300,"title":"Business Tagline","default":""},"business_url":{"type":"string","maxLength":600,"title":"Business Url","default":""},"business_hours":{"type":"string","maxLength":200,"title":"Business Hours","default":""}},"type":"object","title":"CardIn"},"app__routes_messages__SendIn":{"properties":{"body":{"type":"string","maxLength":4000,"title":"Body","default":""}},"type":"object","title":"SendIn"},"app__routes_movingday__FindingOut":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"disposition":{"type":"string","title":"Disposition"},"destination":{"type":"string","title":"Destination"},"destination_title":{"type":"string","title":"Destination Title"},"note":{"type":"string","title":"Note"},"files":{"type":"integer","title":"Files"},"bytes":{"type":"integer","title":"Bytes"},"items":{"type":"integer","title":"Items"},"lanes":{"additionalProperties":{"type":"integer"},"type":"object","title":"Lanes"},"samples":{"items":{"type":"object"},"type":"array","title":"Samples"},"extra":{"type":"object","title":"Extra"},"selected":{"type":"boolean","title":"Selected"},"imported":{"type":"integer","title":"Imported"},"skipped":{"type":"integer","title":"Skipped"},"error":{"type":"string","title":"Error"}},"type":"object","required":["key","title","disposition","destination","destination_title","note","files","bytes","items","lanes","samples","extra","selected","imported","skipped","error"],"title":"FindingOut"},"app__routes_movingday__ImportIn":{"properties":{"key":{"type":"string","title":"Key"},"lanes":{"items":{"type":"string"},"type":"array","title":"Lanes"},"stack":{"type":"string","title":"Stack","default":""},"tweeter_visibility":{"type":"string","title":"Tweeter Visibility","default":"members"},"profile_fields":{"items":{"type":"string"},"type":"array","title":"Profile Fields"}},"type":"object","required":["key"],"title":"ImportIn"},"app__routes_news__SlateIn":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"place":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"location_mode":{"type":"string","title":"Location Mode","default":"exact"}},"type":"object","title":"SlateIn"},"app__routes_news__SourceIn":{"properties":{"kind":{"type":"string","title":"Kind"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"feed_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feed Id"}},"type":"object","required":["kind"],"title":"SourceIn"},"app__routes_payphone__EntryIn":{"properties":{"slot":{"type":"integer","title":"Slot","default":0},"kind":{"type":"string","title":"Kind","default":"contact"},"label":{"type":"string","title":"Label","default":""},"value":{"type":"string","title":"Value","default":""},"speak":{"type":"string","title":"Speak","default":"freely"},"pronounce":{"type":"string","title":"Pronounce","default":""},"first":{"type":"boolean","title":"First","default":false},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","title":"EntryIn"},"app__routes_payphone__LineIn":{"properties":{"key_digits":{"type":"string","title":"Key Digits","default":""},"greeting_name":{"type":"string","title":"Greeting Name","default":""},"live":{"type":"boolean","title":"Live","default":true},"market_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Market Id"},"pin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pin"}},"type":"object","title":"LineIn"},"app__routes_police_academy__AgencyOut":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"agency_type":{"type":"string","title":"Agency Type"},"county":{"type":"string","title":"County"},"market_slug":{"type":"string","title":"Market Slug"},"is_covert":{"type":"boolean","title":"Is Covert"},"officer_count":{"type":"integer","title":"Officer Count","default":0}},"type":"object","required":["slug","name","agency_type","county","market_slug","is_covert"],"title":"AgencyOut"},"app__routes_police_academy__MediaOut":{"properties":{"watching":{"type":"string","title":"Watching"},"why_it_accumulates":{"type":"string","title":"Why It Accumulates"},"polls":{"type":"integer","title":"Polls","default":0},"feeds_watched":{"type":"integer","title":"Feeds Watched","default":0},"seen_total":{"type":"integer","title":"Seen Total","default":0},"rejected_crime_news":{"type":"integer","title":"Rejected Crime News","default":0},"rejected_not_conduct":{"type":"integer","title":"Rejected Not Conduct","default":0},"last_polled":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Polled"},"feed_errors":{"type":"string","title":"Feed Errors","default":""},"items":{"items":{"$ref":"#/components/schemas/MediaItemOut"},"type":"array","title":"Items"}},"type":"object","required":["watching","why_it_accumulates"],"title":"MediaOut","description":"Banked conduct coverage, and what the poller had to reject to find it.\n\nThe counts are the point when the list is empty. Without them \"no coverage\"\nis ambiguous between nothing happened, nobody reported it, and we never\nlooked — and only the last is our fault to admit."},"app__routes_police_academy__SourceOut":{"properties":{"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"publisher":{"type":"string","title":"Publisher"},"as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["kind","title","url","publisher","as_of"],"title":"SourceOut"},"app__routes_portfolio__PhotoOut":{"properties":{"id":{"type":"integer","title":"Id"},"card_url":{"type":"string","title":"Card Url"},"full_url":{"type":"string","title":"Full Url"},"caption":{"type":"string","title":"Caption","default":""},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["id","card_url","full_url"],"title":"PhotoOut"},"app__routes_redline__CorrectionIn":{"properties":{"finding_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Finding Id"},"kind":{"type":"string","pattern":"^(correction|context)$","title":"Kind","default":"correction"},"body":{"type":"string","maxLength":8000,"minLength":10,"title":"Body"},"corrected_text":{"type":"string","maxLength":8000,"title":"Corrected Text","default":""},"timecode":{"type":"string","maxLength":20,"title":"Timecode","default":""},"evidence_url":{"type":"string","maxLength":800,"title":"Evidence Url","default":""},"attested":{"type":"boolean","title":"Attested","default":false}},"type":"object","required":["body"],"title":"CorrectionIn"},"app__routes_redline__FindingOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"severity":{"type":"string","title":"Severity"},"title":{"type":"string","title":"Title"},"detail":{"type":"string","title":"Detail"},"minutes_text":{"type":"string","title":"Minutes Text"},"tape_text":{"type":"string","title":"Tape Text"},"tape_position":{"type":"number","title":"Tape Position"},"tape_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tape Seconds"},"score":{"type":"number","title":"Score"},"speaker":{"type":"string","title":"Speaker"},"section":{"type":"string","title":"Section"},"status":{"type":"string","title":"Status"},"review_note":{"type":"string","title":"Review Note"}},"type":"object","required":["id","kind","severity","title","detail","minutes_text","tape_text","tape_position","tape_seconds","score","speaker","section","status","review_note"],"title":"FindingOut"},"app__routes_redline__ReviewIn":{"properties":{"status":{"type":"string","pattern":"^(open|confirmed|explained|dismissed)$","title":"Status"},"note":{"type":"string","maxLength":4000,"title":"Note","default":""}},"type":"object","required":["status"],"title":"ReviewIn"},"app__routes_roles__AssignIn":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","default":[]}},"type":"object","required":["email","role"],"title":"AssignIn"},"app__routes_scanner__ReportIn":{"properties":{"headline":{"type":"string","maxLength":200,"minLength":4,"title":"Headline"},"detail":{"type":"string","maxLength":1000,"title":"Detail","default":""},"category":{"type":"string","title":"Category","default":""},"block_address":{"type":"string","maxLength":200,"title":"Block Address","default":""},"lat":{"type":"number","title":"Lat","default":0.0},"lng":{"type":"number","title":"Lng","default":0.0}},"type":"object","required":["headline"],"title":"ReportIn"},"app__routes_scanner__ResolveIn":{"properties":{"resolved_as":{"type":"string","pattern":"^(unfounded|confirmed)$","title":"Resolved As"},"note":{"type":"string","maxLength":400,"title":"Note","default":""}},"type":"object","required":["resolved_as"],"title":"ResolveIn"},"app__routes_scanner__SourceIn":{"properties":{"slug":{"type":"string","maxLength":60,"minLength":2,"title":"Slug"},"kind":{"type":"string","pattern":"^(nws|socrata|arcgis|json)$","title":"Kind"},"name":{"type":"string","maxLength":160,"title":"Name","default":""},"agency":{"type":"string","maxLength":160,"title":"Agency","default":""},"url":{"type":"string","maxLength":600,"title":"Url","default":""},"config":{"type":"object","title":"Config"},"tier":{"type":"string","pattern":"^(official|derived)$","title":"Tier","default":"official"},"active":{"type":"boolean","title":"Active","default":true},"poll_seconds":{"type":"integer","maximum":86400.0,"minimum":60.0,"title":"Poll Seconds","default":300}},"type":"object","required":["slug","kind"],"title":"SourceIn"},"app__routes_stars__ClaimIn":{"properties":{"attest":{"type":"boolean","title":"Attest","default":false}},"type":"object","title":"ClaimIn"},"app__routes_stars__RevokeIn":{"properties":{"user_id":{"type":"integer","title":"User Id"},"key":{"type":"string","title":"Key"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["user_id","key"],"title":"RevokeIn"},"app__routes_stars__SignIn":{"properties":{"version":{"type":"string","title":"Version","default":""},"agree":{"type":"boolean","title":"Agree","default":false}},"type":"object","title":"SignIn"},"app__routes_stars__StateOut":{"properties":{"armed":{"type":"boolean","title":"Armed"},"threshold":{"type":"integer","title":"Threshold"},"tools":{"type":"object","title":"Tools"},"by":{"type":"string","title":"By","default":""},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},"type":"object","required":["armed","threshold","tools"],"title":"StateOut"},"app__routes_studio__AccessOut":{"properties":{"allowed":{"type":"boolean","title":"Allowed"},"role":{"type":"string","title":"Role"},"title":{"type":"string","title":"Title"},"posted":{"type":"boolean","title":"Posted"},"reason":{"type":"string","title":"Reason"},"desk":{"type":"string","title":"Desk","default":"studio"}},"type":"object","required":["allowed","role","title","posted","reason"],"title":"AccessOut"},"app__routes_superfund__StateRollup":{"properties":{"state":{"type":"string","title":"State"},"state_code":{"type":"string","title":"State Code"},"site_count":{"type":"integer","title":"Site Count"},"active_count":{"type":"integer","title":"Active Count"},"deleted_count":{"type":"integer","title":"Deleted Count"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"}},"type":"object","required":["state","state_code","site_count","active_count","deleted_count"],"title":"StateRollup"},"app__routes_swapmeet__AgreementOut":{"properties":{"version":{"type":"string","title":"Version"},"title":{"type":"string","title":"Title"},"text":{"type":"string","title":"Text"},"prohibited":{"type":"object","title":"Prohibited","default":{}},"signed":{"type":"boolean","title":"Signed","default":false},"signed_version":{"type":"string","title":"Signed Version","default":""},"signed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed At"}},"type":"object","required":["version","title","text"],"title":"AgreementOut"},"app__routes_swapmeet__ClaimIn":{"properties":{"quantity":{"type":"integer","maximum":999.0,"minimum":1.0,"title":"Quantity","default":1},"offer_cents":{"type":"integer","maximum":5000000.0,"minimum":0.0,"title":"Offer Cents","default":0},"trade_offer":{"type":"string","maxLength":400,"title":"Trade Offer","default":""},"meet_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Meet On"},"message":{"type":"string","maxLength":1500,"title":"Message","default":""}},"type":"object","title":"ClaimIn"},"app__routes_swapmeet__ClaimOut":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"quantity":{"type":"integer","title":"Quantity"},"offer_cents":{"type":"integer","title":"Offer Cents","default":0},"trade_offer":{"type":"string","title":"Trade Offer","default":""},"meet_on":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meet On"},"message":{"type":"string","title":"Message","default":""},"seller_reply":{"type":"string","title":"Seller Reply","default":""},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"decided_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided At"},"listing":{"anyOf":[{"$ref":"#/components/schemas/app__routes_swapmeet__ListingCard"},{"type":"null"}]},"buyer":{"anyOf":[{"$ref":"#/components/schemas/app__routes_swapmeet__MemberCard"},{"type":"null"}]},"seller":{"anyOf":[{"$ref":"#/components/schemas/app__routes_swapmeet__MemberCard"},{"type":"null"}]},"meet_address":{"type":"string","title":"Meet Address","default":""},"meet_notes":{"type":"string","title":"Meet Notes","default":""},"pay_handle":{"type":"string","title":"Pay Handle","default":""},"reviewable":{"type":"boolean","title":"Reviewable","default":false},"my_review_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"My Review Id"}},"type":"object","required":["id","status","quantity"],"title":"ClaimOut"},"app__routes_swapmeet__DecisionIn":{"properties":{"action":{"type":"string","title":"Action"},"reply":{"type":"string","maxLength":1500,"title":"Reply","default":""}},"type":"object","required":["action"],"title":"DecisionIn"},"app__routes_swapmeet__Desk":{"properties":{"signed_in":{"type":"boolean","title":"Signed In","default":false},"can_publish":{"type":"boolean","title":"Can Publish","default":false},"publish_blocked":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Publish Blocked"},"home_market":{"type":"string","title":"Home Market","default":""},"home_market_name":{"type":"string","title":"Home Market Name","default":""},"agreement_signed":{"type":"boolean","title":"Agreement Signed","default":false},"agreement_version":{"type":"string","title":"Agreement Version","default":""},"listings":{"items":{"$ref":"#/components/schemas/app__routes_swapmeet__ListingCard"},"type":"array","title":"Listings","default":[]},"incoming":{"items":{"$ref":"#/components/schemas/app__routes_swapmeet__ClaimOut"},"type":"array","title":"Incoming","default":[]},"mine":{"items":{"$ref":"#/components/schemas/app__routes_swapmeet__ClaimOut"},"type":"array","title":"Mine","default":[]},"standing":{"type":"object","title":"Standing","default":{}}},"type":"object","title":"Desk","description":"One page for \"what is Swap Meet doing for me\": what I have on the table,\nwho has asked for it, and what I am going to collect."},"app__routes_swapmeet__HideIn":{"properties":{"hidden":{"type":"boolean","title":"Hidden"},"reason":{"type":"string","maxLength":300,"title":"Reason","default":""}},"type":"object","required":["hidden"],"title":"HideIn"},"app__routes_swapmeet__ListingCard":{"properties":{"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"emoji":{"type":"string","title":"Emoji"},"category":{"type":"string","title":"Category"},"category_label":{"type":"string","title":"Category Label"},"category_emoji":{"type":"string","title":"Category Emoji","default":""},"condition":{"type":"string","title":"Condition","default":"good"},"condition_label":{"type":"string","title":"Condition Label","default":""},"title":{"type":"string","title":"Title"},"market":{"type":"string","title":"Market","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"area_note":{"type":"string","title":"Area Note","default":""},"place":{"type":"string","title":"Place","default":""},"handoff":{"type":"string","title":"Handoff","default":"public-meet"},"handoff_label":{"type":"string","title":"Handoff Label","default":""},"quantity":{"type":"integer","title":"Quantity","default":1},"available":{"type":"integer","title":"Available","default":1},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_firm":{"type":"boolean","title":"Price Firm","default":false},"price_note":{"type":"string","title":"Price Note","default":""},"price_label":{"type":"string","title":"Price Label","default":""},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"perks":{"items":{"type":"string"},"type":"array","title":"Perks","default":[]},"seller":{"anyOf":[{"$ref":"#/components/schemas/app__routes_swapmeet__MemberCard"},{"type":"null"}]},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"is_gone":{"type":"boolean","title":"Is Gone","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["slug","kind","kind_label","emoji","category","category_label","title"],"title":"ListingCard"},"app__routes_swapmeet__ListingDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"kind":{"type":"string","title":"Kind"},"kind_label":{"type":"string","title":"Kind Label"},"emoji":{"type":"string","title":"Emoji"},"category":{"type":"string","title":"Category"},"category_label":{"type":"string","title":"Category Label"},"category_emoji":{"type":"string","title":"Category Emoji","default":""},"condition":{"type":"string","title":"Condition","default":"good"},"condition_label":{"type":"string","title":"Condition Label","default":""},"title":{"type":"string","title":"Title"},"market":{"type":"string","title":"Market","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"area_note":{"type":"string","title":"Area Note","default":""},"place":{"type":"string","title":"Place","default":""},"handoff":{"type":"string","title":"Handoff","default":"public-meet"},"handoff_label":{"type":"string","title":"Handoff Label","default":""},"quantity":{"type":"integer","title":"Quantity","default":1},"available":{"type":"integer","title":"Available","default":1},"price_cents":{"type":"integer","title":"Price Cents","default":0},"price_firm":{"type":"boolean","title":"Price Firm","default":false},"price_note":{"type":"string","title":"Price Note","default":""},"price_label":{"type":"string","title":"Price Label","default":""},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"perks":{"items":{"type":"string"},"type":"array","title":"Perks","default":[]},"seller":{"anyOf":[{"$ref":"#/components/schemas/app__routes_swapmeet__MemberCard"},{"type":"null"}]},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"is_gone":{"type":"boolean","title":"Is Gone","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"about":{"type":"string","title":"About","default":""},"faults":{"type":"string","title":"Faults","default":""},"hidden_reason":{"type":"string","title":"Hidden Reason","default":""},"reviews":{"items":{"$ref":"#/components/schemas/app__routes_swapmeet__ReviewOut"},"type":"array","title":"Reviews","default":[]},"mine":{"type":"boolean","title":"Mine","default":false},"can_claim":{"type":"boolean","title":"Can Claim","default":false},"claim_blocked":{"type":"string","title":"Claim Blocked","default":""},"claim_blocked_by":{"type":"string","title":"Claim Blocked By","default":""},"my_claim_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"My Claim Id"}},"type":"object","required":["slug","kind","kind_label","emoji","category","category_label","title"],"title":"ListingDetail"},"app__routes_swapmeet__ListingIn":{"properties":{"kind":{"type":"string","title":"Kind","default":"sale"},"category":{"type":"string","title":"Category","default":"other"},"condition":{"type":"string","title":"Condition","default":"good"},"title":{"type":"string","maxLength":140,"title":"Title","default":""},"about":{"type":"string","maxLength":2000,"title":"About","default":""},"faults":{"type":"string","maxLength":1000,"title":"Faults","default":""},"quantity":{"type":"integer","maximum":999.0,"minimum":1.0,"title":"Quantity","default":1},"market":{"type":"string","maxLength":120,"title":"Market","default":""},"city":{"type":"string","maxLength":120,"title":"City","default":""},"region":{"type":"string","maxLength":40,"title":"Region","default":""},"postal":{"type":"string","maxLength":20,"title":"Postal","default":""},"area_note":{"type":"string","maxLength":200,"title":"Area Note","default":""},"handoff":{"type":"string","title":"Handoff","default":"public-meet"},"meet_address":{"type":"string","maxLength":300,"title":"Meet Address","default":""},"meet_notes":{"type":"string","maxLength":600,"title":"Meet Notes","default":""},"price_cents":{"type":"integer","maximum":5000000.0,"minimum":0.0,"title":"Price Cents","default":0},"price_firm":{"type":"boolean","title":"Price Firm","default":false},"price_note":{"type":"string","maxLength":300,"title":"Price Note","default":""},"pay_via":{"items":{"type":"string"},"type":"array","title":"Pay Via","default":[]},"pay_handle":{"type":"string","maxLength":200,"title":"Pay Handle","default":""},"perks":{"items":{"type":"string"},"type":"array","title":"Perks","default":[]},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","title":"ListingIn"},"app__routes_swapmeet__ListingPage":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"scope":{"type":"string","title":"Scope"},"market":{"type":"string","title":"Market","default":""},"market_name":{"type":"string","title":"Market Name","default":""},"counts":{"type":"object","title":"Counts","default":{}},"items":{"items":{"$ref":"#/components/schemas/app__routes_swapmeet__ListingCard"},"type":"array","title":"Items","default":[]}},"type":"object","required":["total","page","per_page","scope"],"title":"ListingPage"},"app__routes_swapmeet__MemberCard":{"properties":{"id":{"type":"integer","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"type":"string","title":"Avatar Url","default":""},"city":{"type":"string","title":"City","default":""},"region":{"type":"string","title":"Region","default":""},"about":{"type":"string","title":"About","default":""},"member_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Since"},"email_verified":{"type":"boolean","title":"Email Verified","default":false},"deals_sold":{"type":"integer","title":"Deals Sold","default":0},"deals_bought":{"type":"integer","title":"Deals Bought","default":0},"things_given":{"type":"integer","title":"Things Given","default":0},"seller_reviews":{"type":"integer","title":"Seller Reviews","default":0},"seller_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Seller Rating"},"buyer_reviews":{"type":"integer","title":"Buyer Reviews","default":0},"buyer_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Buyer Rating"}},"type":"object","required":["id","display_name"],"title":"MemberCard","description":"A member, as Swap Meet shows them — the membership card plus what this\nmodule knows. No email, ever: a seller learns how to reach a buyer when\nthey confirm the claim, not while they are reading their inbox."},"app__routes_swapmeet__Meta":{"properties":{"kinds":{"type":"object","title":"Kinds"},"categories":{"type":"object","title":"Categories"},"conditions":{"type":"object","title":"Conditions"},"handoffs":{"type":"object","title":"Handoffs"},"perks":{"type":"object","title":"Perks"},"pay_methods":{"type":"object","title":"Pay Methods"},"prohibited":{"type":"object","title":"Prohibited"},"report_reasons":{"type":"object","title":"Report Reasons"},"agreement_version":{"type":"string","title":"Agreement Version"},"max_listings":{"type":"integer","title":"Max Listings"},"max_quantity":{"type":"integer","title":"Max Quantity"},"max_price_cents":{"type":"integer","title":"Max Price Cents"}},"type":"object","required":["kinds","categories","conditions","handoffs","perks","pay_methods","prohibited","report_reasons","agreement_version","max_listings","max_quantity","max_price_cents"],"title":"Meta"},"app__routes_swapmeet__ReportIn":{"properties":{"reason":{"type":"string","title":"Reason","default":"other"},"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"type":"object","title":"ReportIn"},"app__routes_swapmeet__ReviewIn":{"properties":{"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating","default":5},"body":{"type":"string","maxLength":1500,"title":"Body","default":""},"as_described":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"As Described"}},"type":"object","title":"ReviewIn"},"app__routes_swapmeet__ReviewOut":{"properties":{"id":{"type":"integer","title":"Id"},"direction":{"type":"string","title":"Direction"},"rating":{"type":"integer","title":"Rating"},"body":{"type":"string","title":"Body"},"as_described":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"As Described"},"author":{"anyOf":[{"$ref":"#/components/schemas/app__routes_swapmeet__MemberCard"},{"type":"null"}]},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","direction","rating","body"],"title":"ReviewOut"},"app__routes_swapmeet__SignIn":{"properties":{"version":{"type":"string","title":"Version"}},"type":"object","required":["version"],"title":"SignIn"},"app__routes_swapmeet__Stats":{"properties":{"market":{"type":"string","title":"Market","default":""},"local":{"type":"integer","title":"Local","default":0},"state":{"type":"integer","title":"State","default":0},"nationwide":{"type":"integer","title":"Nationwide","default":0},"sellers":{"type":"integer","title":"Sellers","default":0},"free_now":{"type":"integer","title":"Free Now","default":0},"deals_done":{"type":"integer","title":"Deals Done","default":0}},"type":"object","title":"Stats"},"app__routes_taxi__ClaimIn":{"properties":{"seats":{"type":"integer","title":"Seats","default":1},"message":{"type":"string","title":"Message","default":""},"contact_phone":{"type":"string","title":"Contact Phone","default":""},"contribution_cents":{"type":"integer","title":"Contribution Cents","default":0}},"type":"object","title":"ClaimIn"},"app__routes_taxi__ClaimOut":{"properties":{"id":{"type":"integer","title":"Id"},"ride_code":{"type":"string","title":"Ride Code"},"status":{"type":"string","title":"Status"},"seats":{"type":"integer","title":"Seats"},"message":{"type":"string","title":"Message"},"claimant_id":{"type":"integer","title":"Claimant Id"},"claimant_name":{"type":"string","title":"Claimant Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"details":{"anyOf":[{"$ref":"#/components/schemas/RideDetails"},{"type":"null"}]}},"type":"object","required":["id","ride_code","status","seats","message","claimant_id","claimant_name","created_at"],"title":"ClaimOut"},"app__routes_taxi__Desk":{"properties":{"driver":{"anyOf":[{"$ref":"#/components/schemas/app__routes_taxi__DriverOut"},{"type":"null"}]},"posted":{"items":{"$ref":"#/components/schemas/RideCard"},"type":"array","title":"Posted"},"claims":{"items":{"$ref":"#/components/schemas/app__routes_taxi__ClaimOut"},"type":"array","title":"Claims"},"signed_rider":{"type":"boolean","title":"Signed Rider"},"signed_driver":{"type":"boolean","title":"Signed Driver"},"money_lane_open":{"type":"boolean","title":"Money Lane Open"}},"type":"object","required":["driver","posted","claims","signed_rider","signed_driver","money_lane_open"],"title":"Desk"},"app__routes_taxi__DriverIn":{"properties":{"vehicle_make":{"type":"string","title":"Vehicle Make","default":""},"vehicle_model":{"type":"string","title":"Vehicle Model","default":""},"vehicle_color":{"type":"string","title":"Vehicle Color","default":""},"vehicle_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vehicle Year"},"plate":{"type":"string","title":"Plate","default":""},"seats_default":{"type":"integer","title":"Seats Default","default":1},"notes":{"type":"string","title":"Notes","default":""},"pay_methods":{"items":{"type":"string"},"type":"array","title":"Pay Methods","default":[]},"pay_handle":{"type":"string","title":"Pay Handle","default":""}},"type":"object","title":"DriverIn"},"app__routes_taxi__DriverOut":{"properties":{"vehicle_make":{"type":"string","title":"Vehicle Make"},"vehicle_model":{"type":"string","title":"Vehicle Model"},"vehicle_color":{"type":"string","title":"Vehicle Color"},"vehicle_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vehicle Year"},"seats_default":{"type":"integer","title":"Seats Default"},"notes":{"type":"string","title":"Notes"},"attested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Attested At"},"attestation_current":{"type":"boolean","title":"Attestation Current"},"pay_methods":{"items":{"type":"string"},"type":"array","title":"Pay Methods"},"has_pay_handle":{"type":"boolean","title":"Has Pay Handle"},"money_lane_open":{"type":"boolean","title":"Money Lane Open"}},"type":"object","required":["vehicle_make","vehicle_model","vehicle_color","vehicle_year","seats_default","notes","attested_at","attestation_current","pay_methods","has_pay_handle","money_lane_open"],"title":"DriverOut"},"app__routes_taxi__ReportIn":{"properties":{"reason":{"type":"string","title":"Reason","default":"other"},"body":{"type":"string","title":"Body","default":""}},"type":"object","title":"ReportIn"},"app__routes_trading_post__CorrectionIn":{"properties":{"note":{"type":"string","maxLength":4000,"minLength":10,"title":"Note"}},"type":"object","required":["note"],"title":"CorrectionIn"},"app__routes_tvguide__CorrectionIn":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"place":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place"},"sponsor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sponsor"},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator"},"remarks":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remarks"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"}},"type":"object","title":"CorrectionIn"},"app__routes_tvguide__EntryIn":{"properties":{"title":{"type":"string","title":"Title"},"started_at":{"type":"string","title":"Started At"},"ended_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ended At"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"place":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place"},"sponsor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sponsor"},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator"},"remarks":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remarks"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"}},"type":"object","required":["title","started_at"],"title":"EntryIn"},"app__routes_tweeter__ClaimIn":{"properties":{"handle":{"type":"string","title":"Handle"},"display_name":{"type":"string","title":"Display Name","default":""}},"type":"object","required":["handle"],"title":"ClaimIn"},"app__routes_tweeter__ProfileIn":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"}},"type":"object","title":"ProfileIn"},"app__routes_tweeter__ReportIn":{"properties":{"reason":{"type":"string","title":"Reason","default":"other"},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"ReportIn"},"app__schemas__AgencyOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"jurisdiction_type":{"type":"string","title":"Jurisdiction Type"},"records_request_email":{"type":"string","title":"Records Request Email"},"contact_name":{"type":"string","title":"Contact Name"}},"type":"object","required":["id","name","jurisdiction_type","records_request_email","contact_name"],"title":"AgencyOut"},"app__schemas__CommentOut":{"properties":{"id":{"type":"integer","title":"Id"},"body":{"type":"string","title":"Body"},"author":{"anyOf":[{"$ref":"#/components/schemas/AuthorOut"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","body","author","created_at"],"title":"CommentOut"},"app__schemas__ListingOut":{"properties":{"id":{"type":"integer","title":"Id"},"section":{"type":"string","title":"Section"},"kind":{"type":"string","title":"Kind"},"name":{"type":"string","title":"Name"},"tagline":{"type":"string","title":"Tagline"},"description":{"type":"string","title":"Description"},"hours":{"type":"string","title":"Hours"},"node_id":{"type":"string","title":"Node Id"},"phone":{"type":"string","title":"Phone","default":""},"is_featured":{"type":"boolean","title":"Is Featured"},"claimed_by":{"anyOf":[{"$ref":"#/components/schemas/AuthorOut"},{"type":"null"}]},"node":{"anyOf":[{"$ref":"#/components/schemas/NodeStatusOut"},{"type":"null"}]},"subtitle":{"type":"string","title":"Subtitle","default":""},"instagram_url":{"type":"string","title":"Instagram Url","default":""},"facebook_url":{"type":"string","title":"Facebook Url","default":""},"website_url":{"type":"string","title":"Website Url","default":""},"tweeter_handle":{"type":"string","title":"Tweeter Handle","default":""},"instag_handle":{"type":"string","title":"Instag Handle","default":""},"livestream_url":{"type":"string","title":"Livestream Url","default":""},"master_listing_url":{"type":"string","title":"Master Listing Url","default":""},"theme_name":{"type":"string","title":"Theme Name","default":""},"theme_css":{"type":"string","title":"Theme Css","default":""},"theme_html":{"type":"string","title":"Theme Html","default":""},"custom_domain":{"type":"string","title":"Custom Domain","default":""},"page_theme":{"type":"string","title":"Page Theme","default":""}},"type":"object","required":["id","section","kind","name","tagline","description","hours","node_id","is_featured"],"title":"ListingOut"},"app__schemas__PostDetail":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"author":{"anyOf":[{"$ref":"#/components/schemas/AuthorOut"},{"type":"null"}]},"is_pinned":{"type":"boolean","title":"Is Pinned"},"is_locked":{"type":"boolean","title":"Is Locked"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"comment_count":{"type":"integer","title":"Comment Count","default":0},"like_count":{"type":"integer","title":"Like Count","default":0},"body":{"type":"string","title":"Body"},"board":{"$ref":"#/components/schemas/BoardOut"},"liked_by_me":{"type":"boolean","title":"Liked By Me","default":false}},"type":"object","required":["id","title","author","is_pinned","is_locked","created_at","body","board"],"title":"PostDetail"},"app__schemas__PostEdit":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":300,"minLength":1},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Body"}},"type":"object","title":"PostEdit","description":"Author (or admin) edit of a post's content."},"app__schemas__RegisterIn":{"properties":{"email":{"type":"string","maxLength":320,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"},"display_name":{"type":"string","maxLength":120,"title":"Display Name","default":""}},"type":"object","required":["email","password"],"title":"RegisterIn"},"app__schemas__SectionOut":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"kind":{"type":"string","title":"Kind"},"emoji":{"type":"string","title":"Emoji"},"blurb":{"type":"string","title":"Blurb"}},"type":"object","required":["id","slug","name","kind","emoji","blurb"],"title":"SectionOut"},"app__schemas__StateOut":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"market_count":{"type":"integer","title":"Market Count"},"active_count":{"type":"integer","title":"Active Count","default":0}},"type":"object","required":["code","name","market_count"],"title":"StateOut"},"app__worldmapper__api_publish__LineIn":{"properties":{"coordinates":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Coordinates"},"samples":{"type":"integer","title":"Samples","default":200}},"type":"object","required":["coordinates"],"title":"LineIn"},"app__worldmapper__api_publish__PublishIn":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title","default":""},"public":{"type":"boolean","title":"Public","default":true},"download_allowed":{"type":"boolean","title":"Download Allowed","default":false}},"type":"object","title":"PublishIn"},"app__worldmapper__api_runs__RunOut":{"properties":{"id":{"type":"integer","title":"Id"},"ref":{"type":"string","title":"Ref"},"seq":{"type":"integer","title":"Seq"},"mission_id":{"type":"integer","title":"Mission Id"},"engine":{"type":"string","title":"Engine"},"engine_version":{"type":"string","title":"Engine Version"},"container_image":{"type":"string","title":"Container Image"},"params":{"type":"object","title":"Params"},"input_file_ids":{"items":{},"type":"array","title":"Input File Ids"},"input_hashes":{"items":{},"type":"array","title":"Input Hashes"},"input_manifest_sha256":{"type":"string","title":"Input Manifest Sha256"},"crs":{"type":"string","title":"Crs"},"vertical_datum":{"type":"string","title":"Vertical Datum"},"units":{"type":"string","title":"Units"},"gcp_ids":{"items":{},"type":"array","title":"Gcp Ids"},"checkpoint_ids":{"items":{},"type":"array","title":"Checkpoint Ids"},"status":{"type":"string","title":"Status"},"progress_pct":{"type":"integer","title":"Progress Pct"},"progress_note":{"type":"string","title":"Progress Note"},"worker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worker"},"warnings":{"items":{},"type":"array","title":"Warnings"},"error":{"type":"string","title":"Error"},"resource_use":{"type":"object","title":"Resource Use"},"accuracy":{"type":"object","title":"Accuracy"},"accuracy_class":{"type":"string","title":"Accuracy Class"},"operator_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Operator User Id"},"parent_run_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Run Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"outputs":{"items":{"$ref":"#/components/schemas/OutputOut"},"type":"array","title":"Outputs"}},"type":"object","required":["id","ref","seq","mission_id","engine","engine_version","container_image","params","input_file_ids","input_hashes","input_manifest_sha256","crs","vertical_datum","units","gcp_ids","checkpoint_ids","status","progress_pct","progress_note","worker","warnings","error","resource_use","accuracy","accuracy_class","operator_user_id","parent_run_id","created_at","started_at","finished_at"],"title":"RunOut"},"app__worldmapper__api_workers__ClaimIn":{"properties":{"engines":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Engines"},"max_images":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Images"}},"type":"object","title":"ClaimIn"},"app__worldmapper__api_workers__RegisterIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"capabilities":{"type":"object","title":"Capabilities"},"engines":{"items":{"type":"string"},"type":"array","title":"Engines"},"version":{"type":"string","title":"Version","default":""}},"type":"object","required":["name"],"title":"RegisterIn"}}}}