{"openapi":"3.1.0","info":{"title":"Lumify Sports Intelligence API","description":"\nLumify is an agent-ready sports intelligence API: schedules, live scores, odds,\npublic betting splits, and AI-powered bet intelligence (confidence scores,\nsignal breakdowns, and LLM-generated narratives) across MLB, tennis, soccer\n(MLS, EPL, La Liga, Serie A, Bundesliga, Ligue 1, and UEFA\nChampions League), NFL, NCAAF, NCAAB, NBA, and NHL.\n\n## Authentication\nAll `/v1/*` endpoints require a Bearer API key:\n\n    Authorization: Bearer lmfy-xxxxxx.yyyyyyyy...\n\nCreate an account and first key in the [dashboard](https://lumify.ai/api-keys);\nsubsequent keys and credit top-ups are available via `/api/agent/*`. Errors follow a\nsingle [envelope](https://lumify.ai/docs/reference#error-codes) with a machine-readable\n`error.code`. Billing blocks return `402` (`insufficient_credits`,\n`daily_credit_cap_exceeded`, or `payment_failed`) — not `401`. Responses include\n`X-RateLimit-*` and `X-Credits-*` headers.\n\n## For AI agents\n- Overview: [/llms.txt](https://lumify.ai/llms.txt)\n- GEO orientation (coverage, pricing, FAQ): [/llms-full.txt](https://lumify.ai/llms-full.txt)\n- Full technical reference: [/docs/llms-full.txt](https://lumify.ai/docs/llms-full.txt)\n- Model Context Protocol server: connect to `https://lumify.ai/mcp`\n- OpenAPI schema: [/openapi.json](https://lumify.ai/openapi.json)\n","contact":{"name":"Lumify Support","url":"https://lumify.ai/contact-us","email":"support@lumify.ai"},"license":{"name":"Terms of Service","url":"https://lumify.ai/terms-of-service"},"version":"1.0.0"},"paths":{"/v1/health":{"get":{"tags":["health"],"summary":"Health","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/login":{"get":{"tags":["auth"],"summary":"Login Page","operationId":"login_page_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["auth"],"summary":"Login Submit","operationId":"login_submit_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_submit_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logout":{"get":{"tags":["auth"],"summary":"Logout","operationId":"logout_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/register":{"get":{"tags":["auth"],"summary":"Register Page","operationId":"register_page_register_get","parameters":[{"name":"plan","in":"query","required":false,"schema":{"type":"string","default":"","title":"Plan"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["auth"],"summary":"Register Submit","operationId":"register_submit_register_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_register_submit_register_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/forgot-password":{"get":{"tags":["auth"],"summary":"Forgot Password Page","operationId":"forgot_password_page_forgot_password_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["auth"],"summary":"Forgot Password Submit","operationId":"forgot_password_submit_forgot_password_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_forgot_password_submit_forgot_password_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reset-password":{"get":{"tags":["auth"],"summary":"Reset Password Page","operationId":"reset_password_page_reset_password_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["auth"],"summary":"Reset Password Submit","operationId":"reset_password_submit_reset_password_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_reset_password_submit_reset_password_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/verify-email":{"get":{"tags":["auth"],"summary":"Verify Email","operationId":"verify_email_verify_email_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","operationId":"resend_verification_resend_verification_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/github/start":{"get":{"tags":["oauth"],"summary":"Github Oauth Start","description":"Begin the GitHub star verification flow.","operationId":"github_oauth_start_oauth_github_start_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/github/callback":{"get":{"tags":["oauth"],"summary":"Github Oauth Callback","description":"Finish the GitHub star verification flow and grant the reward.\n\nSession is optional — customer_id comes from the signed state. If a\nsession *is* present it must match the state binding (defence in depth).","operationId":"github_oauth_callback_oauth_github_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard":{"get":{"tags":["app"],"summary":"Dashboard","operationId":"dashboard_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account":{"get":{"tags":["app"],"summary":"Account Page","operationId":"account_page_account_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account/profile":{"post":{"tags":["app"],"summary":"Account Profile Update","operationId":"account_profile_update_account_profile_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_account_profile_update_account_profile_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/organization":{"post":{"tags":["app"],"summary":"Account Organization Update","operationId":"account_organization_update_account_organization_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_account_organization_update_account_organization_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/password":{"post":{"tags":["app"],"summary":"Account Password Change","operationId":"account_password_change_account_password_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_account_password_change_account_password_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys":{"get":{"tags":["app"],"summary":"Api Keys Page","operationId":"api_keys_page_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["app"],"summary":"Api Key Create","operationId":"api_key_create_api_keys_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_api_key_create_api_keys_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys/{key_id}/reveal":{"get":{"tags":["app"],"summary":"Api Key Reveal","operationId":"api_key_reveal_api_keys__key_id__reveal_get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys/{key_id}/revoke":{"post":{"tags":["app"],"summary":"Api Key Revoke","operationId":"api_key_revoke_api_keys__key_id__revoke_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing":{"get":{"tags":["app"],"summary":"Billing Page","operationId":"billing_page_billing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/billing/invoices/{invoice_id}/receipt":{"get":{"tags":["app"],"summary":"Billing Invoice Receipt","description":"Stream the Stripe invoice PDF as a direct download (no redirect tab).","operationId":"billing_invoice_receipt_billing_invoices__invoice_id__receipt_get","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"integer","title":"Invoice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/auto-recharge":{"post":{"tags":["app"],"summary":"Billing Auto Recharge","operationId":"billing_auto_recharge_billing_auto_recharge_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_billing_auto_recharge_billing_auto_recharge_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/subscribe":{"post":{"tags":["app"],"summary":"Billing Subscribe","operationId":"billing_subscribe_billing_subscribe_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_billing_subscribe_billing_subscribe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/setup-intent":{"post":{"tags":["app"],"summary":"Billing Setup Intent","operationId":"billing_setup_intent_billing_setup_intent_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/payment-method":{"post":{"tags":["app"],"summary":"Billing Attach Payment Method","operationId":"billing_attach_payment_method_billing_payment_method_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/cancel":{"post":{"tags":["app"],"summary":"Billing Cancel Subscription","operationId":"billing_cancel_subscription_billing_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/payment-method/remove":{"post":{"tags":["app"],"summary":"Billing Remove Payment Method","operationId":"billing_remove_payment_method_billing_payment_method_remove_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/coupon":{"post":{"tags":["app"],"summary":"Billing Apply Coupon","operationId":"billing_apply_coupon_billing_coupon_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_billing_apply_coupon_billing_coupon_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/portal":{"get":{"tags":["app"],"summary":"Billing Portal","operationId":"billing_portal_billing_portal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/usage":{"get":{"tags":["app"],"summary":"Usage Page","operationId":"usage_page_usage_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"key_id","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analytics":{"get":{"tags":["app"],"summary":"Analytics Page","operationId":"analytics_page_analytics_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/playground":{"get":{"tags":["app"],"summary":"Playground Page","operationId":"playground_page_playground_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/onboarding/docs-visit":{"post":{"tags":["app"],"summary":"Onboarding Docs Visit","description":"Grant the +50 docs_visit reward when a logged-in user loads /docs*.\n\nFired by an authenticated keepalive fetch from the docs templates\n(public/partials/_docs_scripts.html). This route has no rate limit of\nits own (session-authenticated requests bypass RateLimitMiddleware\nentirely, same as every other browser-session route), and the\nsessionStorage dedup on the client is only a soft, per-tab hint — a new\ntab, cleared storage, or incognito all cause a fresh beacon. So we\npre-check status via get_progress() and short-circuit before ever\ncalling grant_reward(): once granted, a repeat beacon costs one cheap\nSELECT instead of a doomed INSERT + rollback + diagnostic SELECT.","operationId":"onboarding_docs_visit_onboarding_docs_visit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/users":{"get":{"tags":["admin"],"summary":"Admin Users","operationId":"admin_users_admin_users_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"role","in":"query","required":false,"schema":{"type":"string","default":"","title":"Role"}},{"name":"active","in":"query","required":false,"schema":{"type":"string","default":"","title":"Active"}},{"name":"employee","in":"query","required":false,"schema":{"type":"string","default":"","title":"Employee"}},{"name":"msg","in":"query","required":false,"schema":{"type":"string","default":"","title":"Msg"}},{"name":"msg_type","in":"query","required":false,"schema":{"type":"string","default":"success","title":"Msg Type"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/detail":{"get":{"tags":["admin"],"summary":"Admin User Detail","operationId":"admin_user_detail_admin_users__user_id__detail_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"}}}}}}},"/admin/users/{user_id}/revoke-sessions":{"post":{"tags":["admin"],"summary":"Admin User Revoke Sessions","operationId":"admin_user_revoke_sessions_admin_users__user_id__revoke_sessions_post","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"}}}}}}},"/admin/users/{user_id}/password-reset":{"post":{"tags":["admin"],"summary":"Admin User Password Reset","description":"Admin-initiated password reset — sends reset email regardless of user status.","operationId":"admin_user_password_reset_admin_users__user_id__password_reset_post","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"}}}}}}},"/admin/users/{user_id}/resend-verification":{"post":{"tags":["admin"],"summary":"Admin User Resend Verification","description":"Admin-initiated resend of the signup verification email.","operationId":"admin_user_resend_verification_admin_users__user_id__resend_verification_post","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"}}}}}}},"/admin/users/{user_id}/delete":{"post":{"tags":["admin"],"summary":"Admin User Delete","description":"Permanently delete a user, their sessions, and deactivate their API keys.","operationId":"admin_user_delete_admin_users__user_id__delete_post","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"}}}}}}},"/admin/users/{user_id}/staff-role":{"post":{"tags":["admin"],"summary":"Admin User Staff Role","description":"Set a user's Lumify staff access tier: none, limited, or full.\n\nGranting/revoking staff access at all — or changing between limited and\nfull — is itself a privilege-escalation action, so this endpoint (unlike\nthe admin Users page in general) requires require_full_admin.","operationId":"admin_user_staff_role_admin_users__user_id__staff_role_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_user_staff_role_admin_users__user_id__staff_role_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/rate-limit":{"post":{"tags":["admin"],"summary":"Admin User Rate Limit","description":"Set or clear a subscription-level rate limit override (req/min) for a user's account.","operationId":"admin_user_rate_limit_admin_users__user_id__rate_limit_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_user_rate_limit_admin_users__user_id__rate_limit_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/role":{"post":{"tags":["admin"],"summary":"Admin User Role","operationId":"admin_user_role_admin_users__user_id__role_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_user_role_admin_users__user_id__role_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/toggle":{"post":{"tags":["admin"],"summary":"Admin User Toggle","operationId":"admin_user_toggle_admin_users__user_id__toggle_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_user_toggle_admin_users__user_id__toggle_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/coupons":{"get":{"tags":["admin"],"summary":"Admin Coupons","operationId":"admin_coupons_admin_coupons_get","parameters":[{"name":"msg","in":"query","required":false,"schema":{"type":"string","default":"","title":"Msg"}},{"name":"msg_type","in":"query","required":false,"schema":{"type":"string","default":"success","title":"Msg Type"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/coupons/create":{"post":{"tags":["admin"],"summary":"Admin Coupon Create","operationId":"admin_coupon_create_admin_coupons_create_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_coupon_create_admin_coupons_create_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/coupons/{coupon_id}/toggle":{"post":{"tags":["admin"],"summary":"Admin Coupon Toggle","operationId":"admin_coupon_toggle_admin_coupons__coupon_id__toggle_post","parameters":[{"name":"coupon_id","in":"path","required":true,"schema":{"type":"integer","title":"Coupon Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/coupons/{coupon_id}/delete":{"post":{"tags":["admin"],"summary":"Admin Coupon Delete","operationId":"admin_coupon_delete_admin_coupons__coupon_id__delete_post","parameters":[{"name":"coupon_id","in":"path","required":true,"schema":{"type":"integer","title":"Coupon Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/security":{"get":{"tags":["admin"],"summary":"Admin Security","operationId":"admin_security_admin_security_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"severity","in":"query","required":false,"schema":{"type":"string","default":"","title":"Severity"}},{"name":"event_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Event Type"}},{"name":"ip","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ip"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/plans":{"get":{"tags":["admin"],"summary":"Admin Plans","operationId":"admin_plans_admin_plans_get","parameters":[{"name":"msg","in":"query","required":false,"schema":{"type":"string","default":"","title":"Msg"}},{"name":"msg_type","in":"query","required":false,"schema":{"type":"string","default":"success","title":"Msg Type"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/plans/{plan_id}/update":{"post":{"tags":["admin"],"summary":"Admin Plans Update","operationId":"admin_plans_update_admin_plans__plan_id__update_post","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_plans_update_admin_plans__plan_id__update_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/plans/{plan_id}/delete":{"post":{"tags":["admin"],"summary":"Admin Plans Delete","operationId":"admin_plans_delete_admin_plans__plan_id__delete_post","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings":{"get":{"tags":["admin"],"summary":"Admin Settings","operationId":"admin_settings_admin_settings_get","parameters":[{"name":"msg","in":"query","required":false,"schema":{"type":"string","default":"","title":"Msg"}},{"name":"msg_type","in":"query","required":false,"schema":{"type":"string","default":"success","title":"Msg Type"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/free-trial-daily-cap":{"post":{"tags":["admin"],"summary":"Admin Update Free Trial Daily Cap","description":"Update the free-trial rolling-24h daily credit cap (system_settings).\n\nMirrors the hot-update pattern documented in core/billing/spend_caps.py —\nthis UPDATEs the same row that a manual SQL statement would, just from the\nadmin UI instead of a SQL client.","operationId":"admin_update_free_trial_daily_cap_admin_settings_free_trial_daily_cap_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_update_free_trial_daily_cap_admin_settings_free_trial_daily_cap_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers":{"get":{"tags":["admin"],"summary":"Admin Customers","operationId":"admin_customers_admin_customers_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"tier","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tier"}},{"name":"verified","in":"query","required":false,"schema":{"type":"string","default":"","title":"Verified"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/detail":{"get":{"tags":["admin"],"summary":"Admin Customer Detail","operationId":"admin_customer_detail_admin_customers__customer_id__detail_get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/usage":{"get":{"tags":["admin"],"summary":"Admin Customer Usage","description":"Usage-over-time + current billing period credit spend for one customer.\n\nPowers the \"View Usage & Performance\" panel launched from the Customer\ndetail offcanvas. Two distinct pictures, both scoped to this customer:\n  - daily_trend: product calls (REST + MCP tools/call), handshake\n    volume, errors/latency/credits from api_usage_log over a selectable\n    rolling window — \"performance over time\". Handshake initialize/\n    tools/list/ping is kept as a separate series so reconnect storms\n    don't look like product usage.\n  - billing_period / billing_period_daily: the exact credits picture the\n    customer sees on their own Dashboard (get_current_usage — same\n    credit_usage-backed source of truth used by the Customer panel's\n    credits bar), plus a day-by-day breakdown within that billing period.","operationId":"admin_customer_usage_admin_customers__customer_id__usage_get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","title":"Customer Id"}},{"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"}}}}}}},"/admin/customers/{customer_id}/entitlements":{"post":{"tags":["admin"],"summary":"Admin Customer Entitlements","operationId":"admin_customer_entitlements_admin_customers__customer_id__entitlements_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_customer_entitlements_admin_customers__customer_id__entitlements_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/name":{"post":{"tags":["admin"],"summary":"Admin Customer Name","description":"Override a customer's organization name (support / white-glove path).","operationId":"admin_customer_name_admin_customers__customer_id__name_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_customer_name_admin_customers__customer_id__name_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/exclude-from-analytics":{"post":{"tags":["admin"],"summary":"Admin Customer Exclude From Analytics","description":"Hide or show a customer on the platform-wide API Usage dashboard.\n\nDiagnostic / internal accounts generate real ``api_usage_log`` rows\n(including expected errors). Those rows stay for audit; this flag only\ndrops them from Admin → API Usage aggregates. Per-customer usage\npanels are unchanged.","operationId":"admin_customer_exclude_from_analytics_admin_customers__customer_id__exclude_from_analytics_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","title":"Customer Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_customer_exclude_from_analytics_admin_customers__customer_id__exclude_from_analytics_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/resend-verification":{"post":{"tags":["admin"],"summary":"Admin Customer Resend Verification","description":"Resend the signup verification email to a customer's owning user.\n\nJSON in/out (unlike the Users-page equivalent) because this is invoked\nfrom the Customer detail offcanvas via fetch(), the same pattern already\nused there for the rate-limit override save/clear actions.","operationId":"admin_customer_resend_verification_admin_customers__customer_id__resend_verification_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/customers/{customer_id}/delete":{"post":{"tags":["admin"],"summary":"Admin Customer Delete","description":"Soft-delete a customer and cascade: soft-delete users, cancel subscriptions, deactivate API keys.","operationId":"admin_customer_delete_admin_customers__customer_id__delete_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/usage":{"get":{"tags":["admin"],"summary":"Admin Usage","operationId":"admin_usage_admin_usage_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}},{"name":"customer_id","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/usage/customer-errors":{"get":{"tags":["admin"],"summary":"Admin Usage Customer Errors","description":"Recent failed calls for one customer — the drill-down behind the Top\nCustomers by Volume error counts, so \"3 errors\" is diagnosable without a\ndatabase console: which endpoint, what status, and when.\n\nEverything here — the status-code breakdown and the row list — is scoped\nto a single customer_id and only runs when an admin actually clicks an\nerror count, so page load never pays for it across every customer.","operationId":"admin_usage_customer_errors_admin_usage_customer_errors_get","parameters":[{"name":"customer_id","in":"query","required":true,"schema":{"type":"integer","title":"Customer Id"}},{"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"}}}}}}},"/admin/usage/customer-activity":{"get":{"tags":["admin"],"summary":"Admin Usage Customer Activity","description":"How one customer is actually using the API — the drill-down behind the\nTop Customers by Volume call count, so \"246 calls\" is diagnosable without\na database console: which endpoints, how often, and a recent sample of\nboth successful and failed requests.\n\nScoped to a single customer_id and only runs when an admin clicks the\nCalls count, mirroring admin_usage_customer_errors' lazy-load rationale.","operationId":"admin_usage_customer_activity_admin_usage_customer_activity_get","parameters":[{"name":"customer_id","in":"query","required":true,"schema":{"type":"integer","title":"Customer Id"}},{"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"}}}}}}},"/admin/onboarding-rewards":{"get":{"tags":["admin"],"summary":"Admin Onboarding Rewards","description":"Platform-wide onboarding reward grants, stuck pending rows, abuse flags.","operationId":"admin_onboarding_rewards_admin_onboarding_rewards_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/performance":{"get":{"tags":["admin"],"summary":"Admin Performance","operationId":"admin_performance_admin_performance_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pricing":{"get":{"tags":["admin"],"summary":"Admin Pricing","operationId":"admin_pricing_admin_pricing_get","parameters":[{"name":"msg","in":"query","required":false,"schema":{"type":"string","default":"","title":"Msg"}},{"name":"msg_type","in":"query","required":false,"schema":{"type":"string","default":"success","title":"Msg Type"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pricing/create":{"post":{"tags":["admin"],"summary":"Admin Pricing Create","operationId":"admin_pricing_create_admin_pricing_create_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_pricing_create_admin_pricing_create_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pricing/{config_id}/toggle":{"post":{"tags":["admin"],"summary":"Admin Pricing Toggle","operationId":"admin_pricing_toggle_admin_pricing__config_id__toggle_post","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pricing/{config_id}/update":{"post":{"tags":["admin"],"summary":"Admin Pricing Update","operationId":"admin_pricing_update_admin_pricing__config_id__update_post","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_pricing_update_admin_pricing__config_id__update_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pricing/actuals/save":{"post":{"tags":["admin"],"summary":"Admin Pricing Actuals Save","description":"Save or update an actual invoice amount for a vendor/month.","operationId":"admin_pricing_actuals_save_admin_pricing_actuals_save_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_pricing_actuals_save_admin_pricing_actuals_save_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/sports-schedule":{"get":{"tags":["admin"],"summary":"Admin Sports Schedule","description":"Thin wrapper around _admin_sports_schedule_impl so a crash between the\nfetch and the final render is still visible (Phase 0 perf-plan hardening —\nsee the sports-schedule-explorer-perf-plan canvas). The real handler's\nown admin.sports_schedule.{fetch,enrich,total} logs only fire on the\nhappy path; reindenting that whole ~250-line body under a try/finally\nto close that gap directly was judged too risky, so the guarantee lives\nhere instead, one call frame up, where it can't perturb the existing\nlogic at all.\n\nPhase 1: ``view`` / ``tz_offset`` default to None (param absent) so a\ncookie can supply the viewer's last preference before any DB/API work.","operationId":"admin_sports_schedule_admin_sports_schedule_get","parameters":[{"name":"sport","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Sport"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"group","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Group"}},{"name":"week","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Week"}},{"name":"view","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View"}},{"name":"day","in":"query","required":false,"schema":{"type":"string","default":"","title":"Day"}},{"name":"tz_offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tz Offset"}},{"name":"partial","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Partial"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/bet-intelligence":{"get":{"tags":["admin"],"summary":"Admin Bet Intelligence","operationId":"admin_bet_intelligence_admin_bet_intelligence_get","parameters":[{"name":"sport","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sport"}},{"name":"msg","in":"query","required":false,"schema":{"type":"string","default":"","title":"Msg"}},{"name":"msg_type","in":"query","required":false,"schema":{"type":"string","default":"success","title":"Msg Type"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/bet-intelligence/mode":{"post":{"tags":["admin"],"summary":"Admin Bet Intelligence Set Mode","description":"Upsert one (sport, league) row — same handler for editing an existing\nrow and adding a brand-new sport/league override, since set_mode() itself\nupserts. Promoting to 'full' (transition into full from any other mode,\nor a brand-new full row) requires a documented reason: it's the only mode\nthat spends on the Layer-2 deep-research validator.","operationId":"admin_bet_intelligence_set_mode_admin_bet_intelligence_mode_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_bet_intelligence_set_mode_admin_bet_intelligence_mode_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/bet-intelligence/kill-switch":{"post":{"tags":["admin"],"summary":"Admin Bet Intelligence Kill Switch","description":"Flip the global or a per-sport BI kill switch. Engaging (not\ndisengaging) always requires a reason and always pages Slack — this is\nthe highest-blast-radius control on the page, independent of whatever\nlumify_bi_config currently says.","operationId":"admin_bet_intelligence_kill_switch_admin_bet_intelligence_kill_switch_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_bet_intelligence_kill_switch_admin_bet_intelligence_kill_switch_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/events/{event_id}":{"get":{"tags":["admin"],"summary":"Admin Event Detail","description":"Same shape as GET /v1/events/{id}, without billing or API-key context.\n\nCalling ``get_event`` directly (dummy APIKey + BackgroundTasks) raised 500\non this admin inspector — use the shared builders instead.","operationId":"admin_event_detail_admin_events__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/events/{event_id}/intelligence":{"get":{"tags":["admin"],"summary":"Admin Event Intelligence","description":"Return the exact same payload as GET /v1/events/{id}/intelligence.\n\nUsed by the admin sports schedule page so the intel modal reflects what\nAPI clients actually receive, rather than a raw DB snapshot.\nRequires admin session auth — no API key needed.\n\n``?bookmaker=`` overlays a different book's live prices for legacy\n(points-engine) sports. For predictive-framework leagues (currently MLS)\nthe param is ignored — assessments are priced only against the system\ndefault book, and overlaying a different book's quote would disagree with\nthe published probability / fair_price.\n\nDelegates to _fetch_intelligence_payload rather than re-implementing the\nquery/formatting logic — a hand-maintained duplicate here is exactly what\npreviously let this route hardcode the tennis/default signal schema for\nevery sport (see _signal_schema_for's docstring) and would otherwise show\na stale lumify_match_confidence view for predictive-migrated leagues\n(e.g. MLS) instead of lumify_assessments.","operationId":"admin_event_intelligence_admin_events__event_id__intelligence_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"bookmaker","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bookmaker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/events/{event_id}/odds":{"get":{"tags":["admin"],"summary":"Admin Event Odds","description":"Return the same payload as GET /v1/events/{id}/odds (no API key required).\n\nOptional ?bookmaker= filters to one book (or comma-separated / all), matching\nthe public odds endpoint. Defaults to all ingested books when omitted so the\nadmin schedule can still inspect the full set when needed.","operationId":"admin_event_odds_admin_events__event_id__odds_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"bookmaker","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bookmaker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/events/{event_id}/player-props":{"get":{"tags":["admin"],"summary":"Admin Event Player Props","description":"Same shape as GET /v1/events/{id}/player-props (admin session, no credits).\n\nUsed by the sports-schedule Odds submenu. Unsupported sports return\n``available: false`` with ``unsupported: true`` instead of HTTP 400 so the\ninspector can show an empty state without treating tennis/soccer as an error.","operationId":"admin_event_player_props_admin_events__event_id__player_props_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/events/{event_id}/period-odds":{"get":{"tags":["admin"],"summary":"Admin Event Period Odds","description":"Same shape as GET /v1/events/{id}/period-odds (admin session, no credits).\n\nUnsupported sports return ``available: false`` with ``unsupported: true``\ninstead of HTTP 400 so the Odds submenu can show an empty state.","operationId":"admin_event_period_odds_admin_events__event_id__period_odds_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/events/{event_id}/team-props":{"get":{"tags":["admin"],"summary":"Admin Event Team Props","description":"Same shape as GET /v1/events/{id}/team-props (admin session, no credits).\n\nUnsupported sports return ``available: false`` with ``unsupported: true``\ninstead of HTTP 400 so the Odds submenu can show an empty state.","operationId":"admin_event_team_props_admin_events__event_id__team_props_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/events/{event_id}/splits":{"get":{"tags":["admin"],"summary":"Admin Event Splits","description":"Return the exact same payload as GET /v1/events/{id}/splits.\n\nUsed by the admin sports schedule page so the splits modal panel reflects\nwhat API clients actually receive.  Requires admin session auth.","operationId":"admin_event_splits_admin_events__event_id__splits_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/events/{event_id}/stats":{"get":{"tags":["admin"],"summary":"Admin Event Stats","description":"Return the same payload as GET /v1/events/{id}/stats (admin session, no credits).\n\nUsed by the admin sports schedule intelligence modal Stats tab so the panel\nreflects what API clients receive from the public stats endpoint.","operationId":"admin_event_stats_admin_events__event_id__stats_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/events/{event_id}/injuries":{"get":{"tags":["admin"],"summary":"Admin Event Injuries","description":"Return the same payload as GET /v1/events/{id}/injuries (admin session, no credits).\n\nUsed by the admin sports schedule intelligence modal Injuries tab so the\npanel reflects what API clients receive from the public injuries endpoint.\nBeta coverage (NFL/MLB today) is a property of the payload itself\n(``available``) — this proxy applies no additional sport gating.","operationId":"admin_event_injuries_admin_events__event_id__injuries_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"exclude_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exclude Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/predictive":{"get":{"tags":["admin"],"summary":"Admin Predictive","description":"Claim-ladder scorecard: coverage → independence → live CLV → realized → claim.\n\nMeasurement surface for +EV progress. Enablement stays on /admin/bet-intelligence;\npipeline liveness stays on /admin/job-health. ``sport`` is sport-agnostic\n(see SPORT_REGISTRY); soccer and MLB are enabled today — an unenabled/unknown\n``sport`` renders a \"coming soon\" tab, not an error.","operationId":"admin_predictive_admin_predictive_get","parameters":[{"name":"sport","in":"query","required":false,"schema":{"type":"string","default":"soccer","title":"Sport"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/predictive/status.json":{"get":{"tags":["admin"],"summary":"Admin Predictive Status","description":"JSON snapshot of the predictive scorecard (same payload as the HTML page).","operationId":"admin_predictive_status_admin_predictive_status_json_get","parameters":[{"name":"sport","in":"query","required":false,"schema":{"type":"string","default":"soccer","title":"Sport"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/job-health":{"get":{"tags":["admin"],"summary":"Admin Job Health","description":"Sport-by-sport job health board with attention, findings, and coverage gaps.","operationId":"admin_job_health_admin_job_health_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/job-health/status.json":{"get":{"tags":["admin"],"summary":"Admin Job Health Status","description":"JSON snapshot for auto-refresh of the sport health grid.","operationId":"admin_job_health_status_admin_job_health_status_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/job-health/attention-count.json":{"get":{"tags":["admin"],"summary":"Admin Job Health Attention Count","description":"Lightweight Needs Attention count for the sidebar badge (async fetch).","operationId":"admin_job_health_attention_count_admin_job_health_attention_count_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/job-health/mute":{"post":{"tags":["admin"],"summary":"Admin Job Health Mute","description":"Mute an alert fingerprint for N hours (Redis). Suppresses Slack pages.","operationId":"admin_job_health_mute_admin_job_health_mute_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_job_health_mute_admin_job_health_mute_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["public"],"summary":"Home","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/pricing":{"get":{"tags":["public"],"summary":"Pricing","operationId":"pricing_pricing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/quickstart":{"get":{"tags":["public"],"summary":"Docs Quickstart","operationId":"docs_quickstart_quickstart_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/docs":{"get":{"tags":["public"],"summary":"Docs","operationId":"docs_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/guides":{"get":{"tags":["public"],"summary":"Docs Guides","operationId":"docs_guides_docs_guides_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/ai":{"get":{"tags":["public"],"summary":"Docs Ai","operationId":"docs_ai_docs_ai_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/cheat-sheet":{"get":{"tags":["public"],"summary":"Docs Cheat Sheet","operationId":"docs_cheat_sheet_docs_cheat_sheet_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/glossary":{"get":{"tags":["public"],"summary":"Docs Glossary","operationId":"docs_glossary_docs_glossary_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/player-props":{"get":{"tags":["public"],"summary":"Docs Player Props","operationId":"docs_player_props_docs_player_props_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/best-practices":{"get":{"tags":["public"],"summary":"Docs Best Practices","operationId":"docs_best_practices_docs_best_practices_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/rate-limits":{"get":{"tags":["public"],"summary":"Docs Rate Limits","operationId":"docs_rate_limits_docs_rate_limits_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/reference":{"get":{"tags":["public"],"summary":"Docs Reference","operationId":"docs_reference_docs_reference_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/understanding-odds":{"get":{"tags":["public"],"summary":"Docs Understanding Odds","description":"Concepts page: field-by-field walkthrough of the /intelligence probability payload.","operationId":"docs_understanding_odds_docs_understanding_odds_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/forecasts":{"get":{"tags":["public"],"summary":"Docs Forecasts","description":"How + field catalog for forecasted player-prop wagers.","operationId":"docs_forecasts_docs_forecasts_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/grade":{"get":{"tags":["public"],"summary":"Docs Grade","description":"How-to walkthrough for /grade and POST /v1/grade/slip.","operationId":"docs_grade_docs_grade_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/injuries":{"get":{"tags":["public"],"summary":"Docs Injuries","description":"How-to for the Beta event-scoped injury / availability monitor.","operationId":"docs_injuries_docs_injuries_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/sports-coverage":{"get":{"tags":["public"],"summary":"Docs Sports Coverage","description":"Sport × surface capability map — what is live on each sport today.","operationId":"docs_sports_coverage_docs_sports_coverage_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/openapi":{"get":{"tags":["public"],"summary":"Docs Openapi","description":"Human/SEO landing for OpenAPI discoverability (/openapi.json stays machine JSON).","operationId":"docs_openapi_docs_openapi_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/use-cases/live-scoreboard":{"get":{"tags":["public"],"summary":"Use Case Live Scoreboard","description":"SEO landing page: build a live sports scoreboard with the Lumify API.","operationId":"use_case_live_scoreboard_use_cases_live_scoreboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports-odds-api":{"get":{"tags":["public"],"summary":"Sports Odds Api","description":"SEO pillar: sports odds / betting odds API landing.","operationId":"sports_odds_api_sports_odds_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports-data-api":{"get":{"tags":["public"],"summary":"Sports Data Api","description":"SEO pillar: sports data / sports API landing.","operationId":"sports_data_api_sports_data_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports-api-for-ai-agents":{"get":{"tags":["public"],"summary":"Sports Api For Ai Agents","description":"SEO pillar: sports API for AI agents landing.","operationId":"sports_api_for_ai_agents_sports_api_for_ai_agents_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports-mcp-server":{"get":{"tags":["public"],"summary":"Sports Mcp Server","description":"SEO pillar: HTML sports MCP server landing (/mcp stays protocol JSON).","operationId":"sports_mcp_server_sports_mcp_server_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/compare/best-sports-betting-apis":{"get":{"tags":["public"],"summary":"Compare Best Sports Betting Apis","description":"Category compare: ranked self-serve sports betting APIs + FAQPage.","operationId":"compare_best_sports_betting_apis_compare_best_sports_betting_apis_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports/nfl-api":{"get":{"tags":["public"],"summary":"Sports Nfl Api","description":"SEO sport landing: NFL API (schedules, scores, odds, splits, stats, intelligence).","operationId":"sports_nfl_api_sports_nfl_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports/ncaaf-api":{"get":{"tags":["public"],"summary":"Sports Ncaaf Api","description":"SEO sport landing: NCAAF API (schedules, scores, odds, stats, intelligence).","operationId":"sports_ncaaf_api_sports_ncaaf_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports/nba-api":{"get":{"tags":["public"],"summary":"Sports Nba Api","description":"SEO sport landing: NBA API (schedules, scores, odds, splits, stats).","operationId":"sports_nba_api_sports_nba_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports/ncaab-api":{"get":{"tags":["public"],"summary":"Sports Ncaab Api","description":"SEO sport landing: NCAAB API (schedules, scores, odds, stats).","operationId":"sports_ncaab_api_sports_ncaab_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports/nhl-api":{"get":{"tags":["public"],"summary":"Sports Nhl Api","description":"SEO sport landing: NHL API (schedules, scores, odds, splits, stats).","operationId":"sports_nhl_api_sports_nhl_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports/mlb-api":{"get":{"tags":["public"],"summary":"Sports Mlb Api","description":"SEO sport landing: MLB API (schedules, scores, odds, stats, intelligence).","operationId":"sports_mlb_api_sports_mlb_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports/soccer-api":{"get":{"tags":["public"],"summary":"Sports Soccer Api","description":"SEO sport landing: soccer API (leagues as sections; no thin EPL micros).","operationId":"sports_soccer_api_sports_soccer_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sports/tennis-api":{"get":{"tags":["public"],"summary":"Sports Tennis Api","description":"SEO sport landing: ATP/WTA tennis API (scores, odds, stats, intelligence).","operationId":"sports_tennis_api_sports_tennis_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/changelog":{"get":{"tags":["public"],"summary":"Changelog","operationId":"changelog_changelog_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/faq":{"get":{"tags":["public"],"summary":"Faq","operationId":"faq_faq_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/grade":{"get":{"tags":["public"],"summary":"Grade Page","description":"Indexable Mode M / Mode S grade sheet. Composes via POST /grade/slip.","operationId":"grade_page_grade_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/contact-us":{"get":{"tags":["public"],"summary":"Contact Page","operationId":"contact_page_contact_us_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["public"],"summary":"Contact Submit","operationId":"contact_submit_contact_us_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_contact_submit_contact_us_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/newsletter-signup":{"post":{"tags":["public"],"summary":"Newsletter Signup","description":"Lightweight, lower-commitment lead capture from the homepage.\n\nMirrors contact_submit: no DB table, just an email notification. Always\nreports success to the caller so we don't leak backend failures into the\nUI for what is a low-stakes marketing form.","operationId":"newsletter_signup_newsletter_signup_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_newsletter_signup_newsletter_signup_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/terms-of-service":{"get":{"tags":["public"],"summary":"Terms","operationId":"terms_terms_of_service_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy-policy":{"get":{"tags":["public"],"summary":"Privacy","operationId":"privacy_privacy_policy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/getting-started/quick-start":{"get":{"tags":["public"],"summary":"Guide Quick Start Html","description":"HTML twin of the markdown quick-start — first API call in under 5 minutes.","operationId":"guide_quick_start_html_docs_getting_started_quick_start_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/getting-started/self-hosting":{"get":{"tags":["public"],"summary":"Guide Self Hosting Html","description":"HTML twin of the self-hosting FAQ.","operationId":"guide_self_hosting_html_docs_getting_started_self_hosting_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/404":{"get":{"tags":["public"],"summary":"Not Found Page","operationId":"not_found_page_404_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/webhooks/stripe":{"post":{"tags":["webhooks"],"summary":"Stripe Webhook","operationId":"stripe_webhook_api_webhooks_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/gcp-job-alert":{"post":{"tags":["webhooks"],"summary":"Gcp Job Alert","operationId":"gcp_job_alert_api_webhooks_gcp_job_alert_post","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"}}}}}}},"/v1/sports":{"get":{"tags":["sports"],"summary":"List sports","operationId":"list_sports_v1_sports_get","parameters":[{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"Return only active sports (default true)","default":true,"title":"Active Only"},"description":"Return only active sports (default true)"}],"responses":{"200":{"description":"Active sports with their leagues and current season summary","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/seasons":{"get":{"tags":["sports"],"summary":"List seasons","operationId":"list_seasons_v1_seasons_get","parameters":[{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by sport slug (e.g. nhl, nba, soccer)","title":"Sport"},"description":"Filter by sport slug (e.g. nhl, nba, soccer)"},{"name":"current_only","in":"query","required":false,"schema":{"type":"boolean","description":"Return only currently active seasons (default true). Pass false to include historical/past seasons.","default":true,"title":"Current Only"},"description":"Return only currently active seasons (default true). Pass false to include historical/past seasons."}],"responses":{"200":{"description":"Seasons per sport/league, optionally filtered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events":{"get":{"tags":["events"],"summary":"List events","operationId":"list_events_v1_events_get","parameters":[{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sport slug: nfl, nba, mlb, nhl, tennis, soccer…","title":"Sport"},"description":"Sport slug: nfl, nba, mlb, nhl, tennis, soccer…"},{"name":"league","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"League slug: nfl, nba, atp, mls…","title":"League"},"description":"League slug: nfl, nba, atp, mls…"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Event status: scheduled|inprogress|final|…","title":"Status"},"description":"Event status: scheduled|inprogress|final|…"},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UTC date YYYY-MM-DD (single day)","title":"Date"},"description":"UTC date YYYY-MM-DD (single day)"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UTC start date YYYY-MM-DD","title":"From"},"description":"UTC start date YYYY-MM-DD"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UTC end date YYYY-MM-DD (inclusive)","title":"To"},"description":"UTC end date YYYY-MM-DD (inclusive)"},{"name":"season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by season ID","title":"Season Id"},"description":"Filter by season ID"},{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter to events where this team participates. Resolve ids via GET /v1/teams?q=…","title":"Team Id"},"description":"Filter to events where this team participates. Resolve ids via GET /v1/teams?q=…"},{"name":"after_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Cursor: return events with id > after_id","title":"After Id"},"description":"Cursor: return events with id > after_id"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"include_scores","in":"query","required":false,"schema":{"type":"boolean","description":"Inline participants + scores in each event. Intended for small result sets (≤ 200 events). Shares the 20/min score-poll budget with GET /events/{id}/score; prefer GET /events/{id}/stream for live boards.","default":false,"title":"Include Scores"},"description":"Inline participants + scores in each event. Intended for small result sets (≤ 200 events). Shares the 20/min score-poll budget with GET /events/{id}/score; prefer GET /events/{id}/stream for live boards."},{"name":"has_recommend","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"When true, return only events with at least one recommended bet (has_recommend=1 in intelligence). Requires intelligence pipeline to have run.","title":"Has Recommend"},"description":"When true, return only events with at least one recommended bet (has_recommend=1 in intelligence). Requires intelligence pipeline to have run."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Sort order: 'time' (chronological, default) or 'status' (Live → Delayed/Upcoming → Final → Cancelled/Postponed). Cursor pagination (after_id) is not supported with sort=status.","default":"time","title":"Sort"},"description":"Sort order: 'time' (chronological, default) or 'status' (Live → Delayed/Upcoming → Final → Cancelled/Postponed). Cursor pagination (after_id) is not supported with sort=status."}],"responses":{"200":{"description":"Paginated event list, newest first within the requested window","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Events V1 Events Get","$ref":"#/components/schemas/EventListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}":{"get":{"tags":["events"],"summary":"Get an event","operationId":"get_event_v1_events__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"},{"name":"include_odds","in":"query","required":false,"schema":{"type":"boolean","description":"Inline current odds into the response under the 'odds' key. Scoped by bookmaker (default: pinnacle). Does not add credits — the event call stays 1 credit.","default":false,"title":"Include Odds"},"description":"Inline current odds into the response under the 'odds' key. Scoped by bookmaker (default: pinnacle). Does not add credits — the event call stays 1 credit."},{"name":"include_intelligence","in":"query","required":false,"schema":{"type":"boolean","description":"Inline bet intelligence (signals, bets, narratives) into the response under the 'intelligence' key. Does not add credits — the event call stays 1 credit.","default":false,"title":"Include Intelligence"},"description":"Inline bet intelligence (signals, bets, narratives) into the response under the 'intelligence' key. Does not add credits — the event call stays 1 credit."},{"name":"bookmaker","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bookmaker filter for inlined odds (when include_odds=true) and for intelligence.bets[].market prices (when include_intelligence=true). Valid values: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all. Defaults to pinnacle.","title":"Bookmaker"},"description":"Bookmaker filter for inlined odds (when include_odds=true) and for intelligence.bets[].market prices (when include_intelligence=true). Valid values: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all. Defaults to pinnacle."},{"name":"include_alts","in":"query","required":false,"schema":{"type":"boolean","description":"When include_odds=true, include alternate spread/total rungs (is_main=false). Default is mains only.","default":false,"title":"Include Alts"},"description":"When include_odds=true, include alternate spread/total rungs (is_main=false). Default is mains only."}],"responses":{"200":{"description":"Full event with participants, venue, and schedule metadata","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event V1 Events  Event Id  Get","$ref":"#/components/schemas/EventDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/batch":{"post":{"tags":["events"],"summary":"Get multiple events in one call","description":"Fetch multiple events by id in a single round-trip — for agents that\nalready have a list of ids (e.g. from GET /v1/events) and want full detail\nfor each without issuing one GET per event.\n\nBody: {\"event_ids\": [1, 2, 3], \"include_odds\": bool, \"include_intelligence\": bool, \"bookmaker\": str}\nMax 25 ids per call. Duplicate ids are billed once. Credits are the sum of\neach event's normal GET /v1/events/{id} cost — billing fairness applies\nper event (unavailable odds/intelligence are free; ids that don't exist\ncost nothing and are returned under \"not_found\").","operationId":"batch_get_events_v1_events_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchEventsRequest"}}},"required":true},"responses":{"200":{"description":"Requested events (each shaped like GET /v1/events/{id}) plus any ids not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchEventsResponse","additionalProperties":true,"type":"object","title":"Response Batch Get Events V1 Events Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/query":{"post":{"tags":["events"],"summary":"Natural-language event search","description":"Map a natural-language query to the same filters GET /v1/events accepts,\nthen run that exact list query — results are identical to, and as fresh\nas, calling /v1/events directly. This is a small rule-based mapper, not an\nLLM call — see the module-level `_parse_nl_query` docstring for exactly\nwhat it recognizes.\n\nBody: {\"query\": \"live nfl games today\", \"limit\": 25}\nAn explicit top-level \"limit\" overrides one parsed from the text. Costs 1\ncredit, same as GET /v1/events — interpreting the query text is free.","operationId":"query_events_v1_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NLQueryRequest"}}},"required":true},"responses":{"200":{"description":"Events matching the parsed query, the interpreted filters, and their REST equivalent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NLQueryResponse","additionalProperties":true,"type":"object","title":"Response Query Events V1 Query Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/score":{"get":{"tags":["events"],"summary":"Get an event's score","operationId":"get_event_score_v1_events__event_id__score_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"}],"responses":{"200":{"description":"Lightweight score snapshot: status, period, clock, and per-participant scores. Cache TTL is 15 s for in-progress events, 5 min otherwise. Capped at 20 calls/min per key (shared with include_scores list polls). High-frequency pollers should use GET /events/{event_id}/stream (SSE) instead of tight-polling this endpoint.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event Score V1 Events  Event Id  Score Get","$ref":"#/components/schemas/ScoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/intelligence/ev":{"get":{"tags":["events"],"summary":"List main-line EV (Beta) opportunities","operationId":"list_intelligence_ev_v1_intelligence_ev_get","parameters":[{"name":"sport","in":"query","required":true,"schema":{"type":"string","description":"Sport slug. Predictive-framework sports only: soccer, mlb, tennis, nfl, ncaaf.","title":"Sport"},"description":"Sport slug. Predictive-framework sports only: soccer, mlb, tennis, nfl, ncaaf."},{"name":"league","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional league slug (e.g. mls, epl, atp). Soccer without a league scans every published soccer league (MLS + big-five).","title":"League"},"description":"Optional league slug (e.g. mls, epl, atp). Soccer without a league scans every published soccer league (MLS + big-five)."},{"name":"market","in":"query","required":false,"schema":{"type":"string","description":"Main-line family: h2h (default, moneyline), spreads, or totals. Tennis totals return 400 — Stage 1 does not publish a games-total sharp.","enum":["h2h","spreads","totals"],"default":"h2h","title":"Market"},"description":"Main-line family: h2h (default, moneyline), spreads, or totals. Tennis totals return 400 — Stage 1 does not publish a games-total sharp."},{"name":"min_ev","in":"query","required":false,"schema":{"type":"number","description":"Minimum EV% to include. Clamped to 0–25. Default 0 (all positive).","default":0.0,"title":"Min Ev"},"description":"Minimum EV% to include. Clamped to 0–25. Default 0 (all positive)."},{"name":"book","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict opportunities to one sportsbook slug (e.g. fanduel).","title":"Book"},"description":"Restrict opportunities to one sportsbook slug (e.g. fanduel)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max opportunities to return (1–200).","default":50,"title":"Limit"},"description":"Max opportunities to return (1–200)."}],"responses":{"200":{"description":"Pregame main-line rows (moneyline, spreads, or totals) whose sharp-fair price gap is positive and ≤ 25% EV, across upcoming predictive-framework events. Tennis totals are not offered. Beta. 1 credit. Field catalog: https://lumify.ai/docs/reference#intelligence-ev","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Intelligence Ev V1 Intelligence Ev Get","$ref":"#/components/schemas/IntelligenceEvResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/intelligence/forecasts":{"get":{"tags":["events"],"summary":"List forecasted wagers (player props; main-line rows ship sport-by-sport)","operationId":"list_intelligence_forecasts_v1_intelligence_forecasts_get","parameters":[{"name":"sport","in":"query","required":true,"schema":{"type":"string","description":"Sport slug. Prop-forecast sports: mlb, ncaaf, nfl, nba, ncaab, nhl. Main-line forecast sports: tennis, nfl, ncaaf, mlb, soccer (high-confidence moneyline, spread, and total).","title":"Sport"},"description":"Sport slug. Prop-forecast sports: mlb, ncaaf, nfl, nba, ncaab, nhl. Main-line forecast sports: tennis, nfl, ncaaf, mlb, soccer (high-confidence moneyline, spread, and total)."},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UTC slate date YYYY-MM-DD. Defaults to today UTC.","title":"Date"},"description":"UTC slate date YYYY-MM-DD. Defaults to today UTC."},{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Main-line family filter (h2h, spreads, or totals). Main-line sports publish a high-confidence side of each family when the lean clears the coin-flip gate. Ignored on prop-only sports (nba, ncaab, nhl).","enum":["h2h","spreads","totals"],"title":"Market"},"description":"Main-line family filter (h2h, spreads, or totals). Main-line sports publish a high-confidence side of each family when the lean clears the coin-flip gate. Ignored on prop-only sports (nba, ncaab, nhl)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max wagers to return (1–100). Default 25.","default":25,"title":"Limit"},"description":"Max wagers to return (1–100). Default 25."}],"responses":{"200":{"description":"Daily board of forecasted wagers from our model — player props (MLB, NCAAF, NFL, NBA, NCAAB, NHL) and high-confidence main-line picks on tennis, NFL, NCAAF, MLB, and soccer (moneyline, spread, total — one side per market when the uncertainty band does not include a coin flip). Tennis moneyline is ranking Bradley-Terry; tennis spreads/totals are a Normal-approx games model. Other sports use the published assessment probability. Each wager has p_hit (model probability the picked outcome hits), conviction (board rank), and posted books prices. Prop rows: player, market, line, side. Main-line rows: bet_type, player_role, market=h2h|spreads|totals. reliability is emerging on v0. Empty slate is still 200, still 1 credit. Same objects also appear per-event on GET /v1/events/{id}/intelligence as forecasts[]. A high-confidence main-line row's research.note is copied to the matching bets[].narrative. Not an EV / claim-ladder surface — see GET /v1/intelligence/ev for gated main-line +EV. Field catalog: https://lumify.ai/docs/reference#intelligence-forecasts","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Intelligence Forecasts V1 Intelligence Forecasts Get","$ref":"#/components/schemas/ForecastsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/intelligence":{"get":{"tags":["events"],"summary":"Get bet intelligence for an event","operationId":"get_event_intelligence_v1_events__event_id__intelligence_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"},{"name":"bookmaker","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Ignored. Intelligence always reports the book the assessment was priced against. Accepted values (pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada) are kept for compatibility and do not change market.price or fair_price.","title":"Bookmaker"},"description":"Ignored. Intelligence always reports the book the assessment was priced against. Accepted values (pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada) are kept for compatibility and do not change market.price or fair_price."}],"responses":{"200":{"description":"Predictive bet intelligence: vig-stripped probability, fair_price, Price overlay (fair / edges_by_book / best), and main-line ev (Beta),         plus forecasts[] — forecasted wagers from the model (same objects as GET /v1/intelligence/forecasts; player props on MLB/NFL/NCAAF/NBA/NCAAB/NHL, tennis moneyline/spreads/totals). bets[] is live for MLB, tennis, soccer (MLS + big-five), NFL, and NCAAF. forecasts[] covers MLB, NFL, NCAAF, NBA, NCAAB, NHL, and tennis (can populate when available is false). Today bets[] is fair-price + line-shopping (edge/tier null; has_recommend false). The bookmaker query is ignored — prices are the book the assessment was priced against. Match-level tokens (OVER, UNDER, ML_DRAW) have null player/team attribution. Free only when available is false and forecasts is empty. Field catalog: https://lumify.ai/docs/reference#event-intelligence","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event Intelligence V1 Events  Event Id  Intelligence Get","$ref":"#/components/schemas/IntelligenceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/odds":{"get":{"tags":["events"],"summary":"Get current betting odds for an event","operationId":"get_event_odds_v1_events__event_id__odds_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"},{"name":"bookmaker","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bookmaker filter. Default: pinnacle. Accepted values: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all, or a comma-separated list (e.g. 'fanduel,betmgm'). One book or all = 1 credit.","title":"Bookmaker"},"description":"Bookmaker filter. Default: pinnacle. Accepted values: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all, or a comma-separated list (e.g. 'fanduel,betmgm'). One book or all = 1 credit."},{"name":"include_alts","in":"query","required":false,"schema":{"type":"boolean","description":"Include alternate spread/total rungs (is_main=false). Default is mains only.","default":false,"title":"Include Alts"},"description":"Include alternate spread/total rungs (is_main=false). Default is mains only."}],"responses":{"200":{"description":"Current moneyline, spread, and total lines for the requested bookmaker(s), including in-play quotes while the event is underway. Default is Pinnacle only. Use bookmaker=all or a comma-separated list (e.g. bookmaker=fanduel,draftkings) to fetch multiple books. One book or all is 1 credit. Markets are grouped by type (h2h → moneyline, spreads → spread, totals → totals). Default view is main lines (is_main=true). Pass include_alts=true for alternate spread/total rungs. In-play responses omit books that have not quoted since kickoff. Final events include result (won/lost/push/void) graded from the pre-kickoff close (lumify_closing_odds), not the last in-play line. If no odds have been ingested for this event yet, returns 200 with available=false and is NOT charged (X-Credits-Used: 0). When bookmaker is omitted (default) and Pinnacle hasn't posted a line yet — common for the first/last games of a preseason slate — falls back to the best-covered other book instead of reporting no odds; the response then includes requested_bookmaker='pinnacle' and fallback_bookmaker=<book actually returned>. An explicit bookmaker=pinnacle request never falls back.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event Odds V1 Events  Event Id  Odds Get","$ref":"#/components/schemas/OddsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/odds/history":{"get":{"tags":["events"],"summary":"Get line movement history for an event","operationId":"get_event_odds_history_v1_events__event_id__odds_history_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"},{"name":"bookmaker","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Bookmaker filter. Default: pinnacle. Accepted values: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all, or a comma-separated list. One book or all = 1 credit.","title":"Bookmaker"},"description":"Bookmaker filter. Default: pinnacle. Accepted values: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all, or a comma-separated list. One book or all = 1 credit."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max movements to return","default":50,"title":"Limit"},"description":"Max movements to return"}],"responses":{"200":{"description":"All recorded line movements (price or point changes) for the event, ordered newest-first. Useful for detecting sharp line movement. If no movement has been recorded for this event yet, returns 200 with an empty movements list and is NOT charged (X-Credits-Used: 0).","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event Odds History V1 Events  Event Id  Odds History Get","$ref":"#/components/schemas/OddsHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/splits":{"get":{"tags":["events"],"summary":"Get public betting splits for an event","description":"Public bets% and handle% per side (moneyline, spread, total), with a cross-book consensus and per-bookmaker breakdown. Bookmaker keys match /odds slugs (e.g. draftkings, fanduel) under bookmakers[].bookmaker. Available for MLB, NBA, NHL, NFL, NCAAF, and NCAAB. Not available for tennis or soccer (upstream 400). available:false is free.","operationId":"get_event_splits_v1_events__event_id__splits_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"}],"responses":{"200":{"description":"Public bets% and handle% per side, per market, per bookmaker. Shape: bookmakers[].bookmaker (odds slug) + consensus averages. Available for MLB, NBA, NHL, NFL, NCAAF, and NCAAB; not for tennis or soccer. If no splits have been ingested for this event (or the sport is unsupported), returns 200 with available=false and is NOT charged (X-Credits-Used: 0).","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event Splits V1 Events  Event Id  Splits Get","$ref":"#/components/schemas/SplitsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/injuries":{"get":{"tags":["events"],"summary":"Get late-breaking injury / availability for an event (Beta)","description":"**Beta.** Structured player injury and availability status for an upcoming event, written by an automated monitoring pipeline that watches for late-breaking status changes. Beta coverage: NFL and MLB (more sports rolling out). NFL monitoring starts ~4.5 days before kickoff (Wednesday/Thursday practice reports); MLB stays on a 48-hour window. Checks run on a hours-to-start cadence and also when a main-market line moves ≥20 American-odds points or ≥1.0 spread/total point, plus a guaranteed pre-kickoff confirmation per sport. Subscribe to webhook event_type=injury for material/critical status changes (info reconfirms never fire). available:false is free. No in-game feed.","operationId":"get_event_injuries_v1_events__event_id__injuries_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"},{"name":"exclude_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated injury statuses to drop from the response, e.g. exclude_status=ir to hide injured-reserve/long-term-IL rows (long-standing roster designations, not late-breaking news — these rows are also the most likely to have body_part=null, since roster/depth-chart sources report a designation + return-eligibility date rather than injury details). Does not affect available or X-Credits-Used, which reflect whether the monitor has written any report at all. Valid values: available, day_to_day, doubtful, ir, out, probable, questionable, suspended.","title":"Exclude Status"},"description":"Comma-separated injury statuses to drop from the response, e.g. exclude_status=ir to hide injured-reserve/long-term-IL rows (long-standing roster designations, not late-breaking news — these rows are also the most likely to have body_part=null, since roster/depth-chart sources report a designation + return-eligibility date rather than injury details). Does not affect available or X-Credits-Used, which reflect whether the monitor has written any report at all. Valid values: available, day_to_day, doubtful, ir, out, probable, questionable, suspended."}],"responses":{"200":{"description":"Beta. Per-player status rows plus watch-queue timestamps. If the monitor has not yet written a report, returns 200 with available=false and is NOT charged (X-Credits-Used: 0).","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event Injuries V1 Events  Event Id  Injuries Get","$ref":"#/components/schemas/InjuriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/stats":{"get":{"tags":["events"],"summary":"Get raw team/match statistics for an event (Data layer)","description":"Soccer, MLB, tennis, NFL, NCAAF, NBA, NCAAB, and NHL. Deterministic aggregates from completed results — no odds (see /odds) and no scoring (see /intelligence). Payload shapes are sport-specific (team-keyed except tennis). Tennis: main-draw singles only (doubles/qualifying return available:false). Form/record/H2H exclude walkovers and NFL/NCAAF/NBA/NCAAB preseason. Other sports return HTTP 400. available:false is free. Field catalog: https://lumify.ai/docs/reference#event-stats","operationId":"get_event_stats_v1_events__event_id__stats_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"}],"responses":{"200":{"description":"Sport-specific Data-layer statistics. Soccer/MLB/NFL/NCAAF/NBA/NCAAB/NHL use teams.home/away; tennis uses players.player_1/player_2 plus match.scoreboard. Null/empty fields mean too few completed games, not a failed call. Catalog: https://lumify.ai/docs/reference#event-stats","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response 200 Get Event Stats V1 Events  Event Id  Stats Get","anyOf":[{"$ref":"#/components/schemas/StatsResponse"},{"$ref":"#/components/schemas/MlbStatsResponse"},{"$ref":"#/components/schemas/TennisStatsResponse"},{"$ref":"#/components/schemas/NflStatsResponse"},{"$ref":"#/components/schemas/NbaStatsResponse"},{"$ref":"#/components/schemas/NhlStatsResponse"},{"$ref":"#/components/schemas/NcaafStatsResponse"},{"$ref":"#/components/schemas/NcaabStatsResponse"}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/player-props":{"get":{"tags":["events"],"summary":"Get player-prop lines and live progress for an event","description":"NFL, NCAAF, NBA, NCAAB, NHL, MLB, and Soccer only. Joins persisted player-prop mains to this-event player box rows and grades over/under/push (1:1 slugs, combo sums including rush+rec and pass+rush yards, weighted combos, and yes/no thresholds). GET /odds stays on h2h/spreads/totals. Other sports return HTTP 400. available:false is free. Market catalog: https://lumify.ai/docs/player-props","operationId":"get_event_player_props_v1_events__event_id__player_props_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"}],"responses":{"200":{"description":"One row per (player, market, line) with per-book Over/Under prices, the live counting stat (current), pct_of_line, and result (in_progress / over / under / push). 400 if the event's sport is not NFL, NCAAF, NBA, NCAAB, NHL, MLB, and Soccer. 404 if the event does not exist.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event Player Props V1 Events  Event Id  Player Props Get","$ref":"#/components/schemas/PlayerPropsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/team-props":{"get":{"tags":["events"],"summary":"Get team-total lines and live progress for an event","description":"NFL, NCAAF, MLB, and Soccer only. Joins persisted team-total mains to this-event participant scores and grades over/under/push. GET /odds stays on h2h/spreads/totals. Other sports return HTTP 400. available:false is free.","operationId":"get_event_team_props_v1_events__event_id__team_props_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"}],"responses":{"200":{"description":"One row per (team, line) with per-book Over/Under prices, the live team score (current), pct_of_line, and result (in_progress / over / under / push). 400 if the event's sport is not NFL, NCAAF, MLB, and Soccer. 404 if the event does not exist.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event Team Props V1 Events  Event Id  Team Props Get","$ref":"#/components/schemas/TeamPropsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/period-odds":{"get":{"tags":["events"],"summary":"Get first-half / first-five / first-set lines and live progress for an event","description":"NFL, NCAAF, NBA, NCAAB, MLB, Soccer, and Tennis only. Joins persisted first_half_spreads / first_half_totals mains to this-event period scores (1H = Q1+Q2, NCAAB or soccer native 1H; MLB F5 = innings 1–5; tennis S1 = first-set games) and grades the period, not the full game. GET /odds stays on h2h/spreads/totals. Other sports return HTTP 400. available:false is free.","operationId":"get_event_period_odds_v1_events__event_id__period_odds_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"}],"responses":{"200":{"description":"One row per (scope, market, line) with per-book prices, scope scores, and result (in_progress until the scope is complete). 400 if the event's sport is not NFL, NCAAF, NBA, NCAAB, MLB, Soccer, and Tennis. 404 if the event does not exist.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Event Period Odds V1 Events  Event Id  Period Odds Get","$ref":"#/components/schemas/PeriodOddsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/players":{"get":{"tags":["players"],"summary":"List players","operationId":"list_players_v1_players_get","parameters":[{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sport slug, e.g. 'tennis' or 'mlb'","title":"Sport"},"description":"Sport slug, e.g. 'tennis' or 'mlb'"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Name search (partial match)","title":"Q"},"description":"Name search (partial match)"},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 3166-1 alpha-3 country code, e.g. 'USA'","title":"Country"},"description":"ISO 3166-1 alpha-3 country code, e.g. 'USA'"},{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Active"},"description":"Filter by active status"},{"name":"ranked","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"If true, only tennis players with an ATP/WTA singles ranking (rankings.singles).","title":"Ranked"},"description":"If true, only tennis players with an ATP/WTA singles ranking (rankings.singles)."},{"name":"after_id","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Cursor: last player id from previous page","default":0,"title":"After Id"},"description":"Cursor: last player id from previous page"},{"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/PlayersListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/players/{player_id}":{"get":{"tags":["players"],"summary":"Get a player","operationId":"get_player_v1_players__player_id__get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Player"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/players/{player_id}/events":{"get":{"tags":["players"],"summary":"List a player's events","operationId":"get_player_events_v1_players__player_id__events_get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Player Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Event status filter","title":"Status"},"description":"Event status filter"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Start date YYYY-MM-DD","title":"From"},"description":"Start date YYYY-MM-DD"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"End date YYYY-MM-DD","title":"To"},"description":"End date YYYY-MM-DD"},{"name":"after_id","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Cursor: last event id from previous page","default":0,"title":"After Id"},"description":"Cursor: last event id from previous page"},{"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/PlayerEventsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/teams":{"get":{"tags":["teams"],"summary":"List teams","operationId":"list_teams_v1_teams_get","parameters":[{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sport slug, e.g. 'nba' or 'nhl'","title":"Sport"},"description":"Sport slug, e.g. 'nba' or 'nhl'"},{"name":"league","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"League slug, e.g. 'nba'","title":"League"},"description":"League slug, e.g. 'nba'"},{"name":"conference","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Conference filter","title":"Conference"},"description":"Conference filter"},{"name":"division","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Division filter","title":"Division"},"description":"Division filter"},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO country code, e.g. 'USA'","title":"Country"},"description":"ISO country code, e.g. 'USA'"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Team name search (partial match)","title":"Q"},"description":"Team name search (partial match)"},{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Active"},"description":"Filter by active status"},{"name":"after_id","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Cursor: last team id from previous page","default":0,"title":"After Id"},"description":"Cursor: last team id from previous page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Paginated team list, filterable by sport/league/conference/division/country.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/teams/{team_id}":{"get":{"tags":["teams"],"summary":"Get a team","operationId":"get_team_v1_teams__team_id__get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Lumify team ID","title":"Team Id"},"description":"Lumify team ID"}],"responses":{"200":{"description":"Team profile with home venue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Team"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/resolve/player":{"post":{"tags":["resolve"],"summary":"Resolve a messy player name to a Lumify player id","description":"Resolve messy sports player names to a Lumify player_id using sport, team, or event clues. Prefer before grade_slip. Returns ambiguous instead of guessing.","operationId":"resolve_player_route_v1_resolve_player_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvePlayerRequest"}}},"required":true},"responses":{"200":{"description":"resolved with player_id, or ambiguous / not_found. Never guesses when two catalog players remain plausible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvePlayerResponse","additionalProperties":true,"type":"object","title":"Response Resolve Player Route V1 Resolve Player Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/resolve/team":{"post":{"tags":["resolve"],"summary":"Resolve a messy team string to a Lumify team id","description":"Resolve messy team names, abbreviations, metros, or aliases to a Lumify team_id using sport, league, event, or player clues. Returns ambiguous instead of guessing.","operationId":"resolve_team_route_v1_resolve_team_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveTeamRequest"}}},"required":true},"responses":{"200":{"description":"resolved with team_id, or ambiguous / not_found. Never guesses when two catalog teams remain plausible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveTeamResponse","additionalProperties":true,"type":"object","title":"Response Resolve Team Route V1 Resolve Team Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/resolve/event":{"post":{"tags":["resolve"],"summary":"Resolve event identity from an id, player, or team clue","description":"Resolve event_id, or player_id/team_id + date window, to a Lumify event_id. Never guesses.","operationId":"resolve_event_route_v1_resolve_event_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveEventRequest"}}},"required":true},"responses":{"200":{"description":"resolved with event_id, or ambiguous / not_found. Never guesses when two catalog events remain plausible in the window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveEventResponse","additionalProperties":true,"type":"object","title":"Response Resolve Event Route V1 Resolve Event Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/grade/slip":{"post":{"tags":["grade"],"summary":"Grade settleable player-prop and game-market legs","description":"Grade settleable player-prop legs (over/under/push/in_progress/dnp/no_stat) on nfl/nba/ncaaf/ncaab/nhl/mlb/soccer, plus structured game markets (h2h/spreads/totals) on any sport GET /odds already settles. Structured event_id preferred; player_id is required on props and forbidden on game keys. Free-text player props are graded only when player and event resolve uniquely — ambiguous names stay unmapped with candidates. Call this endpoint or MCP grade_slip with an API key to grade from an app or agent. The public /grade sheet uses the same engine without a key (20 grades / IP / day). How-to: https://lumify.ai/docs/grade. Not live trading odds. Not wagering advice.","operationId":"grade_slip_route_v1_grade_slip_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradeSlipRequest"}}},"required":true},"responses":{"200":{"description":"Per-leg settlement (props: over / under / push / in_progress / dnp / no_stat; spreads and moneyline: won / lost / push / void / in_progress; totals: over / under / push / void / in_progress) plus a slip summary. Attribution is always Graded by Lumify.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradeSlipResponse","additionalProperties":true,"type":"object","title":"Response Grade Slip Route V1 Grade Slip Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/events/{event_id}/stream":{"get":{"tags":["events"],"summary":"Stream live score updates (SSE)","operationId":"stream_event_score_v1_events__event_id__stream_get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","description":"Lumify event ID","title":"Event Id"},"description":"Lumify event ID"}],"responses":{"200":{"description":"text/event-stream of score updates; emits on change only.","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/webhooks":{"get":{"tags":["events","events"],"summary":"List webhook subscriptions","operationId":"list_webhooks_v1_webhooks_get","responses":{"200":{"description":"The caller's webhook subscriptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListResponse"}}}}},"security":[{"ApiKeyBearer":[]}]},"post":{"tags":["events","events"],"summary":"Create a webhook subscription","operationId":"create_webhook_v1_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"The created webhook subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/webhooks/{subscription_id}":{"delete":{"tags":["events","events"],"summary":"Delete a webhook subscription","operationId":"delete_webhook_v1_webhooks__subscription_id__delete","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Subscription Id"}}],"responses":{"200":{"description":"Deletion result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/webhooks/{subscription_id}/deliveries":{"get":{"tags":["events","events"],"summary":"List delivery history for a webhook subscription","operationId":"list_webhook_deliveries_v1_webhooks__subscription_id__deliveries_get","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Subscription Id"}},{"name":"after_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Cursor: return deliveries with id < after_id (list is newest-first)","title":"After Id"},"description":"Cursor: return deliveries with id < after_id (list is newest-first)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to successful (2xx) or failed deliveries","title":"Success"},"description":"Filter to successful (2xx) or failed deliveries"},{"name":"given_up","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to deliveries that exhausted retries (or not)","title":"Given Up"},"description":"Filter to deliveries that exhausted retries (or not)"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by event type (score, status, line_move, injury)","title":"Event Type"},"description":"Filter by event type (score, status, line_move, injury)"}],"responses":{"200":{"description":"Paginated delivery attempts, newest first. Retries appear as their own rows, linked via parent_delivery_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/estimate":{"post":{"tags":["events"],"summary":"Estimate the credit cost of a planned call (or batch of calls)","operationId":"estimate_cost_v1_estimate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateRequest"}}},"required":true},"responses":{"200":{"description":"Min/max credit range per requested call, plus totals. Costs are data-dependent (e.g. odds/intelligence/splits not yet ingested are free), so this is a range, not an exact number — the real call's X-Credits-Used response header reports what it actually billed. Estimating is always free (X-Credits-Used: 0).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateResponse","additionalProperties":true,"type":"object","title":"Response Estimate Cost V1 Estimate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/estimate/tools":{"get":{"tags":["events"],"summary":"List the tools /v1/estimate understands","operationId":"list_estimate_tools_v1_estimate_tools_get","responses":{"200":{"description":"Supported tool names, grouped by how their cost varies.","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Estimate Tools V1 Estimate Tools Get"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/v1/trial-key":{"post":{"tags":["trial"],"summary":"Issue an instant, unauthenticated trial API key","description":"Issues a throwaway API key with no signup or email verification — 100 lifetime credits, 14-day expiry, one per network per 7 days. Requires a valid Cloudflare Turnstile token. Intended for the 'Get instant trial key' button on /docs/ai, not for building a persistent integration — use /register for that.","operationId":"create_trial_key_v1_trial_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/keys":{"get":{"tags":["agent"],"summary":"List API keys","operationId":"get_keys_api_agent_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentApiKeyListResponse"}}}}},"security":[{"ApiKeyBearer":[]}]},"post":{"tags":["agent"],"summary":"Create an API key","operationId":"create_key_api_agent_keys_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentApiKey"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/api/agent/keys/{key_id}":{"delete":{"tags":["agent"],"summary":"Revoke an API key","operationId":"delete_key_api_agent_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentApiKeyRevokeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/api/agent/credits":{"get":{"tags":["agent"],"summary":"Get credit balance and usage","operationId":"get_credits_api_agent_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentCreditsResponse"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/api/agent/credit-packs":{"get":{"tags":["agent"],"summary":"List purchasable credit packs","operationId":"get_credit_packs_api_agent_credit_packs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditPackListResponse"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/api/agent/credits/topup":{"post":{"tags":["agent"],"summary":"Purchase a credit pack","operationId":"topup_credits_api_agent_credits_topup_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTopupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"ApiKeyBearer":[]}]}},"/mcp":{"post":{"tags":["mcp","mcp"],"summary":"MCP JSON-RPC endpoint (streamable HTTP)","operationId":"mcp_rpc_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AgentApiKey":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"key_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Prefix"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key","description":"Full API key — returned once on create."}},"additionalProperties":true,"type":"object","title":"AgentApiKey"},"AgentApiKeyListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AgentApiKey"},"type":"array","title":"Data","default":[]},"total":{"type":"integer","title":"Total","default":0}},"additionalProperties":true,"type":"object","title":"AgentApiKeyListResponse"},"AgentApiKeyRevokeResponse":{"properties":{"revoked":{"type":"boolean","title":"Revoked","default":true},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"}},"additionalProperties":true,"type":"object","title":"AgentApiKeyRevokeResponse"},"AgentCreditsResponse":{"properties":{"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"credits_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Used"},"credit_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credit Limit"},"bonus_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bonus Credits"},"total_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Remaining"},"period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"is_trial":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Trial"},"is_trial_expired":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Trial Expired"}},"additionalProperties":true,"type":"object","title":"AgentCreditsResponse"},"BatchEventsRequest":{"properties":{"event_ids":{"items":{"type":"integer"},"type":"array","maxItems":25,"minItems":1,"title":"Event Ids","description":"Event ids to fetch (max 25). Duplicates are billed once."},"include_odds":{"type":"boolean","title":"Include Odds","description":"Inline current odds on each event. Scoped by bookmaker (default: pinnacle). Does not add credits — each found event stays 1 credit.","default":false},"include_intelligence":{"type":"boolean","title":"Include Intelligence","description":"Inline bet intelligence on each event. Does not add credits.","default":false},"bookmaker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bookmaker","description":"Bookmaker for inlined odds and intelligence market prices. Defaults to pinnacle; 'all' or a comma-separated list for multiple books."}},"additionalProperties":true,"type":"object","required":["event_ids"],"title":"BatchEventsRequest"},"BatchEventsResponse":{"properties":{"events":{"items":{"$ref":"#/components/schemas/EventDetail"},"type":"array","title":"Events","default":[]},"not_found":{"items":{"type":"integer"},"type":"array","title":"Not Found","description":"Requested event_ids that don't exist. Never billed.","default":[]},"total":{"type":"integer","title":"Total","default":0}},"additionalProperties":true,"type":"object","title":"BatchEventsResponse"},"BetIntelligence":{"properties":{"bet_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bet Type","description":"Canonical bet token, e.g. ML_HOME/ML_AWAY/ML_DRAW (soccer), ML_P1/ML_P2 (head-to-head sports), SPREAD_HOME/SPREAD_AWAY, OVER, UNDER."},"player_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Role","description":"'home'/'away' for team sports or 'p1'/'p2' for head-to-head sports. Null for match-level tokens (OVER, UNDER, ML_DRAW), which are not about either side."},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Player ID when this bet is about an individual player; null for team bets and match-level tokens (OVER, UNDER, ML_DRAW)."},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Team ID when this bet is about a team; null for individual-player bets and match-level tokens (OVER, UNDER, ML_DRAW). A draw is not a bet on either team, so ML_DRAW carries no team_id — safe to sum exposure by team_id across bets without double-counting the draw."},"player_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Name","description":"Display name of the player or team this bet is about; null for match-level tokens (OVER, UNDER, ML_DRAW). Duplicates `players[player_role].name` for convenience when flattening bets[]."},"market":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Market","description":"Market quote used for this bet: {price: American odds, line: handicap/total line or null for moneyline, book: bookmaker slug when known}. For predictive-framework sports `book` is always populated from the assessment; for legacy sports it may be omitted. Present for every sport."},"computed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Computed At","description":"ISO-8601 UTC timestamp of when this bet's numbers last materially changed — not when they were last checked. The publisher re-runs on a schedule but only rewrites a row when the price, line, or probability moves beyond a tolerance, so an older `computed_at` means 'unchanged since', not 'stale'. Values legitimately differ between bets on the same event because each market moves independently."},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"Recommendation tier: 'very_high', 'strong', 'moderate', or 'avoid'. Null whenever `edge` is null — a tier ranks a bet against its price."},"confidence_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence Score","description":"Not published. Use `probability`."},"confidence_score_pre_validator":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence Score Pre Validator","description":"Not published."},"coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coverage","description":"Not published."},"signals":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Signals","description":"Not published."},"validator":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Validator","description":"Not published."},"narrative":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narrative","description":"Pick-defense rationale for a high-confidence main-line side — why THIS token hits, not a match preview or stat recap. Present only when Lumify made a pick on this token (`forecasts[]` row with `selected: true`, matching `bet_type`, and a research note). Null on the opposite side, on coin-flip markets, and when no pick was made."},"rationale":{"items":{"type":"string"},"type":"array","title":"Rationale","description":"Not published. Event-level context chips live on the top-level `rationale` of IntelligenceResponse.","default":[]},"attribution":{"items":{"type":"string"},"type":"array","title":"Attribution","description":"Not published.","default":[]},"probability":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Probability","description":"Published probability for this outcome, 0-1. Outcomes of the same market (e.g. ML_HOME + ML_DRAW + ML_AWAY) sum to 1. Present on the customer surface for MLB, soccer, and tennis."},"interval":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Interval","description":"[lo, hi] band around `probability`, 0-1. Read it as 'how much evidence backs this number', not as a statistical confidence interval. A freshly-opened, unmoved line gets a wider band than a heavily-traded one. Thin evidence widens this band rather than removing the response. Present on the customer surface for MLB, soccer, and tennis."},"p_model":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P Model","description":"Internal — omitted from customer payloads (MLB/soccer/tennis). Fitted model probability before blending with the market."},"p_market":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P Market","description":"Internal — omitted from customer payloads (MLB/soccer/tennis). De-vigged market probability before blending; use `probability` / `fair_price` instead."},"blend_w":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Blend W","description":"Internal — omitted from customer payloads (MLB/soccer/tennis). Weight on the model when blending with the market."},"fair_price":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fair Price","description":"American-odds fair price implied by `probability` — the vig-free line. Comparing it to `market.price` gives the bookmaker's margin on this side. Predictive-framework sports only."},"edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Edge","description":"Expected profit per 1 unit staked at `market.price`, i.e. `probability x decimal_odds - 1`. Positive means the price pays more than the probability justifies. Null when no model-backed edge is published (current MLB/soccer/tennis Stage 1). Present on the customer surface — null today, reserved for future recommend gating."},"sufficiency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sufficiency","description":"Internal — omitted from customer payloads (MLB/soccer/tennis). Evidence strength 0-1 used internally to set interval width."},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase","description":"Internal — omitted from customer payloads (MLB/soccer/tennis). Pipeline stage (`quant` / `full`)."},"model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Version","description":"Internal — omitted from customer payloads (MLB/soccer/tennis). Parameter-set identifier for traceability."},"drivers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Drivers","description":"Internal — omitted from customer payloads (MLB/soccer/tennis). Signed contributions to probability used in the assessment pipeline.","default":[]},"alignment":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Alignment","description":"Internal — omitted from customer payloads (MLB/soccer/tennis). Qualitative-overlay agreement detail."},"fair":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Fair","description":"Sharp-consensus fair price for this outcome: {probability, books, n_books, is_consensus}. `probability` is distinct from `p_market` (the *priced* book's own de-vigged probability) and from `fair_price` (American odds implied by the published `probability`, above) — it is the sharp-book reference a cross-book price gap is measured against (MLS: Pinnacle / `SOCCER_SHARP_BOOKS`; MLB: Pinnacle+Circa / `MLB_SHARP_BOOKS`). `is_consensus` is false whenever `n_books` < 2. Populated for MLS and MLB; null for other leagues until their market plane is wired. Predictive-framework sports only."},"edges_by_book":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Edges By Book","description":"Price gap versus the sharp-reference fair probability (`fair.probability`), keyed by bookmaker — `fair.probability × decimal_odds − 1` at each book's posted price. A line-shopping metric: rank soft books by these gaps (largest gap = furthest above the sharp reference). Populated for MLS (retail soft books for Price — Edge archive stays FanDuel/Hard Rock) and MLB (retail soft books: DK/FD/BetMGM/Caesars/Bet365/Hard Rock/BetOnline — Price surface; Edge allowlist remains independence-cleared DK/FD only). Null for other leagues or markets with no soft quote. Predictive-framework sports only."},"best":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Best","description":"Highest price-gap book across `edges_by_book`: {book, price, edge, quote_age_seconds}. Same metric as `edges_by_book`: price gap versus a de-vigged sharp reference. On MLB, `best_*` is Tier C / informational line-shopping even when the gap is positive (DK/FD ML and RL/totals are hard-null for Edge). Use `best.book`/`best.price` as the line-shopping target. `quote_age_seconds` is `best.book`'s posted-price age at publish — quotes older than 30 minutes are excluded. Populated for MLS and MLB; null otherwise or when `edges_by_book` is empty. Predictive-framework sports only."},"ev":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ev","description":"**Beta.** Customer-facing expected-value estimate: {beta: true, book, price, ev_pct, kelly_fraction, quote_age_seconds, n_books}. `ev_pct` is the selected book's price gap × 100 (`fair.probability × decimal − 1`); `kelly_fraction` is the full-Kelly stake, capped at 1.0. Not a new measurement — re-packages the same sharp-fair price gap as `best`/`edges_by_book`. Main-line tokens (moneyline, spreads, totals; tennis totals unpublished). A single sharp book (n=1 Pinnacle) is a valid fair reference; soccer and tennis never have a two-book sharp consensus. Gaps ≤ 0 or above 25% (stale-line artifact) are dropped. When `best` is a suppressed MLB moneyline book (DraftKings/FanDuel proven null, or BetMGM/Bet365/BetOnline unscreened), the next eligible book in `edges_by_book` is used. Spreads/totals do not inherit that suppression. Unverified market-consensus estimate — see docs/internal/sports/PREDICTIVE_CLAIM_LADDER.md."}},"additionalProperties":true,"type":"object","title":"BetIntelligence"},"Body_account_organization_update_account_organization_post":{"properties":{"organization_name":{"type":"string","title":"Organization Name"}},"type":"object","required":["organization_name"],"title":"Body_account_organization_update_account_organization_post"},"Body_account_password_change_account_password_post":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"},"new_password_confirm":{"type":"string","title":"New Password Confirm"}},"type":"object","required":["current_password","new_password","new_password_confirm"],"title":"Body_account_password_change_account_password_post"},"Body_account_profile_update_account_profile_post":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"}},"type":"object","required":["first_name","last_name"],"title":"Body_account_profile_update_account_profile_post"},"Body_admin_bet_intelligence_kill_switch_admin_bet_intelligence_kill_switch_post":{"properties":{"scope":{"type":"string","title":"Scope"},"engaged":{"type":"string","title":"Engaged"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["scope","engaged"],"title":"Body_admin_bet_intelligence_kill_switch_admin_bet_intelligence_kill_switch_post"},"Body_admin_bet_intelligence_set_mode_admin_bet_intelligence_mode_post":{"properties":{"sport_slug":{"type":"string","title":"Sport Slug"},"league_slug":{"type":"string","title":"League Slug","default":""},"mode":{"type":"string","title":"Mode"},"daily_research_budget":{"type":"string","title":"Daily Research Budget","default":""},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["sport_slug","mode"],"title":"Body_admin_bet_intelligence_set_mode_admin_bet_intelligence_mode_post"},"Body_admin_coupon_create_admin_coupons_create_post":{"properties":{"code":{"type":"string","title":"Code"},"credit_amount":{"type":"integer","title":"Credit Amount"},"description":{"type":"string","title":"Description","default":""},"max_uses":{"type":"string","title":"Max Uses","default":""},"expires_at":{"type":"string","title":"Expires At","default":""}},"type":"object","required":["code","credit_amount"],"title":"Body_admin_coupon_create_admin_coupons_create_post"},"Body_admin_customer_entitlements_admin_customers__customer_id__entitlements_post":{"properties":{"tier":{"type":"string","title":"Tier"},"monthly_credit_limit":{"type":"integer","title":"Monthly Credit Limit"},"bonus_credits":{"type":"integer","title":"Bonus Credits","default":0}},"type":"object","required":["tier","monthly_credit_limit"],"title":"Body_admin_customer_entitlements_admin_customers__customer_id__entitlements_post"},"Body_admin_customer_exclude_from_analytics_admin_customers__customer_id__exclude_from_analytics_post":{"properties":{"enabled":{"type":"string","title":"Enabled"}},"type":"object","required":["enabled"],"title":"Body_admin_customer_exclude_from_analytics_admin_customers__customer_id__exclude_from_analytics_post"},"Body_admin_customer_name_admin_customers__customer_id__name_post":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"Body_admin_customer_name_admin_customers__customer_id__name_post"},"Body_admin_job_health_mute_admin_job_health_mute_post":{"properties":{"fingerprint":{"type":"string","title":"Fingerprint"},"hours":{"type":"string","title":"Hours","default":"24"}},"type":"object","required":["fingerprint"],"title":"Body_admin_job_health_mute_admin_job_health_mute_post"},"Body_admin_plans_update_admin_plans__plan_id__update_post":{"properties":{"display_name":{"type":"string","title":"Display Name","default":""},"description":{"type":"string","title":"Description","default":""},"features":{"type":"string","title":"Features","default":""},"monthly_credits":{"type":"integer","title":"Monthly Credits","default":0},"price_monthly":{"type":"string","title":"Price Monthly","default":""},"price_annual":{"type":"string","title":"Price Annual","default":""},"rate_limit_per_minute":{"type":"string","title":"Rate Limit Per Minute","default":""},"rate_limit_per_hour":{"type":"string","title":"Rate Limit Per Hour","default":""},"max_api_keys":{"type":"string","title":"Max Api Keys","default":""},"stripe_product_id":{"type":"string","title":"Stripe Product Id","default":""},"stripe_price_id_monthly":{"type":"string","title":"Stripe Price Id Monthly","default":""},"is_active":{"type":"string","title":"Is Active","default":""},"is_public":{"type":"string","title":"Is Public","default":""}},"type":"object","title":"Body_admin_plans_update_admin_plans__plan_id__update_post"},"Body_admin_pricing_actuals_save_admin_pricing_actuals_save_post":{"properties":{"vendor":{"type":"string","title":"Vendor"},"operation":{"type":"string","title":"Operation"},"billing_month":{"type":"string","title":"Billing Month"},"actual_cost_usd":{"type":"string","title":"Actual Cost Usd"},"invoice_ref":{"type":"string","title":"Invoice Ref","default":""},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["vendor","operation","billing_month","actual_cost_usd"],"title":"Body_admin_pricing_actuals_save_admin_pricing_actuals_save_post"},"Body_admin_pricing_create_admin_pricing_create_post":{"properties":{"vendor":{"type":"string","title":"Vendor"},"operation":{"type":"string","title":"Operation"},"model":{"type":"string","title":"Model","default":""},"cost_per_request":{"type":"string","title":"Cost Per Request","default":""},"cost_per_1k_input_tokens":{"type":"string","title":"Cost Per 1K Input Tokens","default":""},"cost_per_1k_output_tokens":{"type":"string","title":"Cost Per 1K Output Tokens","default":""},"cost_per_1k_vectors":{"type":"string","title":"Cost Per 1K Vectors","default":""},"monthly_fee":{"type":"string","title":"Monthly Fee","default":""},"monthly_request_quota":{"type":"string","title":"Monthly Request Quota","default":""},"overage_cost_per_request":{"type":"string","title":"Overage Cost Per Request","default":""},"billing_cycle_day":{"type":"string","title":"Billing Cycle Day","default":"1"},"billing_group":{"type":"string","title":"Billing Group","default":""},"effective_date":{"type":"string","title":"Effective Date"},"primary_function":{"type":"string","title":"Primary Function","default":"search"},"billing_frequency":{"type":"string","title":"Billing Frequency","default":"per_query"},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["vendor","operation","effective_date"],"title":"Body_admin_pricing_create_admin_pricing_create_post"},"Body_admin_pricing_update_admin_pricing__config_id__update_post":{"properties":{"vendor":{"type":"string","title":"Vendor"},"operation":{"type":"string","title":"Operation"},"model":{"type":"string","title":"Model","default":""},"effective_date":{"type":"string","title":"Effective Date"},"cost_per_request":{"type":"string","title":"Cost Per Request","default":""},"cost_per_1k_input_tokens":{"type":"string","title":"Cost Per 1K Input Tokens","default":""},"cost_per_1k_output_tokens":{"type":"string","title":"Cost Per 1K Output Tokens","default":""},"cost_per_1k_vectors":{"type":"string","title":"Cost Per 1K Vectors","default":""},"monthly_fee":{"type":"string","title":"Monthly Fee","default":""},"monthly_request_quota":{"type":"string","title":"Monthly Request Quota","default":""},"overage_cost_per_request":{"type":"string","title":"Overage Cost Per Request","default":""},"billing_cycle_day":{"type":"string","title":"Billing Cycle Day","default":"1"},"billing_group":{"type":"string","title":"Billing Group","default":""},"primary_function":{"type":"string","title":"Primary Function","default":"search"},"billing_frequency":{"type":"string","title":"Billing Frequency","default":"per_query"},"is_active":{"type":"string","title":"Is Active","default":"1"},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["vendor","operation","effective_date"],"title":"Body_admin_pricing_update_admin_pricing__config_id__update_post"},"Body_admin_update_free_trial_daily_cap_admin_settings_free_trial_daily_cap_post":{"properties":{"daily_cap":{"type":"string","title":"Daily Cap","default":""}},"type":"object","title":"Body_admin_update_free_trial_daily_cap_admin_settings_free_trial_daily_cap_post"},"Body_admin_user_rate_limit_admin_users__user_id__rate_limit_post":{"properties":{"rate_limit_override":{"type":"string","title":"Rate Limit Override","default":""}},"type":"object","title":"Body_admin_user_rate_limit_admin_users__user_id__rate_limit_post"},"Body_admin_user_role_admin_users__user_id__role_post":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"Body_admin_user_role_admin_users__user_id__role_post"},"Body_admin_user_staff_role_admin_users__user_id__staff_role_post":{"properties":{"staff_role":{"type":"string","title":"Staff Role"}},"type":"object","required":["staff_role"],"title":"Body_admin_user_staff_role_admin_users__user_id__staff_role_post"},"Body_admin_user_toggle_admin_users__user_id__toggle_post":{"properties":{"status":{"type":"string","title":"Status","default":""}},"type":"object","title":"Body_admin_user_toggle_admin_users__user_id__toggle_post"},"Body_api_key_create_api_keys_post":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["name"],"title":"Body_api_key_create_api_keys_post"},"Body_billing_apply_coupon_billing_coupon_post":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"Body_billing_apply_coupon_billing_coupon_post"},"Body_billing_auto_recharge_billing_auto_recharge_post":{"properties":{"enabled":{"type":"string","title":"Enabled"},"threshold":{"type":"integer","title":"Threshold"}},"type":"object","required":["enabled"],"title":"Body_billing_auto_recharge_billing_auto_recharge_post"},"Body_billing_subscribe_billing_subscribe_post":{"properties":{"tier":{"type":"string","title":"Tier"},"billing_period":{"type":"string","title":"Billing Period","default":"monthly"}},"type":"object","required":["tier"],"title":"Body_billing_subscribe_billing_subscribe_post"},"Body_contact_submit_contact_us_post":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"email":{"type":"string","title":"Email"},"subject":{"type":"string","title":"Subject","default":"general"},"message":{"type":"string","title":"Message"}},"type":"object","required":["first_name","last_name","email","message"],"title":"Body_contact_submit_contact_us_post"},"Body_forgot_password_submit_forgot_password_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_forgot_password_submit_forgot_password_post"},"Body_login_submit_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"remember_me":{"type":"string","title":"Remember Me","default":""},"next":{"type":"string","title":"Next","default":""}},"type":"object","required":["email","password"],"title":"Body_login_submit_login_post"},"Body_newsletter_signup_newsletter_signup_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_newsletter_signup_newsletter_signup_post"},"Body_register_submit_register_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"password_confirm":{"type":"string","title":"Password Confirm"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"company":{"type":"string","title":"Company","default":""},"plan_intent":{"type":"string","title":"Plan Intent","default":""},"utm_source":{"type":"string","title":"Utm Source","default":""},"utm_medium":{"type":"string","title":"Utm Medium","default":""},"utm_campaign":{"type":"string","title":"Utm Campaign","default":""},"utm_term":{"type":"string","title":"Utm Term","default":""},"utm_content":{"type":"string","title":"Utm Content","default":""},"gclid":{"type":"string","title":"Gclid","default":""},"fbclid":{"type":"string","title":"Fbclid","default":""},"referrer_url":{"type":"string","title":"Referrer Url","default":""},"landing_page":{"type":"string","title":"Landing Page","default":""},"cf-turnstile-response":{"type":"string","title":"Cf-Turnstile-Response","default":""}},"type":"object","required":["email","password","password_confirm","first_name","last_name"],"title":"Body_register_submit_register_post"},"Body_reset_password_submit_reset_password_post":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"},"password_confirm":{"type":"string","title":"Password Confirm"}},"type":"object","required":["token","password","password_confirm"],"title":"Body_reset_password_submit_reset_password_post"},"CreditPack":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits"},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Cents"},"bonus_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bonus Credits"}},"additionalProperties":true,"type":"object","title":"CreditPack"},"CreditPackListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CreditPack"},"type":"array","title":"Data","default":[]},"total":{"type":"integer","title":"Total","default":0}},"additionalProperties":true,"type":"object","title":"CreditPackListResponse"},"CreditTopupResponse":{"properties":{"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"credits_added":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Added"},"bonus_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bonus Credits"},"pack_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pack Id"}},"additionalProperties":true,"type":"object","title":"CreditTopupResponse"},"EstimateCall":{"properties":{"tool":{"type":"string","title":"Tool","description":"The MCP tool / SDK call to estimate, e.g. 'get_event', 'batch_get_events', 'get_odds'. See GET /v1/estimate/tools for the full supported list."},"arguments":{"additionalProperties":true,"type":"object","title":"Arguments","description":"Same arguments you'd pass to that tool/endpoint, e.g. {\"event_id\": 123, \"include_odds\": true}."}},"additionalProperties":true,"type":"object","required":["tool"],"title":"EstimateCall"},"EstimateRequest":{"properties":{"calls":{"items":{"$ref":"#/components/schemas/EstimateCall"},"type":"array","maxItems":50,"minItems":1,"title":"Calls","description":"One or more planned calls to estimate in a single round-trip."}},"additionalProperties":true,"type":"object","required":["calls"],"title":"EstimateRequest"},"EstimateResponse":{"properties":{"estimates":{"items":{"$ref":"#/components/schemas/EstimateResult"},"type":"array","title":"Estimates"},"total_min_credits":{"type":"integer","title":"Total Min Credits"},"total_max_credits":{"type":"integer","title":"Total Max Credits"}},"additionalProperties":true,"type":"object","required":["estimates","total_min_credits","total_max_credits"],"title":"EstimateResponse"},"EstimateResult":{"properties":{"tool":{"type":"string","title":"Tool"},"min_credits":{"type":"integer","title":"Min Credits","description":"Cheapest realistic outcome (e.g. requested data not yet available)."},"max_credits":{"type":"integer","title":"Max Credits","description":"Priciest realistic outcome (e.g. all requested data is available)."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Why the cost varies, when it does."}},"additionalProperties":true,"type":"object","required":["tool","min_credits","max_credits"],"title":"EstimateResult"},"EventDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League"},"season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At","description":"ISO-8601 UTC start time."},"inprogress_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inprogress Since","description":"ISO-8601 UTC timestamp of the first ingest that marked this event inprogress (first live tick). Null until then; stays set after final. Walkovers and events that never went live are usually null. Not the same as starts_at, which can be a session floor (especially tennis)."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"clock":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clock"},"venue":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Venue"},"participants":{"items":{"$ref":"#/components/schemas/Participant"},"type":"array","title":"Participants","default":[]},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":true,"type":"object","required":["id"],"title":"EventDetail"},"EventListResponse":{"properties":{"events":{"items":{"$ref":"#/components/schemas/EventSummary"},"type":"array","title":"Events","default":[]},"total":{"type":"integer","title":"Total","default":0},"next_after_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next After Id"}},"additionalProperties":true,"type":"object","title":"EventListResponse"},"EventSummary":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League"},"season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At","description":"ISO-8601 UTC start time."},"inprogress_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inprogress Since","description":"ISO-8601 UTC timestamp of the first ingest that marked this event inprogress (first live tick). Null until then; stays set after final. Walkovers and events that never went live are usually null. Not the same as starts_at, which can be a session floor (especially tennis)."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"clock":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clock"},"venue":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Venue"}},"additionalProperties":true,"type":"object","required":["id"],"title":"EventSummary"},"ForecastDriver":{"properties":{"id":{"type":"string","title":"Id","description":"Namespaced driver id. Player-prop rows: typically `player.l10_rate` — the recent-form counting-stat rate that fed the Poisson step (also `player.season_rate` when L10 is too thin). Main-line rows would use a different namespace (e.g. a rating or surface split) once a main-line forecast model ships."},"input":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Input","description":"Measured rate/rating behind this driver, in the units native to the underlying model (e.g. 0.27 runs/game, 7.4 strikeouts/start for the prop rate model). This is λ before the Poisson vs the posted line on prop rows."},"effect":{"type":"number","title":"Effect","description":"Signed shift in `p_hit` versus a baseline case on the same line, in probability units. Positive / `direction=up` means this driver lifts the chosen outcome. 0.0 on yardage markets (league means are diluted by backups)."},"direction":{"type":"string","title":"Direction","description":"`up` when `effect` > 0, `down` when `effect` < 0, `neutral` at zero."}},"additionalProperties":true,"type":"object","required":["id","effect","direction"],"title":"ForecastDriver"},"ForecastWager":{"properties":{"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id","description":"Lumify event ID. Present on the daily slate (`GET /v1/intelligence/forecasts`); omitted on `GET /v1/events/{id}/intelligence` `forecasts[]` (the event is the path)."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Sport slug. Slate only."},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League","description":"League slug, if any. Slate only."},"commence_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commence Time","description":"ISO-8601 UTC scheduled start. Slate only."},"home_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team","description":"Home team display name. Slate only."},"away_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team","description":"Away team display name. Slate only."},"player":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player","description":"Player display name from the priced line. Null on main-line rows with no player attribution (`bet_type` is a match-level token like OVER/UNDER/ML_DRAW)."},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Lumify player ID. Bound by exact / Jr-stripped name match to the priced line. Null on main-line rows with no player attribution."},"bet_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bet Type","description":"Main-line token when this row is a main-line forecast — `ML_P1`/`ML_P2`/`ML_HOME`/`ML_AWAY`/`ML_DRAW`, `SPREAD_P1`/`SPREAD_P2`/`SPREAD_HOME`/`SPREAD_AWAY`, or `OVER`/`UNDER` (same vocabulary as `bets[].bet_type` and `list_ev`). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis sets `ML_P1`/`ML_P2` (moneyline, ranking Bradley-Terry), `SPREAD_P1`/`SPREAD_P2` (game handicap), and `OVER`/`UNDER` (total games — soft-book game-unit lines only, never Pinnacle's set-unit total). NFL / NCAAF / MLB / soccer set the same tokens from a high-confidence assessment lean (one side per market; coin flips are not emitted as picks)."},"player_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Role","description":"`home`/`away` for team sports or `p1`/`p2` for head-to-head sports, set only alongside a non-null `bet_type`. Null for player-prop rows and for match-level main-line tokens (OVER, UNDER, ML_DRAW)."},"market":{"type":"string","title":"Market","description":"Player-prop rows: prop category — counting stats. MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing_yards, rushing_yards, receiving_yards, receptions, passing_tds, rushing_tds, touchdowns (anytime-TD combo: rushing + receiving + defensive TDs), rush_rec_yards, pass_rush_yards. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (when `bet_type` is set): the main-line family — `h2h`, `spreads`, or `totals`."},"line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line","description":"Posted line the model was scored against. Player-prop and `totals` main-line rows: Over/Under number. `spreads` main-line rows: the spread number. Null on `h2h`/moneyline rows."},"side":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Side","description":"Player-prop rows: `over` or `under` — the more likely side given the player's shrunken rate versus `line`. The model always picks one when the line is in range. Null on main-line rows — read the picked outcome from `bet_type` instead."},"p_hit":{"type":"number","title":"P Hit","description":"Model probability (0–1) that the picked outcome (`side` on prop rows, `bet_type` on main-line rows) hits. Prop rows: built from the player's shrunken counting-stat rate (Poisson vs the posted Over/Under). Optional `research` may nudge a prop's `p_hit` by at most ±0.03; the chosen side stays the same."},"interval":{"items":{"type":"number"},"type":"array","title":"Interval","description":"`[lo, hi]` stated band around `p_hit`. Wider when `sufficiency` is low (thin recent sample). A stated evidence band, not a statistical confidence interval."},"sufficiency":{"type":"number","title":"Sufficiency","description":"Evidence weight on 0–1: n / (n + 12), where n is the recent-form game count (typically L10). A player with 10 recent games has sufficiency ≈ 0.45 — about half the rate is player-observed, half prior. The wager still ships at any sufficiency; this field tells you how much of `p_hit` is earned from this player's own boxes."},"reliability":{"type":"string","title":"Reliability","description":"Badge on this sport×market cell: `emerging`, `moderate`, `high`, or `informational`. v0 ships `emerging` for every wager; cells promote as a scored history accumulates."},"conviction":{"type":"number","title":"Conviction","description":"Board rank key on 0–1: |p_hit − 0.5| × 2 × sufficiency × research multiplier. A 0.76 call on a thin sample ranks below a 0.62 call on a long one. Highest conviction first on the daily slate."},"model_version":{"type":"string","title":"Model Version","description":"Scorer version, e.g. `forecast-v0`."},"selected":{"type":"boolean","title":"Selected","description":"True when this wager is on the daily board (top conviction, up to 3 per event / 25 on the slate). On `GET /intelligence` the array includes both selected rows and the rest of the event catalog."},"books":{"additionalProperties":true,"type":"object","title":"Books","description":"American price for the picked outcome, keyed by bookmaker slug (e.g. `{draftkings: -453}`). Posted market price for the side/bet_type the model picked — use it to see what books are charging for that outcome."},"drivers":{"items":{"$ref":"#/components/schemas/ForecastDriver"},"type":"array","title":"Drivers","description":"Signed contributions that moved `p_hit`. Read `input` as the measured rate/rating behind the pick and `effect` as how far it lifts (or lowers) the chosen outcome versus a baseline on the same line.","default":[]},"research":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Research","description":"Optional Deep Research overlay when the background job has written a row for this wager — every wager on the daily board (`selected: true`), plus other high-probability wagers (`p_hit` ≥ 0.80) in the catalog: `{stance, conviction, note}`. `stance` is `validate` / `neutral` / `invalidate`. `note` is the wager-level why (the fact the model cannot see) — on a selected main-line row it is also copied to `bets[].narrative`. Validate / invalidate rows always carry a note. Validate nudges `p_hit` up by at most 0.03 and lifts conviction. Invalidate drops the wager from `forecasts[]` and the daily board — it is not a recommended pick. The chosen `side` stays the same. Null means read `p_hit` from the rate model alone — missing research is fail-open, not a 400."}},"additionalProperties":true,"type":"object","required":["market","p_hit","interval","sufficiency","reliability","conviction","model_version","selected","books"],"title":"ForecastWager"},"ForecastsResponse":{"properties":{"sport":{"type":"string","title":"Sport","description":"Sport slug this slate was scored for."},"date":{"type":"string","title":"Date","description":"UTC slate date (YYYY-MM-DD)."},"model_version":{"type":"string","title":"Model Version","description":"Scorer version used for every wager on this page."},"reliability":{"type":"string","title":"Reliability","description":"Default badge on this slate. v0 ships `emerging`; each wager repeats the same field. Cells promote as a scored history accumulates."},"wagers":{"items":{"$ref":"#/components/schemas/ForecastWager"},"type":"array","title":"Wagers","description":"Selected forecasted wagers, highest `conviction` first. Empty is still 200 and still 1 credit — nothing on the slate for this sport/date.","default":[]},"total":{"type":"integer","title":"Total","description":"Count of `wagers` on this page."}},"additionalProperties":true,"type":"object","required":["sport","date","model_version","reliability","total"],"title":"ForecastsResponse"},"GradeSlipBranding":{"properties":{"attribution":{"type":"string","title":"Attribution","description":"Always 'Graded by Lumify' on this surface."},"links":{"additionalProperties":{"type":"string"},"type":"object","title":"Links","default":{}}},"additionalProperties":true,"type":"object","required":["attribution"],"title":"GradeSlipBranding"},"GradeSlipEventResolve":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"resolved|ambiguous|not_found|error"},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"candidates":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Candidates","description":"Event candidates when status is ambiguous. Empty on a unique bind."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"additionalProperties":true,"type":"object","title":"GradeSlipEventResolve"},"GradeSlipHonesty":{"properties":{"notes":{"items":{"type":"string"},"type":"array","title":"Notes","default":[]}},"additionalProperties":true,"type":"object","title":"GradeSlipHonesty"},"GradeSlipLeg":{"properties":{"input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input","description":"Parse echo of the leg (player, market_key, line, side, sport, team). Informational only — prefer market + resolve for the IDs and line that were actually graded."},"resolve":{"anyOf":[{"$ref":"#/components/schemas/GradeSlipResolve"},{"type":"null"}]},"team_resolve":{"anyOf":[{"$ref":"#/components/schemas/GradeSlipTeamResolve"},{"type":"null"}],"description":"Team mention on a free-text leg. A unique team_id scopes the player; ambiguous/not_found stays visible on the unmapped leg."},"event_resolve":{"anyOf":[{"$ref":"#/components/schemas/GradeSlipEventResolve"},{"type":"null"}],"description":"Event bind on a free-text leg. A unique event_id is graded; ambiguous/not_found stays visible with candidates. Null on structured legs that already supplied event_id."},"market":{"anyOf":[{"$ref":"#/components/schemas/GradeSlipMarket"},{"type":"null"}]},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current","description":"Number compared to the line: prop box count, totals home+away, spreads home−away. Null on moneyline (read market.home_score / away_score) and when unmapped."},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result","description":"Props: in_progress | over | under | push | dnp | no_stat. Spreads and moneyline: won | lost | push | void | in_progress. Totals: over | under | push | void | in_progress. Null when unmapped."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"additionalProperties":true,"type":"object","title":"GradeSlipLeg"},"GradeSlipLegInput":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event id."},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Lumify player id from resolve_player or GET /v1/players. Required on player-prop markets. Forbidden on h2h, spreads, totals, and team_total."},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team id from resolve_team or GET /v1/teams. Required on team_total. Forbidden on player-prop, h2h, spreads, and totals (those use side=home|away, not a team id)."},"market_key":{"type":"string","title":"Market Key","description":"Settleable player-prop slug (e.g. receiving_yards), game market h2h | spreads | totals, or team_total. Common aliases are accepted: player_reception_yds -> receiving_yards, moneyline/ml -> h2h, spread -> spreads, total/ou -> totals, team totals/tt -> team_total."},"line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line","description":"Submitted ticket line to grade against the official score. Required on player-prop, spreads, totals, and team_total legs — signed to the side on the ticket (e.g. side=home with a home -3.5 favorite is line=-3.5, not 3.5). Omit on h2h."},"side":{"type":"string","title":"Side","description":"Player-prop, totals, and team_total: over | under (o | u also accepted). Spreads: home | away — matches the signed line above, not the favorite. Moneyline: home | away, or draw on soccer three-way."}},"additionalProperties":true,"type":"object","required":["event_id","market_key","side"],"title":"GradeSlipLegInput"},"GradeSlipMarket":{"properties":{"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"market_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Key"},"line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line"},"side":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Side"},"settleable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Settleable"},"home_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team","description":"Null when the event never resolved to a row."},"away_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team","description":"Null when the event never resolved to a row."},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At","description":"ISO-8601 UTC kickoff/first-pitch time. Null when the event never resolved to a row."},"home_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Score","description":"Official home (or player_1) numeric score. Null on tennis set-strings and when the event never resolved."},"away_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Score","description":"Official away (or player_2) numeric score. Null on tennis set-strings and when the event never resolved."},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"The team whose score was graded on a team_total leg. Null on other markets."}},"additionalProperties":true,"type":"object","title":"GradeSlipMarket"},"GradeSlipOptions":{"properties":{"include_branding":{"type":"boolean","title":"Include Branding","description":"Attribution block is always present in this version.","default":true},"max_legs":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Max Legs","description":"v0 cap is 8 legs.","default":8},"auto_resolve":{"type":"boolean","title":"Auto Resolve","description":"When free-text uniquely resolves a player and event, grade that leg. Ambiguous resolve never auto-picks a candidate.","default":true}},"additionalProperties":true,"type":"object","title":"GradeSlipOptions"},"GradeSlipRequest":{"properties":{"legs":{"items":{"$ref":"#/components/schemas/GradeSlipLegInput"},"type":"array","title":"Legs","description":"Structured legs (preferred). Cap 8."},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"Free-text slip (e.g. \"Chase over 74.5 receiving yards tonight\"). Date words (today, tonight, yesterday, last night, last Wednesday, this Thursday, or an ISO date) narrow the event window. A roster-team mention (CIN, Niners) is resolved first — a unique team_id scopes the player; ambiguous/not_found stays on team_resolve. vs/at on a player prop is the opponent and narrows the event, not the player's team. Game phrases also include Yankees to win, Yankees over 4.5 runs (team_total), and Over 52.5 Syracuse vs Pittsburgh. A colliding nickname plus a date promotes only the unique in-window team; a football-sized line will not pick a baseball club, and vs plus that date keeps the unique matchup. A tennis moneyline with a full player name (Novak Djokovic ML) binds as a player, not a team; vs names the opponent player. Last-name-only tennis stays unmapped. A last-name-only player prop (Bergeron over 1.5 shots on goal last night) grades when a date is present and that surname is unique in scope — a named sport, team, or event narrows it (Johnson nhl last night); with no such clue, uniqueness is across every prop sport visible to the key. No date, or a surname shared by more than one player in that scope, still stays unmapped unless a date is present and exactly one of those candidates played in the window (optionally vs a named opponent). \"anytime goal\"/\"anytime assist\" implies soccer_goals/soccer_assists over 0.5 with no explicit number; \"over a hit\"/\"over a homer\" implies hits/home_runs over 1.0. Graded only when player and event resolve uniquely. Otherwise unmapped with candidates on resolve / team_resolve / event_resolve — free text never invents a grade."},"clues":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Clues","description":"Optional sport / league / event_id / team_id / team_text clues for free-text mode."},"options":{"$ref":"#/components/schemas/GradeSlipOptions"}},"additionalProperties":true,"type":"object","title":"GradeSlipRequest"},"GradeSlipResolve":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"resolved|ambiguous|not_found|error"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"candidates":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Candidates","description":"Player candidates when status is ambiguous. Empty on a unique bind."}},"additionalProperties":true,"type":"object","title":"GradeSlipResolve"},"GradeSlipResponse":{"properties":{"status":{"type":"string","title":"Status","description":"graded | partial | pending | unmapped"},"legs":{"items":{"$ref":"#/components/schemas/GradeSlipLeg"},"type":"array","title":"Legs"},"summary":{"$ref":"#/components/schemas/GradeSlipSummary"},"branding":{"$ref":"#/components/schemas/GradeSlipBranding"},"honesty":{"$ref":"#/components/schemas/GradeSlipHonesty"},"slip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slip Id","description":"Null in this version; share URLs are not persisted."}},"additionalProperties":true,"type":"object","required":["status","legs","summary","branding","honesty"],"title":"GradeSlipResponse"},"GradeSlipSummary":{"properties":{"graded":{"type":"integer","title":"Graded","default":0},"pending":{"type":"integer","title":"Pending","default":0},"unmapped":{"type":"integer","title":"Unmapped","default":0},"hits":{"type":"integer","title":"Hits","default":0},"misses":{"type":"integer","title":"Misses","default":0},"pushes":{"type":"integer","title":"Pushes","default":0},"voids":{"type":"integer","title":"Voids","description":"Walkover, cancel, postpone, suspend, or retired legs. Not a miss and not unmapped.","default":0}},"additionalProperties":true,"type":"object","title":"GradeSlipSummary"},"GradeSlipTeamResolve":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"resolved|ambiguous|not_found|error"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League"},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons"},"sport_conflict":{"type":"boolean","title":"Sport Conflict","default":false},"candidates":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Candidates"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"additionalProperties":true,"type":"object","title":"GradeSlipTeamResolve"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InjuriesResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"false until the injury monitor has written at least one structured report for this event. available:false is not charged.","default":false},"last_checked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Checked At","description":"ISO-8601 UTC of the most recent Tier 1 search, any outcome."},"confirmed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmed At","description":"ISO-8601 UTC of the guaranteed pre-kickoff confirmation for this event (sport-timed: NFL/NCAAF ~T-90min, MLB ~T-2.5h, soccer/NBA/NHL/NCAAB ~T-60min, tennis ~T-30min). Null until that checkpoint has run."},"next_check_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Check At","description":"ISO-8601 UTC of the next scheduled cadence check; null if watching stopped."},"injuries":{"items":{"$ref":"#/components/schemas/InjuryItem"},"type":"array","title":"Injuries","description":"Per-player status rows. Empty when available is false."}},"additionalProperties":true,"type":"object","required":["event_id"],"title":"InjuriesResponse"},"InjuryItem":{"properties":{"player":{"type":"string","title":"Player","description":"Player display name as extracted (always present)."},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Lumify player ID when the name bound to a roster/participant row; null if unmatched."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"Team display name when resolved; null for unmatched or tennis singles. When player_id is bound and the player's current roster team is one of this event's two participants, that roster team is served — not a stale or mis-attributed stored value."},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team ID when resolved; null for unmatched or tennis singles. Same roster-current-team preference as team."},"status":{"type":"string","title":"Status","description":"Participation designation: out, doubtful, questionable, probable, day_to_day, ir, suspended, or available."},"previous_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Status","description":"Prior status for this player on this event; null on first sighting."},"body_part":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Part","description":"Injured body part when reported (e.g. ankle, hamstring)."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Short factual note from the source."},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"Citation URL for the latest status."},"severity":{"type":"string","title":"Severity","description":"info (reconfirmed/unchanged, or a first sighting of a routine questionable/probable/day_to_day/available tag with no prior status to compare against), material (a real status change, including a first-seen out/doubtful/ir/suspended), or critical (out/doubtful from available/probable with ≤6h to start)."},"last_changed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Changed At","description":"ISO-8601 UTC timestamp of the last status transition."}},"additionalProperties":true,"type":"object","required":["player","status","severity"],"title":"InjuryItem"},"IntelligenceEvOpportunity":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID this opportunity belongs to."},"sport":{"type":"string","title":"Sport","description":"Sport slug."},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League","description":"League slug, if any."},"commence_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commence Time","description":"ISO-8601 UTC scheduled start."},"home_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team","description":"Home team (or player_1) display name."},"away_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team","description":"Away team (or player_2) display name."},"side":{"type":"string","title":"Side","description":"'home', 'away', 'p1', 'p2', 'draw', 'over', or 'under'."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"Display name of the side; 'Draw' / 'Over' / 'Under' for ML_DRAW / OVER / UNDER."},"bet_type":{"type":"string","title":"Bet Type","description":"Main-line token. h2h: ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW. spreads: SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY. totals: OVER/UNDER."},"line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line","description":"Posted line for spreads and totals. Null on moneyline."},"fair_probability":{"type":"number","title":"Fair Probability","description":"Sharp-fair probability (0–1) the gap is measured against."},"ev":{"additionalProperties":true,"type":"object","title":"Ev","description":"Same Beta object as `bets[].ev` on GET /intelligence: {beta, book, price, ev_pct, kelly_fraction, quote_age_seconds, n_books}."}},"additionalProperties":true,"type":"object","required":["event_id","sport","side","bet_type","fair_probability","ev"],"title":"IntelligenceEvOpportunity"},"IntelligenceEvResponse":{"properties":{"sport":{"type":"string","title":"Sport","description":"Sport slug this scan was run for."},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League","description":"League filter, or null when the scan covered the whole sport."},"market":{"type":"string","title":"Market","description":"Main-line family scanned: h2h (moneyline), spreads, or totals.","default":"h2h"},"min_ev":{"type":"number","title":"Min Ev","description":"Minimum EV% applied to this response."},"max_ev":{"type":"number","title":"Max Ev","description":"Stale-line cap; opportunities above this EV% are dropped."},"book":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Book","description":"Book filter, or null when every eligible book was considered."},"beta":{"type":"boolean","title":"Beta","description":"Always true — this surface is an unverified market-consensus estimate.","default":true},"opportunities":{"items":{"$ref":"#/components/schemas/IntelligenceEvOpportunity"},"type":"array","title":"Opportunities","description":"Positive-EV main-line rows for the requested market, sorted by ev_pct descending. Empty when nothing currently clears the gates — still 200, still 1 credit.","default":[]},"total":{"type":"integer","title":"Total","description":"Count of `opportunities` on this page."}},"additionalProperties":true,"type":"object","required":["sport","min_ev","max_ev","total"],"title":"IntelligenceEvResponse"},"IntelligenceResponse":{"properties":{"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id","description":"Lumify event ID this intelligence describes. Present on the standalone endpoint; omitted when inlined under an event via include_intelligence."},"available":{"type":"boolean","title":"Available","description":"False when no predictive `bets[]` have been computed for this event yet. `forecasts[]` can still populate on MLB / NFL / NCAAF / NBA / NCAAB / NHL / tennis. The request is free only when `available` is false and `forecasts` is empty.","default":false},"odds_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Odds Source","description":"Bookmaker `bets[].market` prices were sourced from. For predictive intelligence this is the assessment's market_book (not a live `?bookmaker=` overlay)."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Sport slug for this event."},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League","description":"League slug for this event, if any."},"players":{"additionalProperties":true,"type":"object","title":"Players","description":"Home/away (or p1/p2) participant identification, keyed by role: {role: {name, player_id, team_id}}.","default":{}},"has_recommend":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Recommend","description":"True when at least one bet meets the recommendation threshold; false when none do; null when intelligence has not been computed for this event. For predictive-framework sports a recommendation requires a non-null `tier` derived from `edge`, so this is false while Edge is not yet published (current MLB/soccer/tennis Stage 1)."},"match_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Overview","description":"Natural-language pre-game preview of the matchup — form, context, and what to watch. Written before kickoff by a Search-backed overlay on every event sport (MLB, NFL, NCAAF, NBA, NCAAB, NHL, soccer, tennis); sport-shaped queries so tennis does not invent pitchers. The request path only reads the stored row. Null when the pre-kickoff job has not run or the fixture was not eligible."},"rationale":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Rationale","description":"Event-level factual pre-game matchup chips (injuries, recent form, lineup/availability news — sport-shaped). Written before kickoff; the request path only reads the stored row. Null when not generated."},"intelligence_updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intelligence Updated At","description":"ISO-8601 UTC timestamp of the most recent change anywhere in this payload — the maximum of the per-bet `computed_at` values for predictive-framework sports. Because individual markets are only rewritten when they move, use the per-bet `computed_at` to reason about a specific bet rather than this event-level maximum."},"bets":{"items":{"$ref":"#/components/schemas/BetIntelligence"},"type":"array","title":"Bets","description":"One entry per priced bet token on the predictive intelligence surface. Outcomes of the same market sum to 1.","default":[]},"forecasts":{"items":{"$ref":"#/components/schemas/ForecastWager"},"type":"array","title":"Forecasts","description":"Forecasted Over/Under player-prop wagers for this event from the same rate model as `GET /v1/intelligence/forecasts`. `selected` marks the top-conviction rows that also appear on the daily slate; the rest of the event catalog is included with `selected: false`. Empty when the sport is outside MLB / NFL / NCAAF / NBA / NCAAB / NHL / tennis, or no strictly-matched two-way main is in range (props) / no ranked two-way moneyline (tennis). Same wager object as the slate — see `ForecastWager`.","default":[]},"matchup":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Matchup","description":"Not returned. Use `GET /v1/events/{id}/stats` for pitcher/lineup Data."}},"additionalProperties":true,"type":"object","title":"IntelligenceResponse"},"LeagueSummary":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation"},"league_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Type"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"current_season":{"anyOf":[{"$ref":"#/components/schemas/SeasonSummary"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"LeagueSummary"},"MlbStatsBatterLine":{"properties":{"player_id":{"type":"integer","title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Player full name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation, e.g. '1B', 'SS', 'DH'. Sourced from this exact box score row when available (per-game accurate — matters for two-way players), else this event's own ingested lineup, else falls back to the player's season-level roster position."},"at_bats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"At Bats","description":"At-bats in this game."},"runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Runs","description":"Runs scored in this game."},"hits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hits","description":"Hits in this game (batting). Distinct from pitcher `hits_allowed`."},"rbi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rbi","description":"Runs batted in in this game."},"doubles":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Doubles","description":"Doubles in this game."},"triples":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Triples","description":"Triples in this game."},"home_runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Runs","description":"Home runs in this game (batting)."},"walks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Walks","description":"Walks drawn in this game."},"strikeouts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Strikeouts","description":"Strikeouts as a batter in this game."},"stolen_bases":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stolen Bases","description":"Stolen bases in this game."},"caught_stealing":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Caught Stealing","description":"Caught-stealing in this game."},"hit_by_pitch":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hit By Pitch","description":"Times hit by pitch in this game."},"left_on_base":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Left On Base","description":"Runners left on base in this game."}},"additionalProperties":true,"type":"object","required":["player_id"],"title":"MlbStatsBatterLine"},"MlbStatsHeadToHead":{"properties":{"window":{"type":"integer","title":"Window","description":"Max trailing meetings considered (see `windows.head_to_head`)."},"meetings":{"items":{"$ref":"#/components/schemas/MlbStatsHeadToHeadMeeting"},"type":"array","title":"Meetings","description":"Most-recent-first past meetings between these two teams, up to `window`.","default":[]},"total":{"type":"integer","title":"Total","description":"Number of meetings returned in `meetings`.","default":0}},"additionalProperties":true,"type":"object","required":["window"],"title":"MlbStatsHeadToHead"},"MlbStatsHeadToHeadMeeting":{"properties":{"home_runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Runs","description":"Runs scored by this event's home team in that past meeting."},"away_runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Runs","description":"Runs scored by this event's away team in that past meeting."}},"additionalProperties":true,"type":"object","title":"MlbStatsHeadToHeadMeeting"},"MlbStatsLineup":{"properties":{"available":{"type":"boolean","title":"Available","description":"False when no lineup has been ingested yet for this side."},"batting_order":{"items":{"$ref":"#/components/schemas/MlbStatsLineupPlayer"},"type":"array","title":"Batting Order","description":"The 9 starting batters, ordered by `batting_order` (1-9).","default":[]},"starting_pitcher":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsLineupPlayer"},{"type":"null"}],"description":"This side's starting pitcher. Null when unavailable."},"bench":{"items":{"$ref":"#/components/schemas/MlbStatsLineupPlayer"},"type":"array","title":"Bench","description":"Players who entered the game but weren't in the starting lineup (pinch hitters, relievers, defensive subs).","default":[]},"captured_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captured At","description":"When this lineup was captured from the source, 'YYYY-MM-DD HH:MM:SS'."}},"additionalProperties":true,"type":"object","required":["available"],"title":"MlbStatsLineup"},"MlbStatsLineupPlayer":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation, e.g. '1B', 'SS', 'P'."},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Lumify player ID."},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role","description":"'batter' or 'pitcher'."},"batting_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Batting Order","description":"Batting order slot (1-9) for starters with role='batter'. Null for pitchers and subs."},"starter":{"type":"boolean","title":"Starter","description":"True in `batting_order`/`starting_pitcher`, false in `bench`.","default":false}},"additionalProperties":true,"type":"object","title":"MlbStatsLineupPlayer"},"MlbStatsPitcherLine":{"properties":{"player_id":{"type":"integer","title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Player full name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation (typically 'P'). Sourced from this exact box score row when available (per-game accurate — matters for two-way players), else this event's own ingested lineup, else falls back to the player's season-level roster position."},"innings_pitched":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Innings Pitched","description":"Innings pitched in baseball notation (e.g. 6.1 = 6⅓). Not additive — use `outs` for math."},"outs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outs","description":"Outs recorded in this game (additive; 3 outs = 1 inning)."},"games_started":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Games Started","description":"1 if this pitcher started the game, 0 if they appeared in relief."},"earned_runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Earned Runs","description":"Earned runs allowed in this game."},"hits_allowed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hits Allowed","description":"Hits allowed in this game. Distinct from batter `hits`."},"runs_allowed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Runs Allowed","description":"Runs allowed in this game."},"walks_allowed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Walks Allowed","description":"Walks allowed in this game."},"strikeouts_pitched":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Strikeouts Pitched","description":"Strikeouts recorded as a pitcher in this game."},"home_runs_allowed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Runs Allowed","description":"Home runs allowed in this game."},"hit_batsmen":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hit Batsmen","description":"Batters hit by this pitcher in this game."},"pitches_thrown":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pitches Thrown","description":"Pitches thrown in this game."},"strikes_thrown":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Strikes Thrown","description":"Strikes thrown in this game."},"batters_faced":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Batters Faced","description":"Batters faced in this game."}},"additionalProperties":true,"type":"object","required":["player_id"],"title":"MlbStatsPitcherLine"},"MlbStatsPlayerBox":{"properties":{"available":{"type":"boolean","title":"Available","description":"False until this event has at least one ingested player-stat row for this side. Pregame stays available:false. In-progress and delayed games become available once the live box refresh has written rows."},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"ISO timestamp of the newest ingested player-stat row on this side. Null when available is false."},"batters":{"items":{"$ref":"#/components/schemas/MlbStatsBatterLine"},"type":"array","title":"Batters","description":"This game's batting lines, sorted by name. Raw counting stats only — no per-player AVG/OBP/SLG. Two-way players also appear on `pitchers`.","default":[]},"pitchers":{"items":{"$ref":"#/components/schemas/MlbStatsPitcherLine"},"type":"array","title":"Pitchers","description":"This game's pitching lines, sorted starter-first (`games_started` desc), then `outs` desc, then name. Raw counting stats only — no per-player ERA/WHIP. Two-way players also appear on `batters`.","default":[]}},"additionalProperties":true,"type":"object","required":["available"],"title":"MlbStatsPlayerBox"},"MlbStatsRatesBlock":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'player_game_stats_sum' (own box scores, summed to team level)."},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window","description":"Which rolling window this block covers: 'l5' (see `window_size` for the fixed game count) or 'season' (an intentionally variable-length window — see `games` for how many games it actually covers for this team)."},"window_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Size","description":"Fixed sample depth for this window, only present when the window has one (e.g. 5 for 'l5'). Omitted for 'season' — use `games` instead."},"games":{"type":"integer","title":"Games","description":"Games with box-score data included in this aggregate.","default":0},"at_bats":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"At Bats","description":"Avg. team at-bats per game."},"hits":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hits","description":"Avg. team hits per game."},"runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Runs","description":"Avg. team runs scored per game."},"home_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Runs","description":"Avg. team home runs per game."},"walks":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Walks","description":"Avg. team walks (bases on balls) drawn per game."},"strikeouts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Strikeouts","description":"Avg. team batter strikeouts per game."},"doubles":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Doubles","description":"Avg. team doubles per game."},"triples":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Triples","description":"Avg. team triples per game."},"rbi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rbi","description":"Avg. team runs batted in per game."},"hit_by_pitch":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hit By Pitch","description":"Avg. team hit-by-pitch plate appearances per game."},"stolen_bases":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stolen Bases","description":"Avg. team stolen bases per game."},"total_bases":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Bases","description":"Avg. team total bases per game (H + 2B + 2·3B + 3·HR). Null when any TB component (hits/doubles/triples/home_runs) is missing from the window."},"batting_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Batting Avg","description":"Team batting average across the window: total hits / total at-bats (not an average of per-game averages)."},"obp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Obp","description":"Team on-base percentage across the window: (H + BB + HBP) / (AB + BB + HBP). Sacrifice flies are not in Path A box ingest, so SF is omitted from the denominator (slightly higher than official OBP when SF > 0)."},"slg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slg","description":"Team slugging percentage across the window: total bases / total at-bats."},"ops":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ops","description":"Team OPS across the window: obp + slg (same SF caveat as `obp`)."},"outs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Outs","description":"Avg. team outs recorded per game. The additive unit behind innings_pitched/ERA/WHIP/K9/BB9."},"innings_pitched":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Innings Pitched","description":"Avg. team innings pitched per game as true innings (total outs ÷ 3 ÷ games). Not baseball notation — see starting_pitcher.innings_pitched for N.outs display."},"earned_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Earned Runs","description":"Avg. team earned runs allowed per game."},"hits_allowed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hits Allowed","description":"Avg. team hits allowed per game."},"walks_allowed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Walks Allowed","description":"Avg. team walks allowed per game."},"strikeouts_pitched":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Strikeouts Pitched","description":"Avg. team pitcher strikeouts recorded per game."},"home_runs_allowed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Runs Allowed","description":"Avg. team home runs allowed per game."},"era":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Era","description":"Team ERA across the window: (total earned runs × 9) / (total outs ÷ 3). Uses outs math — baseball IP notation (.1/.2 = outs) is not additive."},"whip":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Whip","description":"Team WHIP across the window: (total walks allowed + total hits allowed) / (total outs ÷ 3)."},"k9":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"K9","description":"Team strikeouts per 9 innings across the window: (total pitcher strikeouts × 9) / (total outs ÷ 3)."},"bb9":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bb9","description":"Team walks allowed per 9 innings across the window: (total walks allowed × 9) / (total outs ÷ 3)."},"field_games":{"additionalProperties":{"type":"integer"},"type":"object","title":"Field Games","description":"Per-field sample size, keyed by the raw box-score slugs summed into the fields above (at_bats, hits, runs, home_runs, walks, strikeouts, doubles, triples, rbi, hit_by_pitch, stolen_bases, outs, innings_pitched, earned_runs, hits_allowed, walks_allowed, strikeouts_pitched, home_runs_allowed). `games` is how many games are in this window overall, but an individual field can have a smaller count when a box score omits that stat. Derived ratios (batting_avg/obp/slg/ops/total_bases/era/whip/k9/bb9) are NOT keys here — they are computed from the sum of their raw component slugs above, so check the relevant component slug(s) instead (e.g. `hits` + `at_bats` for `batting_avg`).","default":{}}},"additionalProperties":true,"type":"object","title":"MlbStatsRatesBlock"},"MlbStatsRecentForm":{"properties":{"window":{"type":"integer","title":"Window","description":"Number of trailing completed games this form line covers."},"results":{"items":{"type":"string"},"type":"array","title":"Results","description":"Most-recent-first results over `window`: 'W' or 'L' (no ties in MLB).","default":[]},"runs_scored":{"items":{"type":"integer"},"type":"array","title":"Runs Scored","description":"Runs this team scored in each game, same order as `results`.","default":[]},"runs_allowed":{"items":{"type":"integer"},"type":"array","title":"Runs Allowed","description":"Runs this team allowed in each game, same order as `results`.","default":[]}},"additionalProperties":true,"type":"object","required":["window"],"title":"MlbStatsRecentForm"},"MlbStatsRecord":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'season_to_date'."},"wins":{"type":"integer","title":"Wins","description":"Season-to-date wins.","default":0},"losses":{"type":"integer","title":"Losses","description":"Season-to-date losses.","default":0},"games":{"type":"integer","title":"Games","description":"Season-to-date completed games.","default":0},"win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Win Pct","description":"wins / games. Null with zero games."},"runs_for":{"type":"integer","title":"Runs For","description":"Total runs scored this season to date.","default":0},"runs_against":{"type":"integer","title":"Runs Against","description":"Total runs allowed this season to date.","default":0},"run_differential":{"type":"integer","title":"Run Differential","description":"runs_for - runs_against.","default":0}},"additionalProperties":true,"type":"object","title":"MlbStatsRecord"},"MlbStatsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when either team hasn't resolved for this fixture yet — every other field is omitted in that case and the call isn't billed."},"league_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Slug","description":"League slug — always 'mlb'."},"windows":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsWindows"},{"type":"null"}]},"teams":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsTeams"},{"type":"null"}]},"head_to_head":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsHeadToHead"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"MlbStatsResponse"},"MlbStatsStartingPitcher":{"properties":{"available":{"type":"boolean","title":"Available","description":"False until this event's post-final box score lineup is ingested. Pregame probable starters stay on GET /intelligence (and the Fact Ledger) — /stats stays DB-only and does not live-fetch probablePitcher."},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation from the lineup (typically 'P'; may be 'DH' etc. for two-way players)."},"games_started":{"type":"integer","title":"Games Started","description":"Season-to-date games started (boxscore gamesStarted=1 only — relief appearances do not count).","default":0},"innings_pitched":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Innings Pitched","description":"Season-to-date total innings pitched in baseball notation (e.g. 128.1 = 128⅔), derived from summed outs."},"era":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Era","description":"Season-to-date ERA: (total earned runs × 9) / (total outs ÷ 3) — derived from our own box scores, not a live vendor fetch."},"whip":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Whip","description":"Season-to-date WHIP: (total walks allowed + total hits allowed) / (total outs ÷ 3)."},"k9":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"K9","description":"Season-to-date strikeouts per 9 innings (outs-based denominator)."},"bb9":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bb9","description":"Season-to-date walks allowed per 9 innings (outs-based denominator)."}},"additionalProperties":true,"type":"object","required":["available"],"title":"MlbStatsStartingPitcher"},"MlbStatsTeam":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Lumify media URL for the team logo (e.g. https://lumify.ai/media/teams/mlb/70.png). Null until the logo ingest job has published the asset. Never a vendor CDN or raw GCS URL."},"rest_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rest Days","description":"Days since this team's previous completed game."},"recent_form":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsRecentForm"},{"type":"null"}]},"record":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsRecord"},{"type":"null"}],"description":"Season-to-date W/L record and run differential."},"rates_l5":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsRatesBlock"},{"type":"null"}],"description":"Team batting/pitching rate aggregates over the trailing 5 games."},"rates_season":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsRatesBlock"},{"type":"null"}],"description":"Team batting/pitching rate aggregates over the current season."},"starting_pitcher":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsStartingPitcher"},{"type":"null"}],"description":"This side's starting pitcher for this game (from the ingested box-score lineup), with his own season rate stats. Null identity / available:false pre-box; pregame probable SP is not exposed here."},"lineup":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsLineup"},{"type":"null"}]},"player_box":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsPlayerBox"},{"type":"null"}],"description":"This event's per-player batting and pitching lines from the ingested box score (`lumify_player_game_stats`). Raw counting stats only — no per-player AVG/OBP/ERA (those stay on team rates / starting_pitcher). Two-way players appear on both `batters` and `pitchers`. Settleable fantasy/prop lines live on GET /player-props."}},"additionalProperties":true,"type":"object","title":"MlbStatsTeam"},"MlbStatsTeams":{"properties":{"home":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsTeam"},{"type":"null"}]},"away":{"anyOf":[{"$ref":"#/components/schemas/MlbStatsTeam"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"MlbStatsTeams"},"MlbStatsWindows":{"properties":{"recent_form":{"type":"integer","title":"Recent Form","description":"Trailing games covered by each team's `recent_form`."},"rates_l5":{"type":"integer","title":"Rates L5","description":"Trailing games covered by each team's `rates_l5`."},"rates_season":{"type":"string","title":"Rates Season","description":"Always the literal string 'season' — a deliberately variable-length window (see each team's `rates_season.games`), unlike the fixed integer windows above."},"head_to_head":{"type":"integer","title":"Head To Head","description":"Trailing meetings between these two teams considered for `head_to_head`."}},"additionalProperties":true,"type":"object","required":["recent_form","rates_l5","rates_season","head_to_head"],"title":"MlbStatsWindows"},"NLQueryFilters":{"properties":{"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},"additionalProperties":true,"type":"object","title":"NLQueryFilters"},"NLQueryRequest":{"properties":{"query":{"type":"string","maxLength":500,"minLength":1,"title":"Query","description":"Free text, e.g. 'live nfl games today' or 'college basketball this week'."},"limit":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Limit","description":"Overrides any limit parsed from the query text. Max 100."}},"additionalProperties":true,"type":"object","required":["query"],"title":"NLQueryRequest"},"NLQueryResponse":{"properties":{"query":{"type":"string","title":"Query","description":"The original natural-language query text."},"interpreted":{"$ref":"#/components/schemas/NLQueryFilters","description":"The GET /v1/events filters parsed from the query text."},"unrecognized_terms":{"items":{"type":"string"},"type":"array","title":"Unrecognized Terms","description":"Query words that didn't map to a known filter.","default":[]},"equivalent_request":{"type":"string","title":"Equivalent Request","description":"The literal GET /v1/events request this query was translated to."},"events":{"items":{"$ref":"#/components/schemas/EventSummary"},"type":"array","title":"Events","default":[]},"total":{"type":"integer","title":"Total","default":0},"next_after_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next After Id"}},"additionalProperties":true,"type":"object","required":["query","interpreted","equivalent_request"],"title":"NLQueryResponse"},"NbaStatsHeadToHead":{"properties":{"window":{"type":"integer","title":"Window","description":"Max trailing meetings considered (see `windows.head_to_head`)."},"meetings":{"items":{"$ref":"#/components/schemas/NbaStatsHeadToHeadMeeting"},"type":"array","title":"Meetings","description":"Most-recent-first past meetings between these two teams, up to `window`.","default":[]},"total":{"type":"integer","title":"Total","description":"Number of meetings returned in `meetings`.","default":0}},"additionalProperties":true,"type":"object","required":["window"],"title":"NbaStatsHeadToHead"},"NbaStatsHeadToHeadMeeting":{"properties":{"home_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Points","description":"Points scored by this event's home team in that past meeting."},"away_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Points","description":"Points scored by this event's away team in that past meeting."}},"additionalProperties":true,"type":"object","title":"NbaStatsHeadToHeadMeeting"},"NbaStatsPlayerBox":{"properties":{"available":{"type":"boolean","title":"Available","description":"False until this event has at least one ingested player-stat row for this side. Pregame stays available:false. In-progress and delayed games become available once the live box refresh has written rows. Settleable prop lines stay on GET /player-props."},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"ISO timestamp of the newest ingested player-stat row on this side. Null when available is false."},"players":{"items":{"$ref":"#/components/schemas/NbaStatsPlayerLine"},"type":"array","title":"Players","description":"This game's per-player counting stats, sorted points desc then name. Raw counts only — no per-player FG%/3P%/FT%. Settleables (including combo and double-double) live on GET /player-props.","default":[]}},"additionalProperties":true,"type":"object","required":["available"],"title":"NbaStatsPlayerBox"},"NbaStatsPlayerLine":{"properties":{"player_id":{"type":"integer","title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Player full name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation from this box-score row when written, else the player's season-level roster position."},"points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Points","description":"Points in this game."},"rebounds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rebounds","description":"Rebounds in this game."},"assists":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assists","description":"Assists in this game."},"turnovers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Turnovers","description":"Turnovers in this game."},"steals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steals","description":"Steals in this game."},"blocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blocks","description":"Blocks in this game."},"fouls":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fouls","description":"Personal fouls in this game."},"three_pointers_made":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Three Pointers Made","description":"Three-pointers made in this game."},"three_pointers_attempted":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Three Pointers Attempted","description":"Three-pointers attempted in this game."}},"additionalProperties":true,"type":"object","required":["player_id"],"title":"NbaStatsPlayerLine"},"NbaStatsRatesBlock":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'event_stats_avg' (persisted team box scores)."},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window","description":"Which rolling window this block covers: 'l5' (see `window_size`) or 'season' (variable length — see `games`)."},"window_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Size","description":"Fixed sample depth when the window has one (e.g. 5 for 'l5'). Omitted for 'season'."},"games":{"type":"integer","title":"Games","description":"Games with team box-score data in this aggregate.","default":0},"rebounds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rebounds","description":"Avg. total rebounds per game."},"assists":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Assists","description":"Avg. assists per game."},"steals":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Steals","description":"Avg. steals per game."},"blocks":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Blocks","description":"Avg. blocks per game."},"turnovers":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Turnovers","description":"Avg. turnovers per game."},"fouls":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fouls","description":"Avg. personal fouls per game."},"fg_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fg Pct","description":"Field goal % over the window (0-100): ratio-of-sums of field_goals_made / field_goals_attempted across games — not an average of per-game percentages."},"three_point_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Three Point Pct","description":"3-point field goal % over the window (0-100): ratio-of-sums of three_pointers_made / three_pointers_attempted."},"free_throw_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Free Throw Pct","description":"Free throw % over the window (0-100): ratio-of-sums of free_throws_made / free_throws_attempted."},"field_games":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Field Games","description":"Per-metric sample counts (a box can omit a stat even when `games` is higher)."}},"additionalProperties":true,"type":"object","title":"NbaStatsRatesBlock"},"NbaStatsRecentForm":{"properties":{"window":{"type":"integer","title":"Window","description":"Number of trailing completed games this form line covers."},"results":{"items":{"type":"string"},"type":"array","title":"Results","description":"Most-recent-first results over `window`: 'W' or 'L' (ties don't occur in NBA).","default":[]},"points_scored":{"items":{"type":"integer"},"type":"array","title":"Points Scored","description":"Points this team scored in each game, same order as `results`.","default":[]},"points_allowed":{"items":{"type":"integer"},"type":"array","title":"Points Allowed","description":"Points this team allowed in each game, same order as `results`.","default":[]}},"additionalProperties":true,"type":"object","required":["window"],"title":"NbaStatsRecentForm"},"NbaStatsRecord":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'season_to_date'."},"wins":{"type":"integer","title":"Wins","description":"Season-to-date wins.","default":0},"losses":{"type":"integer","title":"Losses","description":"Season-to-date losses.","default":0},"games":{"type":"integer","title":"Games","description":"Season-to-date completed games.","default":0},"win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Win Pct","description":"wins / games. Null with zero games."},"points_for":{"type":"integer","title":"Points For","description":"Total points scored this season to date.","default":0},"points_against":{"type":"integer","title":"Points Against","description":"Total points allowed this season to date.","default":0},"point_differential":{"type":"integer","title":"Point Differential","description":"points_for - points_against.","default":0}},"additionalProperties":true,"type":"object","title":"NbaStatsRecord"},"NbaStatsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when either team hasn't resolved for this fixture yet — every other field is omitted in that case and the call isn't billed."},"league_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Slug","description":"League slug — always 'nba'."},"windows":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsWindows"},{"type":"null"}]},"teams":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsTeams"},{"type":"null"}]},"head_to_head":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsHeadToHead"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"NbaStatsResponse"},"NbaStatsTeam":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Team display name."},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation","description":"Team abbreviation, e.g. 'BOS'."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Lumify media URL for the team logo (e.g. https://lumify.ai/media/teams/nba/35.png). Null until the logo ingest job has published the asset. Never a vendor CDN or raw GCS URL."},"rest_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rest Days","description":"Days since this team's previous completed game."},"recent_form":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsRecentForm"},{"type":"null"}]},"record":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsRecord"},{"type":"null"}]},"rates_l5":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsRatesBlock"},{"type":"null"}],"description":"Team box rate aggregates over the trailing L5 window."},"rates_season":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsRatesBlock"},{"type":"null"}],"description":"Team box rate aggregates over the current season."},"player_box":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsPlayerBox"},{"type":"null"}],"description":"This event's per-player basketball counting stats from ingested box scores. Final, in-progress, and delayed when rows exist. Settleable prop lines live on GET /player-props."}},"additionalProperties":true,"type":"object","title":"NbaStatsTeam"},"NbaStatsTeams":{"properties":{"home":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsTeam"},{"type":"null"}]},"away":{"anyOf":[{"$ref":"#/components/schemas/NbaStatsTeam"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"NbaStatsTeams"},"NbaStatsWindows":{"properties":{"recent_form":{"type":"integer","title":"Recent Form","description":"Trailing games covered by each team's `recent_form`."},"rates_l5":{"type":"integer","title":"Rates L5","description":"Trailing games covered by each team's `rates_l5`."},"rates_season":{"type":"string","title":"Rates Season","description":"Always the literal string 'season' — a deliberately variable-length window (see each team's `rates_season.games`)."},"head_to_head":{"type":"integer","title":"Head To Head","description":"Trailing meetings between these two teams considered for `head_to_head`."}},"additionalProperties":true,"type":"object","required":["recent_form","rates_l5","rates_season","head_to_head"],"title":"NbaStatsWindows"},"NcaabStatsHeadToHead":{"properties":{"window":{"type":"integer","title":"Window","description":"Max trailing meetings considered (see `windows.head_to_head`)."},"meetings":{"items":{"$ref":"#/components/schemas/NcaabStatsHeadToHeadMeeting"},"type":"array","title":"Meetings","description":"Most-recent-first past meetings between these two teams, up to `window`.","default":[]},"total":{"type":"integer","title":"Total","description":"Number of meetings returned in `meetings`.","default":0}},"additionalProperties":true,"type":"object","required":["window"],"title":"NcaabStatsHeadToHead"},"NcaabStatsHeadToHeadMeeting":{"properties":{"home_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Points","description":"Points scored by this event's home team in that past meeting."},"away_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Points","description":"Points scored by this event's away team in that past meeting."}},"additionalProperties":true,"type":"object","title":"NcaabStatsHeadToHeadMeeting"},"NcaabStatsPlayerBox":{"properties":{"available":{"type":"boolean","title":"Available","description":"False until this event has at least one ingested player-stat row for this side. Pregame stays available:false. In-progress and delayed games become available once the live box refresh has written rows. Settleable prop lines stay on GET /player-props."},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"ISO timestamp of the newest ingested player-stat row on this side. Null when available is false."},"players":{"items":{"$ref":"#/components/schemas/NcaabStatsPlayerLine"},"type":"array","title":"Players","description":"This game's per-player counting stats. Basketball sibling of the NBA player_box — same counting fields, college-basketball ingest. Sorted points desc then name.","default":[]}},"additionalProperties":true,"type":"object","required":["available"],"title":"NcaabStatsPlayerBox"},"NcaabStatsPlayerLine":{"properties":{"player_id":{"type":"integer","title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Player full name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation from this box-score row when written, else the player's season-level roster position."},"points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Points","description":"Points in this game."},"rebounds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rebounds","description":"Rebounds in this game."},"assists":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assists","description":"Assists in this game."},"turnovers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Turnovers","description":"Turnovers in this game."},"steals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steals","description":"Steals in this game."},"blocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blocks","description":"Blocks in this game."},"fouls":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fouls","description":"Personal fouls in this game."},"three_pointers_made":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Three Pointers Made","description":"Three-pointers made in this game."},"three_pointers_attempted":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Three Pointers Attempted","description":"Three-pointers attempted in this game."}},"additionalProperties":true,"type":"object","required":["player_id"],"title":"NcaabStatsPlayerLine"},"NcaabStatsRatesBlock":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'event_stats_avg' (persisted team box scores)."},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window","description":"Which rolling window this block covers: 'l5' (see `window_size`) or 'season' (variable length — see `games`)."},"window_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Size","description":"Fixed sample depth when the window has one (e.g. 5 for 'l5'). Omitted for 'season'."},"games":{"type":"integer","title":"Games","description":"Games with team box-score data in this aggregate.","default":0},"rebounds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rebounds","description":"Avg. total rebounds per game."},"assists":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Assists","description":"Avg. assists per game."},"steals":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Steals","description":"Avg. steals per game."},"blocks":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Blocks","description":"Avg. blocks per game."},"turnovers":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Turnovers","description":"Avg. turnovers per game."},"fouls":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fouls","description":"Avg. personal fouls per game."},"fg_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fg Pct","description":"Field goal % over the window (0-100): ratio-of-sums of field_goals_made / field_goals_attempted across games — not an average of per-game percentages."},"three_point_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Three Point Pct","description":"3-point field goal % over the window (0-100): ratio-of-sums of three_pointers_made / three_pointers_attempted."},"free_throw_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Free Throw Pct","description":"Free throw % over the window (0-100): ratio-of-sums of free_throws_made / free_throws_attempted."},"field_games":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Field Games","description":"Per-metric sample counts (a box can omit a stat even when `games` is higher)."}},"additionalProperties":true,"type":"object","title":"NcaabStatsRatesBlock"},"NcaabStatsRecentForm":{"properties":{"window":{"type":"integer","title":"Window","description":"Number of trailing completed games this form line covers."},"results":{"items":{"type":"string"},"type":"array","title":"Results","description":"Most-recent-first results over `window`: 'W' or 'L' (ties don't occur in NCAAB).","default":[]},"points_scored":{"items":{"type":"integer"},"type":"array","title":"Points Scored","description":"Points this team scored in each game, same order as `results`.","default":[]},"points_allowed":{"items":{"type":"integer"},"type":"array","title":"Points Allowed","description":"Points this team allowed in each game, same order as `results`.","default":[]}},"additionalProperties":true,"type":"object","required":["window"],"title":"NcaabStatsRecentForm"},"NcaabStatsRecord":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'season_to_date'."},"wins":{"type":"integer","title":"Wins","description":"Season-to-date wins.","default":0},"losses":{"type":"integer","title":"Losses","description":"Season-to-date losses.","default":0},"games":{"type":"integer","title":"Games","description":"Season-to-date completed games.","default":0},"win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Win Pct","description":"wins / games. Null with zero games."},"points_for":{"type":"integer","title":"Points For","description":"Total points scored this season to date.","default":0},"points_against":{"type":"integer","title":"Points Against","description":"Total points allowed this season to date.","default":0},"point_differential":{"type":"integer","title":"Point Differential","description":"points_for - points_against.","default":0}},"additionalProperties":true,"type":"object","title":"NcaabStatsRecord"},"NcaabStatsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when either team hasn't resolved for this fixture yet — every other field is omitted in that case and the call isn't billed."},"league_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Slug","description":"League slug — always 'ncaab'."},"windows":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsWindows"},{"type":"null"}]},"teams":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsTeams"},{"type":"null"}]},"head_to_head":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsHeadToHead"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"NcaabStatsResponse"},"NcaabStatsTeam":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Team display name."},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation","description":"Team abbreviation, e.g. 'BOS'."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Lumify media URL for the team logo (e.g. https://lumify.ai/media/teams/ncaab/150.png). Null until the logo ingest job has published the asset. Never a vendor CDN or raw GCS URL."},"rest_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rest Days","description":"Days since this team's previous completed game."},"recent_form":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsRecentForm"},{"type":"null"}]},"record":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsRecord"},{"type":"null"}]},"rates_l5":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsRatesBlock"},{"type":"null"}],"description":"Team box rate aggregates over the trailing L5 window."},"rates_season":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsRatesBlock"},{"type":"null"}],"description":"Team box rate aggregates over the current season."},"player_box":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsPlayerBox"},{"type":"null"}],"description":"This event's per-player basketball counting stats from ingested box scores. Final, in-progress, and delayed when rows exist. Settleable prop lines live on GET /player-props."}},"additionalProperties":true,"type":"object","title":"NcaabStatsTeam"},"NcaabStatsTeams":{"properties":{"home":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsTeam"},{"type":"null"}]},"away":{"anyOf":[{"$ref":"#/components/schemas/NcaabStatsTeam"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"NcaabStatsTeams"},"NcaabStatsWindows":{"properties":{"recent_form":{"type":"integer","title":"Recent Form","description":"Trailing games covered by each team's `recent_form`."},"rates_l5":{"type":"integer","title":"Rates L5","description":"Trailing games covered by each team's `rates_l5`."},"rates_season":{"type":"string","title":"Rates Season","description":"Always the literal string 'season' — a deliberately variable-length window (see each team's `rates_season.games`)."},"head_to_head":{"type":"integer","title":"Head To Head","description":"Trailing meetings between these two teams considered for `head_to_head`."}},"additionalProperties":true,"type":"object","required":["recent_form","rates_l5","rates_season","head_to_head"],"title":"NcaabStatsWindows"},"NcaafStatsHeadToHead":{"properties":{"window":{"type":"integer","title":"Window","description":"Max trailing meetings considered (see `windows.head_to_head`)."},"meetings":{"items":{"$ref":"#/components/schemas/NcaafStatsHeadToHeadMeeting"},"type":"array","title":"Meetings","description":"Most-recent-first past meetings between these two teams, up to `window`.","default":[]},"total":{"type":"integer","title":"Total","description":"Number of meetings returned in `meetings`.","default":0}},"additionalProperties":true,"type":"object","required":["window"],"title":"NcaafStatsHeadToHead"},"NcaafStatsHeadToHeadMeeting":{"properties":{"home_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Points","description":"Points scored by this event's home team in that past meeting."},"away_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Points","description":"Points scored by this event's away team in that past meeting."}},"additionalProperties":true,"type":"object","title":"NcaafStatsHeadToHeadMeeting"},"NcaafStatsPlayerBox":{"properties":{"available":{"type":"boolean","title":"Available","description":"False until this event has at least one ingested player-stat row for this side. Pregame stays available:false. In-progress and delayed games become available once the live box refresh has written rows. Settleable prop lines stay on GET /player-props."},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"ISO timestamp of the newest ingested player-stat row on this side. Null when available is false."},"players":{"items":{"$ref":"#/components/schemas/NcaafStatsPlayerLine"},"type":"array","title":"Players","description":"This game's per-player counting stats, one line per player. Football sibling of the NFL player_box — same counting fields, college-football ingest. Sorted passing_yards desc, then rushing_yards, receiving_yards, name.","default":[]}},"additionalProperties":true,"type":"object","required":["available"],"title":"NcaafStatsPlayerBox"},"NcaafStatsPlayerLine":{"properties":{"player_id":{"type":"integer","title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Player full name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation from this box-score row when written, else the player's season-level roster position."},"pass_completions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pass Completions","description":"Pass completions in this game."},"pass_attempts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pass Attempts","description":"Pass attempts in this game."},"passing_yards":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passing Yards","description":"Passing yards in this game."},"passing_tds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passing Tds","description":"Passing touchdowns in this game."},"interceptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interceptions","description":"Interceptions thrown in this game."},"rush_attempts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rush Attempts","description":"Rush attempts in this game."},"rushing_yards":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rushing Yards","description":"Rushing yards in this game."},"rushing_tds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rushing Tds","description":"Rushing touchdowns in this game."},"receptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Receptions","description":"Receptions in this game."},"receiving_yards":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Receiving Yards","description":"Receiving yards in this game."},"receiving_tds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Receiving Tds","description":"Receiving touchdowns in this game."},"targets":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Targets","description":"Targets in this game."},"fumbles_lost":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fumbles Lost","description":"Fumbles lost in this game."},"tackles":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tackles","description":"Tackles in this game. Fractional when a tackle is split between two defenders."},"sacks":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sacks","description":"Sacks in this game. Fractional (e.g. 1.5) when a sack is split between two defenders."},"tackles_for_loss":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tackles For Loss","description":"Tackles for loss in this game. Fractional when split between two defenders."},"pass_deflections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pass Deflections","description":"Pass deflections in this game."},"defensive_tds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Defensive Tds","description":"Defensive touchdowns in this game."},"def_interceptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Def Interceptions","description":"Interceptions as a defender in this game."},"fg_made":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fg Made","description":"Field goals made in this game."},"fg_attempts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fg Attempts","description":"Field goal attempts in this game."},"xp_made":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Xp Made","description":"Extra points made in this game."},"kicking_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kicking Points","description":"Total kicking points in this game."}},"additionalProperties":true,"type":"object","required":["player_id"],"title":"NcaafStatsPlayerLine"},"NcaafStatsRatesBlock":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'event_stats_avg' (persisted team box scores)."},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window","description":"Which rolling window this block covers: 'l5' (see `window_size`) or 'season' (variable length — see `games`)."},"window_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Size","description":"Fixed sample depth when the window has one (e.g. 5 for 'l5'). Omitted for 'season'."},"games":{"type":"integer","title":"Games","description":"Games with team box-score data in this aggregate.","default":0},"total_yards":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Yards","description":"Avg. total offensive yards per game."},"yards_allowed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Yards Allowed","description":"Avg. total yards allowed per game (opponent total_yards)."},"passing_yards":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Passing Yards","description":"Avg. net passing yards per game."},"rushing_yards":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rushing Yards","description":"Avg. rushing yards per game."},"rush_attempts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rush Attempts","description":"Avg. rush attempts per game."},"pass_completions":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Completions","description":"Avg. pass completions per game."},"pass_attempts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Attempts","description":"Avg. pass attempts per game."},"turnovers":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Turnovers","description":"Avg. turnovers committed per game."},"third_down_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Third Down Pct","description":"Third-down conversion percentage across the window: 100 × total conversions / total attempts (not an average of per-game %)."},"field_games":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Field Games","description":"Per-metric sample counts (a box can omit a stat even when `games` is higher)."}},"additionalProperties":true,"type":"object","title":"NcaafStatsRatesBlock"},"NcaafStatsRecentForm":{"properties":{"window":{"type":"integer","title":"Window","description":"Number of trailing completed games this form line covers."},"results":{"items":{"type":"string"},"type":"array","title":"Results","description":"Most-recent-first results over `window`: 'W' or 'L' (ties omitted).","default":[]},"points_scored":{"items":{"type":"integer"},"type":"array","title":"Points Scored","description":"Points this team scored in each game, same order as `results`.","default":[]},"points_allowed":{"items":{"type":"integer"},"type":"array","title":"Points Allowed","description":"Points this team allowed in each game, same order as `results`.","default":[]}},"additionalProperties":true,"type":"object","required":["window"],"title":"NcaafStatsRecentForm"},"NcaafStatsRecord":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'season_to_date'."},"wins":{"type":"integer","title":"Wins","description":"Season-to-date wins.","default":0},"losses":{"type":"integer","title":"Losses","description":"Season-to-date losses.","default":0},"games":{"type":"integer","title":"Games","description":"Season-to-date completed games.","default":0},"win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Win Pct","description":"wins / games. Null with zero games."},"points_for":{"type":"integer","title":"Points For","description":"Total points scored this season to date.","default":0},"points_against":{"type":"integer","title":"Points Against","description":"Total points allowed this season to date.","default":0},"point_differential":{"type":"integer","title":"Point Differential","description":"points_for - points_against.","default":0}},"additionalProperties":true,"type":"object","title":"NcaafStatsRecord"},"NcaafStatsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when either team hasn't resolved for this fixture yet — every other field is omitted in that case and the call isn't billed."},"league_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Slug","description":"League slug — always 'ncaaf'."},"windows":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsWindows"},{"type":"null"}]},"teams":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsTeams"},{"type":"null"}]},"head_to_head":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsHeadToHead"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"NcaafStatsResponse"},"NcaafStatsTeam":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Team display name."},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation","description":"Team abbreviation, e.g. 'KC'."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Lumify media URL for the team logo (e.g. https://lumify.ai/media/teams/ncaaf/153.png). Null until the logo ingest job has published the asset. Never a vendor CDN or raw GCS URL."},"rest_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rest Days","description":"Days since this team's previous completed game."},"recent_form":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsRecentForm"},{"type":"null"}]},"record":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsRecord"},{"type":"null"}]},"rates_l5":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsRatesBlock"},{"type":"null"}],"description":"Team offense/defense rate aggregates over the trailing L5 window."},"rates_season":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsRatesBlock"},{"type":"null"}],"description":"Team offense/defense rate aggregates over the current season."},"player_box":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsPlayerBox"},{"type":"null"}],"description":"This event's per-player football counting stats from ingested box scores. Final, in-progress, and delayed when rows exist. Settleable prop lines live on GET /player-props."}},"additionalProperties":true,"type":"object","title":"NcaafStatsTeam"},"NcaafStatsTeams":{"properties":{"home":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsTeam"},{"type":"null"}]},"away":{"anyOf":[{"$ref":"#/components/schemas/NcaafStatsTeam"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"NcaafStatsTeams"},"NcaafStatsWindows":{"properties":{"recent_form":{"type":"integer","title":"Recent Form","description":"Trailing games covered by each team's `recent_form`."},"rates_l5":{"type":"integer","title":"Rates L5","description":"Trailing games covered by each team's `rates_l5`."},"rates_season":{"type":"string","title":"Rates Season","description":"Always the literal string 'season' — a deliberately variable-length window (see each team's `rates_season.games`)."},"head_to_head":{"type":"integer","title":"Head To Head","description":"Trailing meetings between these two teams considered for `head_to_head`."}},"additionalProperties":true,"type":"object","required":["recent_form","rates_l5","rates_season","head_to_head"],"title":"NcaafStatsWindows"},"NflStatsHeadToHead":{"properties":{"window":{"type":"integer","title":"Window","description":"Max trailing meetings considered (see `windows.head_to_head`)."},"meetings":{"items":{"$ref":"#/components/schemas/NflStatsHeadToHeadMeeting"},"type":"array","title":"Meetings","description":"Most-recent-first past meetings between these two teams, up to `window`.","default":[]},"total":{"type":"integer","title":"Total","description":"Number of meetings returned in `meetings`.","default":0}},"additionalProperties":true,"type":"object","required":["window"],"title":"NflStatsHeadToHead"},"NflStatsHeadToHeadMeeting":{"properties":{"home_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Points","description":"Points scored by this event's home team in that past meeting."},"away_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Points","description":"Points scored by this event's away team in that past meeting."}},"additionalProperties":true,"type":"object","title":"NflStatsHeadToHeadMeeting"},"NflStatsPlayerBox":{"properties":{"available":{"type":"boolean","title":"Available","description":"False until this event has at least one ingested player-stat row for this side. Pregame stays available:false. In-progress and delayed games become available once the live box refresh has written rows. Settleable prop lines stay on GET /player-props."},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"ISO timestamp of the newest ingested player-stat row on this side. Null when available is false."},"players":{"items":{"$ref":"#/components/schemas/NflStatsPlayerLine"},"type":"array","title":"Players","description":"This game's per-player counting stats, one line per player (passing + rushing + receiving + defense + kicking fields; unused groups are null). Sorted passing_yards desc, then rushing_yards, receiving_yards, name. Raw counts only — no QB rating. Settleables live on GET /player-props.","default":[]}},"additionalProperties":true,"type":"object","required":["available"],"title":"NflStatsPlayerBox"},"NflStatsPlayerLine":{"properties":{"player_id":{"type":"integer","title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Player full name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation from this box-score row when written, else the player's season-level roster position. Per-game position is not yet stamped on every row."},"pass_completions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pass Completions","description":"Pass completions in this game."},"pass_attempts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pass Attempts","description":"Pass attempts in this game."},"passing_yards":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passing Yards","description":"Passing yards in this game."},"passing_tds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Passing Tds","description":"Passing touchdowns in this game."},"interceptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interceptions","description":"Interceptions thrown in this game."},"rush_attempts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rush Attempts","description":"Rush attempts in this game."},"rushing_yards":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rushing Yards","description":"Rushing yards in this game."},"rushing_tds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rushing Tds","description":"Rushing touchdowns in this game."},"receptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Receptions","description":"Receptions in this game."},"receiving_yards":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Receiving Yards","description":"Receiving yards in this game."},"receiving_tds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Receiving Tds","description":"Receiving touchdowns in this game."},"targets":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Targets","description":"Targets in this game."},"fumbles_lost":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fumbles Lost","description":"Fumbles lost in this game."},"tackles":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tackles","description":"Tackles in this game. Fractional when a tackle is split between two defenders."},"sacks":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sacks","description":"Sacks in this game. Fractional (e.g. 1.5) when a sack is split between two defenders."},"tackles_for_loss":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tackles For Loss","description":"Tackles for loss in this game. Fractional when split between two defenders."},"pass_deflections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pass Deflections","description":"Pass deflections in this game."},"defensive_tds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Defensive Tds","description":"Defensive touchdowns in this game."},"def_interceptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Def Interceptions","description":"Interceptions as a defender in this game."},"fg_made":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fg Made","description":"Field goals made in this game."},"fg_attempts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fg Attempts","description":"Field goal attempts in this game."},"xp_made":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Xp Made","description":"Extra points made in this game."},"kicking_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kicking Points","description":"Total kicking points in this game."}},"additionalProperties":true,"type":"object","required":["player_id"],"title":"NflStatsPlayerLine"},"NflStatsRatesBlock":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'event_stats_avg' (persisted team box scores)."},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window","description":"Which rolling window this block covers: 'l5' (see `window_size`) or 'season' (variable length — see `games`)."},"window_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Size","description":"Fixed sample depth when the window has one (e.g. 5 for 'l5'). Omitted for 'season'."},"games":{"type":"integer","title":"Games","description":"Games with team box-score data in this aggregate.","default":0},"total_yards":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Yards","description":"Avg. total offensive yards per game."},"yards_allowed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Yards Allowed","description":"Avg. total yards allowed per game (opponent total_yards)."},"passing_yards":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Passing Yards","description":"Avg. net passing yards per game."},"rushing_yards":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rushing Yards","description":"Avg. rushing yards per game."},"rush_attempts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rush Attempts","description":"Avg. rush attempts per game."},"pass_completions":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Completions","description":"Avg. pass completions per game."},"pass_attempts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Attempts","description":"Avg. pass attempts per game."},"turnovers":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Turnovers","description":"Avg. turnovers committed per game."},"third_down_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Third Down Pct","description":"Third-down conversion percentage across the window: 100 × total conversions / total attempts (not an average of per-game %)."},"field_games":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Field Games","description":"Per-metric sample counts (a box can omit a stat even when `games` is higher)."}},"additionalProperties":true,"type":"object","title":"NflStatsRatesBlock"},"NflStatsRecentForm":{"properties":{"window":{"type":"integer","title":"Window","description":"Number of trailing completed games this form line covers."},"results":{"items":{"type":"string"},"type":"array","title":"Results","description":"Most-recent-first results over `window`: 'W' or 'L' (ties omitted).","default":[]},"points_scored":{"items":{"type":"integer"},"type":"array","title":"Points Scored","description":"Points this team scored in each game, same order as `results`.","default":[]},"points_allowed":{"items":{"type":"integer"},"type":"array","title":"Points Allowed","description":"Points this team allowed in each game, same order as `results`.","default":[]}},"additionalProperties":true,"type":"object","required":["window"],"title":"NflStatsRecentForm"},"NflStatsRecord":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'season_to_date'."},"wins":{"type":"integer","title":"Wins","description":"Season-to-date wins.","default":0},"losses":{"type":"integer","title":"Losses","description":"Season-to-date losses.","default":0},"games":{"type":"integer","title":"Games","description":"Season-to-date completed games.","default":0},"win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Win Pct","description":"wins / games. Null with zero games."},"points_for":{"type":"integer","title":"Points For","description":"Total points scored this season to date.","default":0},"points_against":{"type":"integer","title":"Points Against","description":"Total points allowed this season to date.","default":0},"point_differential":{"type":"integer","title":"Point Differential","description":"points_for - points_against.","default":0}},"additionalProperties":true,"type":"object","title":"NflStatsRecord"},"NflStatsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when either team hasn't resolved for this fixture yet — every other field is omitted in that case and the call isn't billed."},"league_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Slug","description":"League slug — always 'nfl'."},"windows":{"anyOf":[{"$ref":"#/components/schemas/NflStatsWindows"},{"type":"null"}]},"teams":{"anyOf":[{"$ref":"#/components/schemas/NflStatsTeams"},{"type":"null"}]},"head_to_head":{"anyOf":[{"$ref":"#/components/schemas/NflStatsHeadToHead"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"NflStatsResponse"},"NflStatsTeam":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Team display name."},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation","description":"Team abbreviation, e.g. 'KC'."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Lumify media URL for the team logo (e.g. https://lumify.ai/media/teams/nfl/12.png). Null until the logo ingest job has published the asset. Never a vendor CDN or raw GCS URL."},"rest_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rest Days","description":"Days since this team's previous completed game."},"recent_form":{"anyOf":[{"$ref":"#/components/schemas/NflStatsRecentForm"},{"type":"null"}]},"record":{"anyOf":[{"$ref":"#/components/schemas/NflStatsRecord"},{"type":"null"}]},"rates_l5":{"anyOf":[{"$ref":"#/components/schemas/NflStatsRatesBlock"},{"type":"null"}],"description":"Team offense/defense rate aggregates over the trailing L5 window."},"rates_season":{"anyOf":[{"$ref":"#/components/schemas/NflStatsRatesBlock"},{"type":"null"}],"description":"Team offense/defense rate aggregates over the current season."},"player_box":{"anyOf":[{"$ref":"#/components/schemas/NflStatsPlayerBox"},{"type":"null"}],"description":"This event's per-player football counting stats from ingested box scores (`lumify_player_game_stats`). Final, in-progress, and delayed when rows exist. Settleable prop lines live on GET /player-props."}},"additionalProperties":true,"type":"object","title":"NflStatsTeam"},"NflStatsTeams":{"properties":{"home":{"anyOf":[{"$ref":"#/components/schemas/NflStatsTeam"},{"type":"null"}]},"away":{"anyOf":[{"$ref":"#/components/schemas/NflStatsTeam"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"NflStatsTeams"},"NflStatsWindows":{"properties":{"recent_form":{"type":"integer","title":"Recent Form","description":"Trailing games covered by each team's `recent_form`."},"rates_l5":{"type":"integer","title":"Rates L5","description":"Trailing games covered by each team's `rates_l5`."},"rates_season":{"type":"string","title":"Rates Season","description":"Always the literal string 'season' — a deliberately variable-length window (see each team's `rates_season.games`)."},"head_to_head":{"type":"integer","title":"Head To Head","description":"Trailing meetings between these two teams considered for `head_to_head`."}},"additionalProperties":true,"type":"object","required":["recent_form","rates_l5","rates_season","head_to_head"],"title":"NflStatsWindows"},"NhlStatsGoalieLine":{"properties":{"player_id":{"type":"integer","title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Player full name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Typically 'G'. From this box-score row when written, else roster position."},"saves":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saves","description":"Saves in this game."},"goals_against":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Goals Against","description":"Goals allowed in this game."},"shots_against":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shots Against","description":"Shots faced in this game."},"penalty_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Penalty Minutes","description":"Penalty minutes in this game."}},"additionalProperties":true,"type":"object","required":["player_id"],"title":"NhlStatsGoalieLine"},"NhlStatsHeadToHead":{"properties":{"window":{"type":"integer","title":"Window","description":"Max trailing meetings considered (see `windows.head_to_head`)."},"meetings":{"items":{"$ref":"#/components/schemas/NhlStatsHeadToHeadMeeting"},"type":"array","title":"Meetings","description":"Most-recent-first past meetings between these two teams, up to `window`.","default":[]},"total":{"type":"integer","title":"Total","description":"Number of meetings returned in `meetings`.","default":0}},"additionalProperties":true,"type":"object","required":["window"],"title":"NhlStatsHeadToHead"},"NhlStatsHeadToHeadMeeting":{"properties":{"home_goals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Goals","description":"Goals scored by this event's home team in that past meeting."},"away_goals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Goals","description":"Goals scored by this event's away team in that past meeting."}},"additionalProperties":true,"type":"object","title":"NhlStatsHeadToHeadMeeting"},"NhlStatsPlayerBox":{"properties":{"available":{"type":"boolean","title":"Available","description":"False until this event has at least one ingested skater or goalie row for this side. Pregame stays available:false. In-progress and delayed games become available once the live box refresh has written rows. Settleable prop lines stay on GET /player-props."},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"ISO timestamp of the newest ingested player-stat row on this side. Null when available is false."},"skaters":{"items":{"$ref":"#/components/schemas/NhlStatsSkaterLine"},"type":"array","title":"Skaters","description":"This game's skater lines, sorted goals desc then assists then name. Raw counting stats only. Settleables live on GET /player-props.","default":[]},"goalies":{"items":{"$ref":"#/components/schemas/NhlStatsGoalieLine"},"type":"array","title":"Goalies","description":"This game's goalie lines, sorted saves desc then name. A player with both skater-only and goalie-only slugs appears on both lists.","default":[]}},"additionalProperties":true,"type":"object","required":["available"],"title":"NhlStatsPlayerBox"},"NhlStatsRatesBlock":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'event_stats_avg' (persisted team box scores)."},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window","description":"Which rolling window this block covers: 'l5' (see `window_size`) or 'season' (variable length — see `games`)."},"window_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Size","description":"Fixed sample depth when the window has one (e.g. 5 for 'l5'). Omitted for 'season'."},"games":{"type":"integer","title":"Games","description":"Games with team box-score data in this aggregate.","default":0},"shots_on_goal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shots On Goal","description":"Avg. shots on goal per game."},"hits":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hits","description":"Avg. hits per game."},"penalty_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Penalty Minutes","description":"Avg. penalty minutes per game (skaters + goalies)."},"power_play_goals":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Power Play Goals","description":"Avg. power play goals per game."},"giveaways":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Giveaways","description":"Avg. giveaways per game."},"takeaways":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Takeaways","description":"Avg. takeaways per game."},"blocked_shots":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Blocked Shots","description":"Avg. shots blocked per game."},"field_games":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Field Games","description":"Per-metric sample counts (a box can omit a stat even when `games` is higher)."}},"additionalProperties":true,"type":"object","title":"NhlStatsRatesBlock"},"NhlStatsRecentForm":{"properties":{"window":{"type":"integer","title":"Window","description":"Number of trailing completed games this form line covers."},"results":{"items":{"type":"string"},"type":"array","title":"Results","description":"Most-recent-first results over `window`: 'W' or 'L' (NHL games always resolve via OT/shootout).","default":[]},"goals_scored":{"items":{"type":"integer"},"type":"array","title":"Goals Scored","description":"Goals this team scored in each game, same order as `results`.","default":[]},"goals_allowed":{"items":{"type":"integer"},"type":"array","title":"Goals Allowed","description":"Goals this team allowed in each game, same order as `results`.","default":[]}},"additionalProperties":true,"type":"object","required":["window"],"title":"NhlStatsRecentForm"},"NhlStatsRecord":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'season_to_date'."},"wins":{"type":"integer","title":"Wins","description":"Season-to-date wins.","default":0},"losses":{"type":"integer","title":"Losses","description":"Season-to-date losses (includes OT/shootout losses).","default":0},"games":{"type":"integer","title":"Games","description":"Season-to-date completed games.","default":0},"win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Win Pct","description":"wins / games. Null with zero games."},"goals_for":{"type":"integer","title":"Goals For","description":"Total goals scored this season to date.","default":0},"goals_against":{"type":"integer","title":"Goals Against","description":"Total goals allowed this season to date.","default":0},"goal_differential":{"type":"integer","title":"Goal Differential","description":"goals_for - goals_against.","default":0}},"additionalProperties":true,"type":"object","title":"NhlStatsRecord"},"NhlStatsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when either team hasn't resolved for this fixture yet — every other field is omitted in that case and the call isn't billed."},"league_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Slug","description":"League slug — always 'nhl'."},"windows":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsWindows"},{"type":"null"}]},"teams":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsTeams"},{"type":"null"}]},"head_to_head":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsHeadToHead"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"NhlStatsResponse"},"NhlStatsSkaterLine":{"properties":{"player_id":{"type":"integer","title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Player full name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation from this box-score row when written, else the player's season-level roster position."},"goals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Goals","description":"Goals in this game."},"assists":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assists","description":"Assists in this game. Persisted as slug `assists_nhl` (NBA owns global `assists`)."},"plus_minus":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plus Minus","description":"Plus/minus in this game."},"penalty_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Penalty Minutes","description":"Penalty minutes in this game."},"hits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hits","description":"Body-checks in this game. Persisted as slug `hits_nhl` (MLB owns global `hits`)."},"power_play_goals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Power Play Goals","description":"Power-play goals in this game."},"shots_on_goal":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shots On Goal","description":"Shots on goal in this game."},"blocked_shots":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blocked Shots","description":"Blocked shots in this game."},"giveaways":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Giveaways","description":"Giveaways in this game."},"takeaways":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Takeaways","description":"Takeaways in this game."}},"additionalProperties":true,"type":"object","required":["player_id"],"title":"NhlStatsSkaterLine"},"NhlStatsTeam":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Team display name."},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation","description":"Team abbreviation, e.g. 'BOS'."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Lumify media URL for the team logo (e.g. https://lumify.ai/media/teams/nhl/124.png). Null until the logo ingest job has published the asset. Never a vendor CDN or raw GCS URL."},"rest_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rest Days","description":"Days since this team's previous completed game."},"recent_form":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsRecentForm"},{"type":"null"}]},"record":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsRecord"},{"type":"null"}]},"rates_l5":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsRatesBlock"},{"type":"null"}],"description":"Team box rate aggregates over the trailing L5 window."},"rates_season":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsRatesBlock"},{"type":"null"}],"description":"Team box rate aggregates over the current season."},"player_box":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsPlayerBox"},{"type":"null"}],"description":"This event's per-skater and per-goalie counting stats from ingested box scores. Final, in-progress, and delayed when rows exist. Settleable prop lines live on GET /player-props."}},"additionalProperties":true,"type":"object","title":"NhlStatsTeam"},"NhlStatsTeams":{"properties":{"home":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsTeam"},{"type":"null"}]},"away":{"anyOf":[{"$ref":"#/components/schemas/NhlStatsTeam"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"NhlStatsTeams"},"NhlStatsWindows":{"properties":{"recent_form":{"type":"integer","title":"Recent Form","description":"Trailing games covered by each team's `recent_form`."},"rates_l5":{"type":"integer","title":"Rates L5","description":"Trailing games covered by each team's `rates_l5`."},"rates_season":{"type":"string","title":"Rates Season","description":"Always the literal string 'season' — a deliberately variable-length window (see each team's `rates_season.games`)."},"head_to_head":{"type":"integer","title":"Head To Head","description":"Trailing meetings between these two teams considered for `head_to_head`."}},"additionalProperties":true,"type":"object","required":["recent_form","rates_l5","rates_season","head_to_head"],"title":"NhlStatsWindows"},"OddsHistoryResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id"},"movements":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Movements","default":[]},"total":{"type":"integer","title":"Total","default":0}},"additionalProperties":true,"type":"object","required":["event_id"],"title":"OddsHistoryResponse"},"OddsResponse":{"properties":{"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"available":{"type":"boolean","title":"Available","default":false},"bookmakers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Bookmakers","description":"Per-bookmaker markets. Each outcome has outcome, price, point, is_main (true for the main line). In-play events keep updating and omit books that have not quoted since kickoff. Final events add result (won/lost/push/void) and close (the pre-kickoff graded point); tennis spreads/totals are the one gap — game-count isn't tracked, so only tennis moneyline grades. MLB, tennis, and soccer (MLS + big-five) mains also mirror fair_price and consensus from published assessments when the line still matches the board. Default /odds view is mains only; include_alts=true returns alternate spread/total rungs."},"last_updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Updated"},"requested_bookmaker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requested Bookmaker","description":"Present only when the default (no bookmaker query param) request fell back to a different book because Pinnacle hasn't posted a line for this event yet — always 'pinnacle' when present. An explicit bookmaker=pinnacle request never falls back; it returns available=false instead."},"fallback_bookmaker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Bookmaker","description":"The book actually returned when requested_bookmaker is present — the book with the most odds rows for this event, excluding Pinnacle."}},"additionalProperties":true,"type":"object","title":"OddsResponse"},"Participant":{"properties":{"participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Participant Id"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"team":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Team"},"player":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Player"},"score":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score"},"is_winner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Winner"}},"additionalProperties":true,"type":"object","title":"Participant"},"PeriodOddsBookLine":{"properties":{"home":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home","description":"American odds for the home side (spreads). Null on totals rows."},"away":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away","description":"American odds for the away side (spreads). Null on totals rows."},"over":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Over","description":"American odds for Over (totals). Null on spread rows."},"under":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Under","description":"American odds for Under (totals). Null on spread rows."}},"additionalProperties":true,"type":"object","title":"PeriodOddsBookLine"},"PeriodOddsLine":{"properties":{"scope":{"type":"string","title":"Scope","description":"Period this line settles against. '1H' for NFL/NCAAF/NBA/NCAAB (Q1+Q2, or the native 1H row on NCAAB) and soccer (native 1H). 'F5' for MLB (innings 1–5). 'S1' for tennis (first-set games)."},"market":{"type":"string","title":"Market","description":"Persisted market_key: first_half_spreads or first_half_totals."},"line":{"type":"number","title":"Line","description":"Main number. Spreads are home-perspective (home -2.5 pairs with away +2.5). Totals are the Over/Under point."},"home_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Score","description":"This-event home points in the scope, summed from period scores."},"away_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Score","description":"This-event away points in the scope, summed from period scores."},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current","description":"Scope total (home + away). Totals rows only. Null on spreads."},"current_margin":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Margin","description":"Home minus away in the scope. Spreads rows only. Null on totals."},"pct_of_line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Of Line","description":"current / line as a percent (one decimal). Totals rows only."},"settleable":{"type":"boolean","title":"Settleable","description":"True — these markets grade from lumify_period_scores."},"scope_complete":{"type":"boolean","title":"Scope Complete","description":"True when every required period label is present and numeric for both sides AND the following period has started (e.g. Q3 for a 1H line, inning 6 for F5) — or the event itself is final/walkover. The next-period check exists because live feeds mark the period in progress as already 'confirmed'; grade only when scope_complete is true, otherwise in_progress."},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result","description":"Totals only: in_progress / over / under / push / void. Null on spread rows (use home_result / away_result)."},"home_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Result","description":"Spreads only: in_progress / won / lost / push / void. Null on totals."},"away_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Result","description":"Spreads only: in_progress / won / lost / push / void. Null on totals."},"books":{"additionalProperties":{"$ref":"#/components/schemas/PeriodOddsBookLine"},"type":"object","title":"Books","description":"Per-book American prices at this exact line. Spreads use home/away; totals use over/under. Keys are odds slugs (fanduel, …)."}},"additionalProperties":true,"type":"object","required":["scope","market","line","settleable","scope_complete"],"title":"PeriodOddsLine"},"PeriodOddsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when no first-half / first-five / first-set mains have been ingested for this event. available:false is not charged."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Sport slug (nfl, ncaaf, nba, ncaab, or mlb on this endpoint)."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Event status: scheduled, inprogress, delayed, final, …"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period","description":"Current period label from the live score snapshot (e.g. '3')."},"clock":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clock","description":"Game clock from the live score snapshot (e.g. '8:42')."},"period_odds":{"items":{"$ref":"#/components/schemas/PeriodOddsLine"},"type":"array","title":"Period Odds","description":"One row per (scope, market, line). All books at that exact line are nested under books. Empty when available is false."}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"PeriodOddsResponse"},"Player":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"Lumify player ID."},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug","description":"URL-safe unique slug."},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name","description":"Display name."},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Sport slug, e.g. mlb, tennis, nfl."},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","description":"ISO 3166-1 alpha-3 country code."},"birthdate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Birthdate","description":"YYYY-MM-DD date of birth."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Roster position abbreviation when the sport has one (e.g. C, P, SS for MLB; QB, WR for NFL). Null for tennis and when not yet ingested."},"handedness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handedness","description":"left | right | switch. Meaning is sport-specific (bats for MLB, shoots for NHL, playing hand for tennis). Null when unknown."},"height_cm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height Cm","description":"Height in centimetres. Null when not ingested."},"weight_kg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight Kg","description":"Weight in kilograms. Null when not ingested."},"rankings":{"anyOf":[{"$ref":"#/components/schemas/PlayerRankings"},{"type":"null"}],"description":"Sport ranking block. Tennis: {singles, points} from ATP/WTA standings. Null for every other sport. Tennis /stats also exposes ranking / ranking_points on the tennis player block."},"current_team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Team Id","description":"Lumify team ID when the player is on a club roster. Null for tennis."},"current_team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Team Name","description":"Current team display name. Null for tennis."},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"False when deactivated or retired."},"retired_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retired At","description":"YYYY-MM-DD retirement date when known."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Lumify media URL for the player headshot (https://lumify.ai/media/players/{sport}/{id}.{ext}). Null until the sport's headshot/enrichment job. Never a vendor CDN."}},"additionalProperties":true,"type":"object","title":"Player","description":"Directory identity for one player. Shared keys on every sport; null means\nunknown, not 'wrong sport'. Sport-named metrics do not live here —\ntennis ranking is ``rankings`` (null on every other sport). Tennis\n``/stats`` also exposes ``ranking`` / ``ranking_points`` on the tennis\nplayer block."},"PlayerEventsResponse":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data","default":[]},"has_more":{"type":"boolean","title":"Has More","default":false},"next_after_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next After Id"}},"additionalProperties":true,"type":"object","required":["player_id"],"title":"PlayerEventsResponse"},"PlayerPropBookLine":{"properties":{"over":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Over","description":"American odds for the Over side at this book. Null if that book has no Over."},"under":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Under","description":"American odds for the Under side at this book. Null if that book has no Under."}},"additionalProperties":true,"type":"object","title":"PlayerPropBookLine"},"PlayerPropLine":{"properties":{"player":{"type":"string","title":"Player","description":"Player display name as stored on the prop line."},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Lumify player id when the line's player name matches this event's roster or box (normalized full_name, then unique last-token fallback). Null when unmatched — the line is still returned."},"market":{"type":"string","title":"Market","description":"Prop market category, used as lumify_odds.market_key (e.g. passing_yards, points). Not the legacy player_* names."},"line":{"type":"number","title":"Line","description":"Main Over/Under number for this player + market."},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current","description":"This-event counting stat from lumify_player_game_stats — a direct 1:1 box slug, a combo sum (e.g. points + rebounds), a weighted combo (e.g. total_bases = H + 2B + 2*3B + 3*HR), or a yes/no threshold (1.0/0.0, e.g. double-double). Null before the box lands, when unmatched, or when settleable is false."},"pct_of_line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Of Line","description":"current / line as a percent (one decimal). Null when current is null, or for yes/no threshold markets (double_double, triple_double) where current is a 1.0/0.0 flag and a ratio against the line is not meaningful."},"settleable":{"type":"boolean","title":"Settleable","description":"True when this market can be graded from this-event box counts (1:1 slug, combo sum, weighted combo, or yes/no threshold). False when the line is returned but not graded."},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result","description":"in_progress while the event is not final. over / under / push once final and current is present. At final with no current: dnp when box ingest has landed and this player has zero tracked box rows (did not play); no_stat when the player has other box rows this event but this market's stat category never landed, the priced name never matched, or box ingest has not landed yet. Null when settleable is false."},"books":{"additionalProperties":{"$ref":"#/components/schemas/PlayerPropBookLine"},"type":"object","title":"Books","description":"Per-book Over/Under American prices at this exact line. Keys are odds slugs (pinnacle, fanduel, …). Books that posted a different number appear on a separate player_props row."}},"additionalProperties":true,"type":"object","required":["player","market","line","settleable"],"title":"PlayerPropLine"},"PlayerPropsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when no player-prop mains have been ingested for this event. available:false is not charged."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Sport slug (nfl, ncaaf, nba, ncaab, nhl, or mlb on this endpoint)."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Event status: scheduled, inprogress, delayed, final, …"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period","description":"Current period label from the live score snapshot (e.g. '3')."},"clock":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clock","description":"Game clock from the live score snapshot (e.g. '8:42')."},"player_props":{"items":{"$ref":"#/components/schemas/PlayerPropLine"},"type":"array","title":"Player Props","description":"One row per (player, market, line). All books at that exact line are nested under books. Empty when available is false."}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"PlayerPropsResponse"},"PlayerRankings":{"properties":{"singles":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Singles","description":"ATP/WTA singles ranking. Tennis only."},"points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Points","description":"ATP/WTA ranking points. Tennis only."}},"additionalProperties":true,"type":"object","title":"PlayerRankings"},"PlayersListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Player"},"type":"array","title":"Data","default":[]},"has_more":{"type":"boolean","title":"Has More","default":false},"next_after_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next After Id"}},"additionalProperties":true,"type":"object","title":"PlayersListResponse"},"ResolveEventCandidate":{"properties":{"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League"},"event_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Status","description":"scheduled | final | …"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At","description":"ISO 8601 kickoff."},"home_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team"},"away_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons"}},"additionalProperties":true,"type":"object","title":"ResolveEventCandidate"},"ResolveEventClues":{"properties":{"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id","description":"Direct Lumify event id (ground truth)."},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Find this player's event (falls back to roster team schedule)."},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Find this team's event. Add opponent_team_id for a matchup."},"opponent_team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Opponent Team Id","description":"Narrows to a game against this team; requires team_id or player_id."},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date","description":"Inclusive UTC YYYY-MM-DD. Requires end_date."},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date","description":"Inclusive UTC YYYY-MM-DD. Requires start_date."}},"additionalProperties":true,"type":"object","title":"ResolveEventClues"},"ResolveEventOptions":{"properties":{"max_candidates":{"type":"integer","maximum":25.0,"minimum":1.0,"title":"Max Candidates","description":"Candidate cap when ambiguous.","default":5},"min_confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Min Confidence","description":"Auto-resolve floor.","default":0.85}},"additionalProperties":true,"type":"object","title":"ResolveEventOptions"},"ResolveEventRequest":{"properties":{"clues":{"$ref":"#/components/schemas/ResolveEventClues","description":"event_id, or player/team + date window."},"options":{"$ref":"#/components/schemas/ResolveEventOptions"}},"additionalProperties":true,"type":"object","title":"ResolveEventRequest"},"ResolveEventResponse":{"properties":{"status":{"type":"string","title":"Status","description":"resolved | ambiguous | not_found | error"},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id","description":"Set only when status is resolved."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League"},"event_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Status","description":"scheduled | final | …"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At","description":"ISO 8601 kickoff."},"home_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team"},"away_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons"},"clues_used":{"items":{"type":"string"},"type":"array","title":"Clues Used"},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method","description":"event_id | player_window | player_team_window | team_window | matchup_window."},"participant_conflict":{"type":"boolean","title":"Participant Conflict","description":"True when event_id conflicts with an explicit player/team clue or date window.","default":false},"candidates":{"items":{"$ref":"#/components/schemas/ResolveEventCandidate"},"type":"array","title":"Candidates","description":"Plausible events when ambiguous."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"additionalProperties":true,"type":"object","required":["status"],"title":"ResolveEventResponse"},"ResolvePlayerCandidate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Lumify player id."},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Catalog display name."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons","default":[]}},"additionalProperties":true,"type":"object","title":"ResolvePlayerCandidate"},"ResolvePlayerClues":{"properties":{"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Sport slug, e.g. nfl or mlb."},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team id."},"team_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Text","description":"Team abbreviation, slug, or name (e.g. CIN)."},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id","description":"Scope the match to this event's roster."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Roster position abbreviation, e.g. WR or QB."},"vendor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor","description":"Optional catalog source slug when vendor_player_key is set."},"vendor_player_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor Player Key","description":"Exact catalog key from a connected source, when you already have one."},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"Reserved. Historical roster as-of is not applied in this version."}},"additionalProperties":true,"type":"object","title":"ResolvePlayerClues"},"ResolvePlayerOptions":{"properties":{"max_candidates":{"type":"integer","maximum":25.0,"minimum":1.0,"title":"Max Candidates","description":"Maximum candidates to return when the match is ambiguous.","default":5},"min_confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Min Confidence","description":"Auto-resolve floor. Unique hits below this return ambiguous.","default":0.85},"mode":{"type":"string","title":"Mode","description":"strict (exact / Jr / F.Last on a roster), permissive (unique last-token on event/team roster), or ingest (sport-wide fuzzy).","default":"strict"}},"additionalProperties":true,"type":"object","title":"ResolvePlayerOptions"},"ResolvePlayerRequest":{"properties":{"query":{"type":"string","title":"Query","description":"Messy player name or fragment, e.g. J. Chase.","default":""},"clues":{"$ref":"#/components/schemas/ResolvePlayerClues","description":"Optional sport, team, event, position, or catalog-key clues."},"options":{"$ref":"#/components/schemas/ResolvePlayerOptions","description":"Confidence floor, candidate cap, and match mode."}},"additionalProperties":true,"type":"object","title":"ResolvePlayerRequest"},"ResolvePlayerResponse":{"properties":{"status":{"type":"string","title":"Status","description":"resolved | ambiguous | not_found | error"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Set only when status is resolved."},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons","default":[]},"clues_used":{"items":{"type":"string"},"type":"array","title":"Clues Used","default":[]},"candidates":{"items":{"$ref":"#/components/schemas/ResolvePlayerCandidate"},"type":"array","title":"Candidates","default":[]},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"additionalProperties":true,"type":"object","required":["status"],"title":"ResolvePlayerResponse"},"ResolveTeamCandidate":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team id."},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Catalog display name."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Sport slug."},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League","description":"League slug."},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation","description":"Catalog abbreviation."},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence","description":"Per-candidate confidence."},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons","description":"Why this candidate matched."}},"additionalProperties":true,"type":"object","title":"ResolveTeamCandidate"},"ResolveTeamClues":{"properties":{"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Sport slug, e.g. nfl or mlb."},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League","description":"League slug, tighter than sport (e.g. mls, epl)."},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id","description":"Scope the match to this event's participants first."},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Empty query uses this player's current team; otherwise a last-resort confirm."},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Direct Lumify team id (also accepted as an all-digit query)."}},"additionalProperties":true,"type":"object","title":"ResolveTeamClues"},"ResolveTeamOptions":{"properties":{"max_candidates":{"type":"integer","maximum":25.0,"minimum":1.0,"title":"Max Candidates","description":"Maximum candidates to return when the match is ambiguous.","default":5},"min_confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Min Confidence","description":"Auto-resolve floor. Unique hits below this return ambiguous.","default":0.85}},"additionalProperties":true,"type":"object","title":"ResolveTeamOptions"},"ResolveTeamRequest":{"properties":{"query":{"type":"string","title":"Query","description":"Team string: nickname, abbreviation, slug, metro, or alias (e.g. Niners, CIN, NY Giants).","default":""},"clues":{"$ref":"#/components/schemas/ResolveTeamClues","description":"Optional sport, league, event, player, or team-id clues."},"options":{"$ref":"#/components/schemas/ResolveTeamOptions","description":"Confidence floor and candidate cap."}},"additionalProperties":true,"type":"object","title":"ResolveTeamRequest"},"ResolveTeamResponse":{"properties":{"status":{"type":"string","title":"Status","description":"resolved | ambiguous | not_found | error"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Set only when status is resolved."},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Catalog display name."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Resolved sport slug."},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League","description":"Resolved league slug."},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation","description":"Catalog abbreviation."},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence","description":"Auto-resolve confidence."},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons","description":"Why the unique bind matched."},"clues_used":{"items":{"type":"string"},"type":"array","title":"Clues Used","description":"Clue fields that were supplied."},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method","description":"Kernel match method (abbreviation, nickname, alias, metro, …)."},"sport_conflict":{"type":"boolean","title":"Sport Conflict","description":"True when a ground-truth id/slug disagrees with an explicit sport or league clue.","default":false},"candidates":{"items":{"$ref":"#/components/schemas/ResolveTeamCandidate"},"type":"array","title":"Candidates","description":"Plausible teams when status is ambiguous."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Human-readable status note."}},"additionalProperties":true,"type":"object","required":["status"],"title":"ResolveTeamResponse"},"ScoreEntry":{"properties":{"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation"},"score":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score"},"is_winner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Winner"},"period_scores":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Period Scores","default":[]}},"additionalProperties":true,"type":"object","title":"ScoreEntry"},"ScoreResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"finished":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Finished"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"clock":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clock"},"scores":{"items":{"$ref":"#/components/schemas/ScoreEntry"},"type":"array","title":"Scores","default":[]},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":true,"type":"object","required":["event_id"],"title":"ScoreResponse"},"Season":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"is_current":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Current"},"sport":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Sport"},"league":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"League"}},"additionalProperties":true,"type":"object","title":"Season"},"SeasonSummary":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},"additionalProperties":true,"type":"object","title":"SeasonSummary"},"SeasonsListResponse":{"properties":{"seasons":{"items":{"$ref":"#/components/schemas/Season"},"type":"array","title":"Seasons","default":[]},"total":{"type":"integer","title":"Total","default":0}},"additionalProperties":true,"type":"object","title":"SeasonsListResponse"},"SplitsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"false when no splits have been ingested (or sport unsupported). available:false is not charged.","default":false},"captured_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captured At","description":"UTC timestamp of the most recent splits ingest for this event; null when available is false."},"consensus":{"additionalProperties":true,"type":"object","title":"Consensus","description":"Cross-bookmaker averages per market/side (moneyline/spread/total → home/away/over/under → bets_pct, handle_pct, optional price/line)."},"bookmakers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Bookmakers","description":"Per-bookmaker breakdown. Each item: {bookmaker: odds slug (e.g. draftkings), name, moneyline, spread, total}. Bookmaker keys match /odds (not upstream short keys like dk)."}},"additionalProperties":true,"type":"object","required":["event_id"],"title":"SplitsResponse"},"Sport":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"is_team_sport":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Team Sport"},"leagues":{"items":{"$ref":"#/components/schemas/LeagueSummary"},"type":"array","title":"Leagues","default":[]}},"additionalProperties":true,"type":"object","title":"Sport"},"SportsListResponse":{"properties":{"sports":{"items":{"$ref":"#/components/schemas/Sport"},"type":"array","title":"Sports","default":[]},"total":{"type":"integer","title":"Total","default":0}},"additionalProperties":true,"type":"object","title":"SportsListResponse"},"StatsHeadToHead":{"properties":{"window":{"type":"integer","title":"Window","description":"Max trailing meetings considered (see `windows.head_to_head`)."},"meetings":{"items":{"$ref":"#/components/schemas/StatsHeadToHeadMeeting"},"type":"array","title":"Meetings","description":"Most-recent-first past meetings between these two teams, up to `window`.","default":[]},"total":{"type":"integer","title":"Total","description":"Number of meetings returned in `meetings`.","default":0}},"additionalProperties":true,"type":"object","required":["window"],"title":"StatsHeadToHead"},"StatsHeadToHeadMeeting":{"properties":{"home_goals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Goals","description":"Goals scored by this event's home team in that past meeting."},"away_goals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Goals","description":"Goals scored by this event's away team in that past meeting."}},"additionalProperties":true,"type":"object","title":"StatsHeadToHeadMeeting"},"StatsLeagueContext":{"properties":{"avg_goals_per_team":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Goals Per Team","description":"League-wide average goals scored per team per game this season, used as the baseline the /intelligence layer compares each team's attack/defense against. Null before enough club-season games exist."}},"additionalProperties":true,"type":"object","title":"StatsLeagueContext"},"StatsLineup":{"properties":{"available":{"type":"boolean","title":"Available","description":"False when no lineup has been ingested yet for this side."},"formation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Formation","description":"e.g. '4-3-3'. Null when unavailable."},"starters":{"items":{"$ref":"#/components/schemas/StatsLineupPlayer"},"type":"array","title":"Starters","default":[]},"bench":{"items":{"$ref":"#/components/schemas/StatsLineupPlayer"},"type":"array","title":"Bench","default":[]},"captured_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captured At","description":"When this lineup was captured from the source, 'YYYY-MM-DD HH:MM:SS'."}},"additionalProperties":true,"type":"object","required":["available"],"title":"StatsLineup"},"StatsLineupPlayer":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation, e.g. 'GK', 'CB'."},"jersey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jersey"},"formation_place":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Formation Place","description":"Slot index within the formation, when the source provides one."},"espn_athlete_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Espn Athlete Id"},"starter":{"type":"boolean","title":"Starter","description":"True in `starters`, false in `bench`.","default":false}},"additionalProperties":true,"type":"object","title":"StatsLineupPlayer"},"StatsRatesBlock":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'event_stats_avg' (persisted box-score averages)."},"window":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Window","description":"Which rolling window this block covers: 'l5' (see `window_size` for the fixed game count) or 'season' (an intentionally variable-length window — see `games` for how many games it actually covers for this team)."},"window_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Size","description":"Fixed sample depth for this window, only present when the window has one (e.g. 5 for 'l5'). Omitted for 'season', since season length varies by team — use `games` instead."},"games":{"type":"integer","title":"Games","description":"Games with box-score data included in this average.","default":0},"shots_for":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shots For","description":"Avg. shots taken per game."},"shots_against":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shots Against","description":"Avg. shots conceded per game."},"shots_on_target_for":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shots On Target For","description":"Avg. shots on target taken per game."},"shots_on_target_against":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shots On Target Against","description":"Avg. shots on target conceded per game."},"possession_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Possession Pct","description":"Avg. possession percentage (0-100)."},"corners_for":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Corners For","description":"Avg. corners won per game."},"corners_against":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Corners Against","description":"Avg. corners conceded per game."},"fouls":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fouls","description":"Avg. fouls committed per game."},"yellow_cards":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Yellow Cards","description":"Avg. yellow cards received per game."},"red_cards":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Red Cards","description":"Avg. red cards received per game."},"passes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Passes","description":"Avg. total passes per game (see pass_accuracy_pct for completion rate)."},"pass_accuracy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pass Accuracy Pct","description":"Avg. pass completion percentage (0-100)."},"saves":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Saves","description":"Avg. goalkeeper saves per game."},"offsides":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Offsides","description":"Avg. offsides committed per game."},"tackles":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tackles","description":"Avg. total tackles per game (total tackles, not effective tackles)."},"interceptions":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interceptions","description":"Avg. interceptions per game."},"blocked_shots":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Blocked Shots","description":"Avg. shots blocked by this team per game."},"assists":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Assists","description":"Avg. team assists per game, summed from per-player goalAssists (the ingested team box has no team-level assists field)."},"save_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Save Rate","description":"Saves / shots on target faced across the window (not an average of per-game rates)."},"field_games":{"additionalProperties":{"type":"integer"},"type":"object","title":"Field Games","description":"Per-field sample size, keyed by the metric names above (including Phase 1C offsides/tackles/interceptions/blocked_shots/assists). `games` is how many games are in this window overall, but an individual field can have a smaller count when a source's box score omits that stat for some fixtures — lets agents tell 'averaged over all N games' apart from 'averaged over fewer'. Derived `save_rate` is the one exception that also appears here (joint saves + SoT faced coverage).","default":{}}},"additionalProperties":true,"type":"object","title":"StatsRatesBlock"},"StatsRecentForm":{"properties":{"window":{"type":"integer","title":"Window","description":"Number of trailing completed games this form line covers."},"results":{"items":{"type":"string"},"type":"array","title":"Results","description":"Most-recent-first results over `window`: 'W', 'D', or 'L'.","default":[]},"goals_scored":{"items":{"type":"integer"},"type":"array","title":"Goals Scored","description":"Goals this team scored in each game, same order as `results`.","default":[]},"goals_conceded":{"items":{"type":"integer"},"type":"array","title":"Goals Conceded","description":"Goals this team conceded in each game, same order as `results`.","default":[]}},"additionalProperties":true,"type":"object","required":["window"],"title":"StatsRecentForm"},"StatsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when either team hasn't resolved for this fixture yet — every other field is omitted in that case and the call isn't billed."},"league_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Slug","description":"League slug, e.g. 'mls'."},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile","description":"'club' or 'world_cup'. Determines the shape of `teams.*.team_strength`, `teams.*.venue`, and whether `teams.*.sos` is populated."},"neutral_site":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Neutral Site","description":"Whether this fixture is at a neutral venue. Informational here — not used in any of this endpoint's own aggregates, but factored into home-advantage scoring on GET /v1/events/{id}/intelligence."},"windows":{"anyOf":[{"$ref":"#/components/schemas/StatsWindows"},{"type":"null"}]},"teams":{"anyOf":[{"$ref":"#/components/schemas/StatsTeams"},{"type":"null"}]},"head_to_head":{"anyOf":[{"$ref":"#/components/schemas/StatsHeadToHead"},{"type":"null"}]},"league_context":{"anyOf":[{"$ref":"#/components/schemas/StatsLeagueContext"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"StatsResponse"},"StatsSos":{"properties":{"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Provenance tag, e.g. 'opp_ppg_avg'."},"window":{"type":"integer","title":"Window","description":"Number of trailing opponents this strength-of-schedule average covers."},"games":{"type":"integer","title":"Games","description":"Opponent games actually available within `window`.","default":0},"avg_opp_ppg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Opp Ppg","description":"Average points-per-game of the opponents faced in `window`."},"avg_opp_rank":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Opp Rank","description":"Average league-table rank of the opponents faced in `window`."}},"additionalProperties":true,"type":"object","required":["window"],"title":"StatsSos"},"StatsTeam":{"properties":{"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Lumify media URL for the team logo (e.g. https://lumify.ai/media/teams/soccer/855.png). Null until the logo ingest job has published the asset. Never a vendor CDN or raw GCS URL."},"rest_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rest Days","description":"Days since this team's previous completed game."},"recent_form":{"anyOf":[{"$ref":"#/components/schemas/StatsRecentForm"},{"type":"null"}]},"rates_l5":{"anyOf":[{"$ref":"#/components/schemas/StatsRatesBlock"},{"type":"null"}],"description":"Boxscore rate averages over the trailing 5 games."},"rates_season":{"anyOf":[{"$ref":"#/components/schemas/StatsRatesBlock"},{"type":"null"}],"description":"Boxscore rate averages over the current season/edition."},"lineup":{"anyOf":[{"$ref":"#/components/schemas/StatsLineup"},{"type":"null"}]},"team_strength":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Team Strength","description":"Club fixtures: {source: 'league_table_ppg', ppg, games, points, w, d, l, gf, ga, gd, rank} from the current league table."},"venue":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Venue","description":"Club fixtures: {source: 'home_away_ppg_split', home_ppg, home_games, away_ppg, away_games}."},"sos":{"anyOf":[{"$ref":"#/components/schemas/StatsSos"},{"type":"null"}],"description":"Strength of schedule (avg. opponent PPG/rank over recent games). Null until enough league games exist."}},"additionalProperties":true,"type":"object","title":"StatsTeam"},"StatsTeams":{"properties":{"home":{"anyOf":[{"$ref":"#/components/schemas/StatsTeam"},{"type":"null"}]},"away":{"anyOf":[{"$ref":"#/components/schemas/StatsTeam"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"StatsTeams"},"StatsWindows":{"properties":{"recent_form":{"type":"integer","title":"Recent Form","description":"Trailing games covered by each team's `recent_form`."},"rates_l5":{"type":"integer","title":"Rates L5","description":"Trailing games covered by each team's `rates_l5`."},"rates_season":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Rates Season","description":"Always the literal string 'season' — a deliberately variable-length window (see each team's `rates_season.games`), unlike the fixed integer windows above."},"head_to_head":{"type":"integer","title":"Head To Head","description":"Trailing meetings between these two teams considered for `head_to_head`."},"sos":{"type":"integer","title":"Sos","description":"Trailing opponents covered by each team's `sos`."}},"additionalProperties":true,"type":"object","required":["recent_form","rates_l5","rates_season","head_to_head","sos"],"title":"StatsWindows"},"Team":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"abbreviation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abbreviation"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Lumify media URL for the team logo (e.g. https://lumify.ai/media/teams/mlb/70.png). Null until the logo ingest job has published the asset. Never a vendor CDN or raw GCS URL."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"league":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"conference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conference"},"division":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Division"},"venue":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Venue"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"additionalProperties":true,"type":"object","title":"Team"},"TeamPropLine":{"properties":{"team":{"type":"string","title":"Team","description":"Team display name (home or away participant)."},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id","description":"Lumify team id for this side. Null only if the participant has no team row."},"side":{"type":"string","title":"Side","description":"'home' or 'away'."},"market":{"type":"string","title":"Market","description":"Always 'team_total' today — this team's full-game points/goals Over/Under."},"line":{"type":"number","title":"Line","description":"Main Over/Under number for this team's score."},"current":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current","description":"This-event team score from lumify_participants.score. Null before kickoff or when the score is not numeric."},"pct_of_line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Of Line","description":"current / line as a percent (one decimal). Null when current is null."},"settleable":{"type":"boolean","title":"Settleable","description":"True — team totals grade from the same participant score /odds uses."},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result","description":"in_progress while the event is not final. over / under / push once final and current is present. Null when current is missing."},"books":{"additionalProperties":{"$ref":"#/components/schemas/PlayerPropBookLine"},"type":"object","title":"Books","description":"Per-book Over/Under American prices at this exact line. Keys are odds slugs (pinnacle, …)."}},"additionalProperties":true,"type":"object","required":["team","side","market","line","settleable"],"title":"TeamPropLine"},"TeamPropsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when no team-total mains have been ingested for this event. available:false is not charged."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Sport slug (nfl, ncaaf, mlb, or soccer)."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Event status: scheduled, inprogress, delayed, final, …"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period","description":"Current period label from the live score snapshot (e.g. '3')."},"clock":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clock","description":"Game clock from the live score snapshot (e.g. '8:42')."},"team_props":{"items":{"$ref":"#/components/schemas/TeamPropLine"},"type":"array","title":"Team Props","description":"One row per (team, line). All books at that exact line are nested under books. Empty when available is false."}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"TeamPropsResponse"},"TeamsListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Team"},"type":"array","title":"Data","default":[]},"has_more":{"type":"boolean","title":"Has More","default":false},"next_after_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next After Id"}},"additionalProperties":true,"type":"object","title":"TeamsListResponse"},"TennisStatsCareerRates":{"properties":{"source":{"type":"string","title":"Source","description":"Always 'tennis_api' — career aggregates persisted by stats_ingest_tennis from our Stage-2 tennis data provider."},"window":{"type":"string","title":"Window","description":"Always 'career' — persisted career match-stats (not a trailing L10)."},"captured_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captured At","description":"UTC timestamp when these rates were last persisted, 'YYYY-MM-DD HH:MM:SS'."},"hold_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hold Pct","description":"Career service-hold rate (0–1) from persisted serve game counts."},"break_pts_converted":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Break Pts Converted","description":"Career break-point conversion rate (0–1) on return."},"break_pts_saved":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Break Pts Saved","description":"Career break-point save rate (0–1) on serve when available."},"first_serve_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"First Serve Pct","description":"Career first-serve-in rate (0–1) when the vendor exposes counts."},"first_serve_won":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"First Serve Won","description":"Career first-serve points won rate (0–1) when available."},"second_serve_won":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Second Serve Won","description":"Career second-serve points won rate (0–1) when available."},"aces":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aces","description":"Career ace count when present; null when the source does not expose aces on match-stats for this player."},"double_faults":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Double Faults","description":"Career double-fault count when present; null when the vendor does not expose double faults on match-stats for this player."}},"additionalProperties":true,"type":"object","required":["source","window"],"title":"TennisStatsCareerRates"},"TennisStatsCareerSurface":{"properties":{"source":{"type":"string","title":"Source","description":"Always 'tennis_api' — persisted surface-summary from our Stage-2 tennis data provider."},"window_years":{"type":"integer","title":"Window Years","description":"Trailing calendar years of surface W/L included (currently 3)."},"surface":{"type":"string","title":"Surface","description":"Match competition surface slug this block is filtered to (hard/clay/grass/indoor_hard/carpet)."},"wins":{"type":"integer","title":"Wins","description":"Wins on this surface in the window."},"losses":{"type":"integer","title":"Losses","description":"Losses on this surface in the window."},"win_pct":{"type":"number","title":"Win Pct","description":"wins / (wins + losses) as 0–1."},"captured_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captured At","description":"UTC timestamp when surface W/L was last persisted, 'YYYY-MM-DD HH:MM:SS'."}},"additionalProperties":true,"type":"object","required":["source","window_years","surface","wins","losses","win_pct"],"title":"TennisStatsCareerSurface"},"TennisStatsForm":{"properties":{"window":{"type":"integer","title":"Window","description":"Trailing completed singles matches considered."},"results":{"items":{"type":"string"},"type":"array","title":"Results","description":"Most-recent-first W/L results from ingested match history (no draws). Counts only status final/complete — walkovers are excluded (no games played); retirements count (status final, result_type retired).","default":[]},"sets_for":{"items":{"type":"integer"},"type":"array","title":"Sets For","description":"Sets won by this player in each form match (aligned with results when scores exist).","default":[]},"sets_against":{"items":{"type":"integer"},"type":"array","title":"Sets Against","description":"Sets won by the opponent in each form match (aligned with results when scores exist).","default":[]},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface","description":"Present on surface_form only — the competition surface this window is filtered to."}},"additionalProperties":true,"type":"object","required":["window"],"title":"TennisStatsForm"},"TennisStatsH2H":{"properties":{"window":{"type":"integer","title":"Window","description":"Max trailing meetings considered (see windows.head_to_head)."},"meetings":{"items":{"$ref":"#/components/schemas/TennisStatsH2HMeeting"},"type":"array","title":"Meetings","description":"Most-recent-first prior singles meetings between these two players (status final/complete only — walkovers excluded; retirements included).","default":[]},"total":{"type":"integer","title":"Total","description":"Number of meetings returned in meetings.","default":0}},"additionalProperties":true,"type":"object","required":["window"],"title":"TennisStatsH2H"},"TennisStatsH2HMeeting":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID of the past meeting."},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At","description":"UTC start time of that meeting, 'YYYY-MM-DD HH:MM:SS'."},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface","description":"Competition surface of that meeting."},"winner_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Winner Role","description":"'player_1' or 'player_2' relative to *this* fixture's player ids (not the historical event's role labels)."},"sets_won":{"$ref":"#/components/schemas/TennisStatsSetsWon","description":"Sets won by this fixture's player_1 / player_2 in that meeting."}},"additionalProperties":true,"type":"object","required":["event_id","sets_won"],"title":"TennisStatsH2HMeeting"},"TennisStatsMatch":{"properties":{"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface","description":"Competition surface slug (hard/clay/grass/carpet/indoor_hard/…)."},"competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competition Id","description":"Lumify competition ID."},"competition_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Competition Name","description":"Tournament / competition name."},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"Competition tier when known (e.g. '1000', '500')."},"round":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Round","description":"Draw round label as ingested (e.g. 'Round of 16', 'Quarterfinal', 'Semifinal', 'Final') — not abbreviated codes like 'R16'."},"court":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Court","description":"Named court within the venue when known. Not currently populated by ingest (effectively always null)."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Event status (scheduled/inprogress/final/…)."},"result_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Type","description":"How the match ended when final: regulation/retired; walkovers never went live."},"scoreboard":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsScoreboard"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"TennisStatsMatch"},"TennisStatsPlayer":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id","description":"Lumify player ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"ranking":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ranking","description":"Current singles ranking from lumify_players.tennis_ranking."},"ranking_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ranking Points","description":"Current ranking points from lumify_players.tennis_ranking_points."},"rest_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rest Days","description":"Days since this player's previous completed singles match (any tour). Anchored on status final/complete only — walkovers do not reset rest; retirements do."},"recent_form":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsForm"},{"type":"null"}],"description":"Trailing singles results across all surfaces (walkovers excluded; retirements included — see TennisStatsForm)."},"surface_form":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsForm"},{"type":"null"}],"description":"Trailing singles results filtered to this match's competition surface (walkovers excluded; retirements included — see TennisStatsForm)."},"record":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsRecord"},{"type":"null"}],"description":"Wins/losses over the tour_lookback window in our DB (walkovers excluded; retirements included)."},"career_rates":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsCareerRates"},{"type":"null"}],"description":"Stage-2 career serve/return rates from persisted match-stats. Null when stats_ingest_tennis has not yet written usable rows for this player."},"career_surface":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsCareerSurface"},{"type":"null"}],"description":"Stage-2 trailing surface W/L on this match's competition surface (persisted surface-summary, last windows.career_surface_years). Null when no matches on that surface in the window or ingest has not run."}},"additionalProperties":true,"type":"object","title":"TennisStatsPlayer"},"TennisStatsPlayers":{"properties":{"player_1":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsPlayer"},{"type":"null"}]},"player_2":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsPlayer"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"TennisStatsPlayers"},"TennisStatsRecord":{"properties":{"source":{"type":"string","title":"Source","description":"Always 'tour_lookback' — wins/losses from our DB over lookback_days (not a vendor season table)."},"lookback_days":{"type":"integer","title":"Lookback Days","description":"Calendar days of lookback used for this record."},"wins":{"type":"integer","title":"Wins","description":"Singles wins in the lookback window (status final/complete only; walkovers excluded, retirements count).","default":0},"losses":{"type":"integer","title":"Losses","description":"Singles losses in the lookback window (status final/complete only; walkovers excluded, retirements count).","default":0},"games":{"type":"integer","title":"Games","description":"Matches counted (wins + losses). Walkovers are not played matches and are excluded; retirements are included.","default":0}},"additionalProperties":true,"type":"object","required":["source","lookback_days"],"title":"TennisStatsRecord"},"TennisStatsResponse":{"properties":{"event_id":{"type":"integer","title":"Event Id","description":"Lumify event ID."},"available":{"type":"boolean","title":"Available","description":"False when draw_type is not exactly 'singles' (doubles and qualifying are out of scope for Stage-1/Stage-2) or either player_id is unresolved — every other field is omitted in that case and the call isn't billed."},"league_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Slug","description":"Tour slug — 'atp' or 'wta'."},"draw_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draw Type","description":"Event draw format. Always 'singles' when available is true. draw_type values other than 'singles' (including 'doubles' and 'qualifying') return available:false — consistent with the rest of the tennis predictive stack."},"windows":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsWindows"},{"type":"null"}]},"match":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsMatch"},{"type":"null"}]},"players":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsPlayers"},{"type":"null"}]},"head_to_head":{"anyOf":[{"$ref":"#/components/schemas/TennisStatsH2H"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["event_id","available"],"title":"TennisStatsResponse"},"TennisStatsScoreboard":{"properties":{"sets_won":{"$ref":"#/components/schemas/TennisStatsSetsWon","description":"Match sets won by each side."},"winner_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Winner Role","description":"'player_1' or 'player_2' when decided; null for upcoming/live undecided matches."},"sets":{"items":{"$ref":"#/components/schemas/TennisStatsSet"},"type":"array","title":"Sets","description":"Per-set game scores from lumify_period_scores (period_type='set'), ordered by period_num.","default":[]}},"additionalProperties":true,"type":"object","required":["sets_won"],"title":"TennisStatsScoreboard"},"TennisStatsSet":{"properties":{"period_num":{"type":"integer","title":"Period Num","description":"Set number (1-based)."},"player_1_games":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player 1 Games","description":"Games won by player_1 in this set."},"player_2_games":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player 2 Games","description":"Games won by player_2 in this set."},"tiebreak_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tiebreak Score","description":"Tiebreak points for this set when present on the source row. Not currently populated by ingest (effectively always null)."}},"additionalProperties":true,"type":"object","required":["period_num"],"title":"TennisStatsSet"},"TennisStatsSetsWon":{"properties":{"player_1":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player 1","description":"Sets won by player_1."},"player_2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player 2","description":"Sets won by player_2."}},"additionalProperties":true,"type":"object","title":"TennisStatsSetsWon"},"TennisStatsWindows":{"properties":{"recent_form":{"type":"integer","title":"Recent Form","description":"Trailing matches covered by each player's recent_form."},"surface_form":{"type":"integer","title":"Surface Form","description":"Trailing matches covered by each player's surface_form."},"head_to_head":{"type":"integer","title":"Head To Head","description":"Trailing meetings considered for head_to_head."},"record_lookback_days":{"type":"integer","title":"Record Lookback Days","description":"Calendar days covered by each player's record (tour_lookback)."},"career_surface_years":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Career Surface Years","description":"Trailing calendar years covered by each player's career_surface (Stage-2)."}},"additionalProperties":true,"type":"object","required":["recent_form","surface_form","head_to_head","record_lookback_days"],"title":"TennisStatsWindows"},"TrialKeyRequest":{"properties":{"cf-turnstile-response":{"type":"string","title":"Cf-Turnstile-Response","description":"Cloudflare Turnstile response token from the widget on /docs/ai.","default":""}},"type":"object","title":"TrialKeyRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebhookCreateResponse":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"event_types":{"items":{"type":"string"},"type":"array","title":"Event Types","description":"One or more of score, status, line_move, injury. Defaults to [score, status]. line_move requires sport or event_id. injury fires only on material/critical status changes (not info reconfirms), 0.5 credits per delivery."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Restrict to one sport slug. Required (or event_id) when event_types includes line_move."},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id","description":"Restrict to a single event. Required (or sport) when event_types includes line_move."},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"signing_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signing Secret","description":"Returned only on create — store it to verify Lumify-Signature."}},"additionalProperties":true,"type":"object","title":"WebhookCreateResponse"},"WebhookDeleteResponse":{"properties":{"deleted":{"type":"boolean","title":"Deleted","default":true},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"}},"additionalProperties":true,"type":"object","title":"WebhookDeleteResponse"},"WebhookDeliveryItem":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"attempt":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Attempt"},"parent_delivery_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Delivery Id"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"given_up":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Given Up"},"next_retry_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Retry At"},"delivered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivered At"}},"additionalProperties":true,"type":"object","title":"WebhookDeliveryItem"},"WebhookDeliveryListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookDeliveryItem"},"type":"array","title":"Data","default":[]},"next_after_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next After Id"}},"additionalProperties":true,"type":"object","title":"WebhookDeliveryListResponse"},"WebhookListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookSubscription"},"type":"array","title":"Data","default":[]},"total":{"type":"integer","title":"Total","default":0}},"additionalProperties":true,"type":"object","title":"WebhookListResponse"},"WebhookSubscription":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"event_types":{"items":{"type":"string"},"type":"array","title":"Event Types","description":"One or more of score, status, line_move, injury. Defaults to [score, status]. line_move requires sport or event_id. injury fires only on material/critical status changes (not info reconfirms), 0.5 credits per delivery."},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport","description":"Restrict to one sport slug. Required (or event_id) when event_types includes line_move."},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id","description":"Restrict to a single event. Required (or sport) when event_types includes line_move."},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"signing_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signing Secret","description":"Returned only on create — store it to verify Lumify-Signature."}},"additionalProperties":true,"type":"object","title":"WebhookSubscription"}},"securitySchemes":{"ApiKeyBearer":{"type":"http","scheme":"bearer","bearerFormat":"lmfy-key","description":"Lumify API key passed as `Authorization: Bearer lmfy-...`."}}},"tags":[{"name":"sports","description":"Supported sports, leagues, and season calendars."},{"name":"events","description":"Schedules, live scores, odds, splits, and bet intelligence."},{"name":"teams","description":"First-class team resources."},{"name":"players","description":"Player profiles and participation history."},{"name":"agent","description":"Programmatic onboarding: key provisioning and credit balance."},{"name":"mcp","description":"Model Context Protocol server endpoint for AI agents."},{"name":"health","description":"Service health checks."}],"servers":[{"url":"https://lumify.ai","description":"Production"}]}