{"openapi":"3.1.0","info":{"title":"Emable API","summary":"Developer access to Emable data and asynchronous AI jobs.","description":"The pre-1.0 Emable API authenticates bearer API keys, resolves the caller to an Emable identity, and forwards compatible transaction-local PostgreSQL claims. AI work is submitted to a durable tenant-owned queue.\n\nThe full reference is also available as plain Markdown at [/llms.txt](/llms.txt) — convenient to paste into an LLM prompt.","version":"0.3.0"},"paths":{"/v1/docs":{"get":{"tags":["Documentation discovery"],"summary":"List Docs","operationId":"list_docs_v1_docs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DocSummary"},"type":"array","title":"Response List Docs V1 Docs Get"}}}}}}},"/v1/docs/search":{"get":{"tags":["Documentation discovery"],"summary":"Search Docs","operationId":"search_docs_v1_docs_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":200,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocSummary"},"title":"Response Search Docs V1 Docs Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/docs/{slug}":{"get":{"tags":["Documentation discovery"],"summary":"Get Doc","operationId":"get_doc_v1_docs__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["Service status"],"summary":"Check service health","description":"Returns static process health. This endpoint is public and never queries PostgreSQL.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/ready":{"get":{"tags":["Service status"],"summary":"Check service readiness","description":"Runs only `SELECT 1` through the runtime, jobs, auth, and native-function pools. Database connection details are never returned.","operationId":"ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadyResponse"}}}},"503":{"description":"PostgreSQL is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is not ready."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}}}}},"/auth/v1/token":{"post":{"tags":["Native auth"],"summary":"Create or refresh a browser session","operationId":"token_auth_v1_token_post","parameters":[{"name":"grant_type","in":"query","required":true,"schema":{"enum":["password","refresh_token"],"type":"string","description":"OAuth grant type","title":"Grant Type"},"description":"OAuth grant type"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthTokenRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/v1/authorize":{"get":{"tags":["Native auth"],"summary":"Begin native Google OAuth","operationId":"authorize_auth_v1_authorize_get","parameters":[{"name":"provider","in":"query","required":true,"schema":{"const":"google","type":"string","title":"Provider"}},{"name":"redirect_to","in":"query","required":true,"schema":{"type":"string","title":"Redirect To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/v1/callback":{"get":{"tags":["Native auth"],"summary":"Complete native Google OAuth","operationId":"oauth_callback_auth_v1_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"State"}},{"name":"emable_oauth_state","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emable Oauth State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/v1/exchange-code":{"post":{"tags":["Native auth"],"summary":"Exchange a one-time OAuth callback code for a browser session","operationId":"exchange_oauth_code_auth_v1_exchange_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthOAuthExchangeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/v1/user":{"get":{"tags":["Native auth"],"summary":"Get the current native Emable user","operationId":"current_user_auth_v1_user_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthUserResponse"}}}}},"security":[{"EmableAccessToken":[]}]},"patch":{"tags":["Native auth"],"summary":"Update the current native Emable user","operationId":"update_user_auth_v1_user_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthUpdateUserRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"EmableAccessToken":[]}]}},"/auth/v1/signup":{"post":{"tags":["Native auth"],"summary":"Create a native Emable account","operationId":"sign_up_auth_v1_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthSignUpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthSignUpResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/v1/logout":{"post":{"tags":["Native auth"],"summary":"Revoke a browser refresh token","operationId":"logout_auth_v1_logout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthLogoutRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/v1/recover":{"post":{"tags":["Native auth"],"summary":"Request password-reset instructions","operationId":"recover_password_auth_v1_recover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRecoveryRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/v1/reset-password":{"post":{"tags":["Native auth"],"summary":"Consume a one-time reset token and set a new password","operationId":"reset_password_auth_v1_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResetPasswordRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/capabilities":{"get":{"tags":["Capabilities"],"summary":"List Capabilities","operationId":"list_capabilities_v1_capabilities_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Q"}},{"name":"outcome","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Outcome"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":20},{"type":"null"}],"title":"Country"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Provider"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["live","pilot","internal"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"access","in":"query","required":false,"schema":{"anyOf":[{"enum":["read","write"],"type":"string"},{"type":"null"}],"title":"Access"}},{"name":"pricing_model","in":"query","required":false,"schema":{"anyOf":[{"enum":["per_run","per_query","included","contract"],"type":"string"},{"type":"null"}],"title":"Pricing Model"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilityStoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/capabilities":{"get":{"tags":["Capabilities"],"summary":"My Capabilities","description":"The catalogue as this account sees it: the open connectors everyone gets,\nplus the private ones belonging to firms this account is a member of.\n\nSeparate from `/capabilities` on purpose. That one is unauthenticated and\nmust never reveal that a private capability exists; this one exists precisely\nto show them side by side, which is what being an enterprise customer means.","operationId":"my_capabilities_v1_me_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyCapabilitiesResponse"}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/capabilities/{slug}":{"get":{"tags":["Capabilities"],"summary":"Capability Detail","operationId":"capability_detail_v1_capabilities__slug__get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilityDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/capabilities/{slug}/runs":{"post":{"tags":["Capabilities"],"summary":"Start Capability Run","operationId":"start_capability_run_v1_capabilities__slug__runs_post","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":200,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilityRunCreateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilityRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs":{"get":{"tags":["Capabilities"],"summary":"List Runs","operationId":"list_runs_v1_runs_get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["queued","running","succeeded","failed","refused","awaiting_approval"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"capability","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Capability"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilityRunListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{run_id}":{"get":{"tags":["Capabilities"],"summary":"Get Run","operationId":"get_run_v1_runs__run_id__get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilityRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/saved-configurations":{"get":{"tags":["Capabilities"],"summary":"List Saved Configurations","operationId":"list_saved_configurations_v1_saved_configurations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedConfigurationListResponse"}}}}},"security":[{"EmablePlatformCredential":[]}]},"post":{"tags":["Capabilities"],"summary":"Save Configuration","operationId":"save_configuration_v1_saved_configurations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedConfigurationCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedConfigurationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/saved-configurations/{configuration_id}":{"delete":{"tags":["Capabilities"],"summary":"Delete Saved Configuration","operationId":"delete_saved_configuration_v1_saved_configurations__configuration_id__delete","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"configuration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Configuration Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/saved-configurations/{configuration_id}/runs":{"post":{"tags":["Capabilities"],"summary":"Repeat Saved Configuration","operationId":"repeat_saved_configuration_v1_saved_configurations__configuration_id__runs_post","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"configuration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Configuration Id"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":200,"title":"Idempotency-Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilityRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage/summary":{"get":{"tags":["Capabilities"],"summary":"Usage Summary","operationId":"usage_summary_v1_usage_summary_get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/provider/overview":{"get":{"tags":["Capabilities"],"summary":"Provider Overview","operationId":"provider_overview_v1_provider_overview_get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderOverviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/use-cases":{"get":{"tags":["Use cases"],"summary":"List Use Cases","operationId":"list_use_cases_v1_use_cases_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Q"}},{"name":"outcome","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Outcome"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":20},{"type":"null"}],"title":"Country"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Provider"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["available","pilot","validation_required"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"access","in":"query","required":false,"schema":{"anyOf":[{"enum":["public","gated"],"type":"string"},{"type":"null"}],"title":"Access"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Category"}},{"name":"max_price","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100000,"minimum":0},{"type":"null"}],"title":"Max Price"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseCaseStoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/use-cases/{slug}":{"get":{"tags":["Use cases"],"summary":"Use Case Detail","operationId":"use_case_detail_v1_use_cases__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/use-cases/{slug}/quote":{"post":{"tags":["Use cases"],"summary":"Quote Use Case","operationId":"quote_use_case_v1_use_cases__slug__quote_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseCaseQuoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseCaseQuoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/use-cases/{slug}/runs":{"post":{"tags":["Use cases"],"summary":"Start Use Case Run","operationId":"start_use_case_run_v1_use_cases__slug__runs_post","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseCaseQuoteRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market-intelligence/de/summary":{"get":{"tags":["Market intelligence"],"summary":"Germany Public Summary","operationId":"germany_public_summary_v1_market_intelligence_de_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/market-intelligence/de/dashboard":{"get":{"tags":["Market intelligence"],"summary":"Germany Dashboard","operationId":"germany_dashboard_v1_market_intelligence_de_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/market-intelligence/de/access":{"get":{"tags":["Market intelligence"],"summary":"Germany Access","description":"Small entitlement preflight for MCP and other server-side clients.","operationId":"germany_access_v1_market_intelligence_de_access_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Germany Access V1 Market Intelligence De Access Get"}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/market-intelligence/de/entities":{"get":{"tags":["Market intelligence"],"summary":"Germany Entities","operationId":"germany_entities_v1_market_intelligence_de_entities_get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"fields","in":"query","required":false,"schema":{"type":"string","maxLength":400,"default":"","title":"Fields"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market-intelligence/de/entities/{target_key}":{"get":{"tags":["Market intelligence"],"summary":"Germany Entity","operationId":"germany_entity_v1_market_intelligence_de_entities__target_key__get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"target_key","in":"path","required":true,"schema":{"type":"string","title":"Target Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market-intelligence/de/universe":{"get":{"tags":["Market intelligence"],"summary":"Search the full Germany discovery universe","description":"The 12,403 discovery rows behind the 68 researched profiles.\n\nEnterprise only, and every response carries its caveats: these are register\nand directory lines, deduplication is unfinished, and nothing here is\napproved. A caller has to be able to tell one from a researched profile.","operationId":"germany_universe_v1_market_intelligence_de_universe_get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Query"}},{"name":"tier","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"","title":"Tier"}},{"name":"sector","in":"query","required":false,"schema":{"type":"string","maxLength":60,"default":"","title":"Sector"}},{"name":"city","in":"query","required":false,"schema":{"type":"string","maxLength":60,"default":"","title":"City"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market-intelligence/de/universe/counts":{"get":{"tags":["Market intelligence"],"summary":"How the Germany discovery universe breaks down","description":"Row, tier and sector totals for the discovery universe.\n\nDeclared before the `{candidate_id}` route below, because FastAPI matches in\ndefinition order: with the wildcard first, \"counts\" is read as an institution\nid and the request fails as a bad candidate rather than returning the totals.","operationId":"germany_universe_counts_v1_market_intelligence_de_universe_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/market-intelligence/de/universe/{candidate_id}":{"get":{"tags":["Market intelligence"],"summary":"One institution from the discovery universe","operationId":"germany_universe_entry_v1_market_intelligence_de_universe__candidate_id__get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"string","title":"Candidate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market-intelligence/de/enrichments":{"post":{"tags":["Market intelligence"],"summary":"Enrich one institution and contribute the sourced result","operationId":"create_germany_enrichment_v1_market_intelligence_de_enrichments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GermanyEnrichmentRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Germany Enrichment V1 Market Intelligence De Enrichments Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/market-intelligence/de/enrichments/{job_id}":{"get":{"tags":["Market intelligence"],"summary":"Poll one Germany institution enrichment","operationId":"germany_enrichment_status_v1_market_intelligence_de_enrichments__job_id__get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Germany Enrichment Status V1 Market Intelligence De Enrichments  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market-intelligence/de/research-playbook":{"get":{"tags":["Market intelligence"],"summary":"How to research a German institution","description":"Read-only instructions an agent follows to fill in what we do not know.\n\nNot documentation for a person. An agent that lists a tier-3 company has a\nname, a city and a register id and nothing else, and without this it\nsearches the open web and returns a summary nobody can check.","operationId":"germany_research_playbook_v1_market_intelligence_de_research_playbook_get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","maxLength":2,"default":"DE","title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market-intelligence/de/structure":{"get":{"tags":["Market intelligence"],"summary":"Aggregates for the German market views","description":"Geography, network capacity and composition, computed on the server.\n\nThe charts do not derive these themselves: the postal-code to federal-state\nlookup is a reviewed table, and capacity numbers must never be pulled out of\nprose by the browser. A wrong bar in front of a client is worse than a\nmissing chart.","operationId":"germany_market_structure_v1_market_intelligence_de_structure_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/market-intelligence/depth":{"get":{"tags":["Market intelligence"],"summary":"How deep each market has been opened","description":"A ladder of depth per country, not a completeness percentage.\n\nFirms are registered every day, so no market is ever finished and a\nshare-of-market-unmapped figure would describe the product as failing on its\nbest day. Depth says how far down a market has been opened and what that\nunlocks, which is comparable between countries and only ever improves.\n\nOpen to any entitled account: this is coverage metadata about our own work,\nnot the market data itself.","operationId":"market_depth_v1_market_intelligence_depth_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/nuda-notion/access":{"get":{"tags":["NUDA Notion"],"summary":"Nuda Notion Access","description":"Entitlement preflight for MCP and other server-side clients.","operationId":"nuda_notion_access_v1_nuda_notion_access_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Nuda Notion Access V1 Nuda Notion Access Get"}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/nuda-notion/call":{"post":{"tags":["NUDA Notion"],"summary":"Nuda Notion Call","operationId":"nuda_notion_call_v1_nuda_notion_call_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NudaToolCall"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Nuda Notion Call V1 Nuda Notion Call Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/solution-architect/intake":{"post":{"tags":["Solution Architect"],"summary":"Intake","operationId":"intake_v1_solution_architect_intake_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Intake V1 Solution Architect Intake Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/solution-architect/inventory":{"get":{"tags":["Solution Architect"],"summary":"Inventory","description":"The exact approved product copy used by Solution Architect.","operationId":"inventory_v1_solution_architect_inventory_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Inventory V1 Solution Architect Inventory Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/solution-architect/blueprint":{"post":{"tags":["Solution Architect"],"summary":"Blueprint","operationId":"blueprint_v1_solution_architect_blueprint_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueprintRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Blueprint V1 Solution Architect Blueprint Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/solution-architect/design":{"post":{"tags":["Solution Architect"],"summary":"Design","operationId":"design_v1_solution_architect_design_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Design V1 Solution Architect Design Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/solution-architect/recommendations":{"post":{"tags":["Solution Architect"],"summary":"Recommendations","operationId":"recommendations_v1_solution_architect_recommendations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Recommendations V1 Solution Architect Recommendations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/solution-architect/compose/stream":{"post":{"tags":["Solution Architect"],"summary":"Compose Stream","description":"The same composition as /compose, narrated while the engine works.\n\nA visitor waits half a minute for an architecture and used to watch a bar\nthat had nothing to do with the work. The engine now reports what it is\nactually doing, and this passes those events through untouched.\n\nIt is a separate route rather than a flag because the failure shape differs:\nonce the first byte is out, an error has to arrive as an event rather than\nas a status code. Entitlement is still checked before anything is sent, so\nan unauthorised caller gets a normal 401 or 403 and never opens a stream.","operationId":"compose_stream_v1_solution_architect_compose_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/solution-architect/compose":{"post":{"tags":["Solution Architect"],"summary":"Compose","operationId":"compose_v1_solution_architect_compose_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Compose V1 Solution Architect Compose Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/solution-architect/expand":{"post":{"tags":["Solution Architect"],"summary":"Expand","operationId":"expand_v1_solution_architect_expand_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpandRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Expand V1 Solution Architect Expand Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/solution-architect/unlock":{"post":{"tags":["Solution Architect"],"summary":"Unlock","operationId":"unlock_v1_solution_architect_unlock_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Unlock V1 Solution Architect Unlock Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/solution-architect/resume/{token}":{"get":{"tags":["Solution Architect"],"summary":"Resume","operationId":"resume_v1_solution_architect_resume__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resume V1 Solution Architect Resume  Token  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/solution-architect/builder-spec/{token}":{"get":{"tags":["Solution Architect"],"summary":"Builder Spec","description":"Create a bounded POC spec from the consented, server-saved solution.\n\nA browser selects only the fixed presentation family. It cannot replace the\nsolution, inventory or acceptance boundary stored behind the signed token.","operationId":"builder_spec_v1_solution_architect_builder_spec__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"template","in":"query","required":true,"schema":{"enum":["whatsapp","web-comparator"],"type":"string","title":"Template"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Builder Spec V1 Solution Architect Builder Spec  Token  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/eu-overview":{"get":{"tags":["Public stats"],"summary":"Eu Overview","operationId":"eu_overview_v1_public_eu_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Eu Overview V1 Public Eu Overview Get"}}}}}}},"/v1/insurance/catalog":{"get":{"tags":["Insurance assistant"],"summary":"What the assistant reads","description":"Every market the assistant can answer for, with the carriers and document classes behind it. Public and unauthenticated on purpose: a reader has to be able to judge the corpus BEFORE trusting an answer out of it, and that judgement cannot be gated behind the sign-up it is supposed to inform.\n\nCounts only documents that are actually retrievable — loaded AND embedded. A document the assistant cannot reach is not coverage.\n\n`document_types` distinguishes what the documents ARE. `terms` is the binding policy wording, `ipid` the EU-standardised two-page summary, `methodology` a distributor-facing underwriting manual. `provenance` separates documents published by the carrier from documents supplied to us under a distribution relationship — different claims, and only the first is one a reader can go and verify.","operationId":"catalog_v1_insurance_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Catalog V1 Insurance Catalog Get"}}}}}}},"/v1/insurance/coverage":{"get":{"tags":["Insurance assistant"],"summary":"Coverage","description":"What the corpus holds, per market. Drives the country picker.","operationId":"coverage_v1_insurance_coverage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Coverage V1 Insurance Coverage Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/insurance/providers":{"get":{"tags":["Insurance assistant"],"summary":"Providers","description":"Providers we hold documents for, so the UI can name them honestly.","operationId":"providers_v1_insurance_providers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"product_line","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Line"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Providers V1 Insurance Providers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/insurance/ask":{"post":{"tags":["Insurance assistant"],"summary":"Ask","operationId":"ask_v1_insurance_ask_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"Billing or corpus storage is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}},"402":{"description":"The user's monthly insurance-assistant quota is exhausted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"quota_exceeded","message":"Monthly insurance-assistant quota reached for this account."}}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/developer/scopes":{"get":{"tags":["Developer control plane"],"summary":"List scopes available for self-service API keys","operationId":"list_scopes_v1_developer_scopes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DeveloperScopeResponse"},"type":"array","title":"Response List Scopes V1 Developer Scopes Get"}}}}},"security":[{"EmableBrowserSession":[]}]}},"/v1/developer/workspaces":{"get":{"tags":["Developer control plane"],"summary":"List workspaces available for API-key boundaries","operationId":"list_workspaces_v1_developer_workspaces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DeveloperWorkspaceResponse"},"type":"array","title":"Response List Workspaces V1 Developer Workspaces Get"}}}}},"security":[{"EmableBrowserSession":[]}]}},"/v1/developer/api-keys":{"get":{"tags":["Developer control plane"],"summary":"List the current user's API keys","operationId":"list_api_keys_v1_developer_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DeveloperApiKeyResponse"},"type":"array","title":"Response List Api Keys V1 Developer Api Keys Get"}}}}},"security":[{"EmableBrowserSession":[]}]},"post":{"tags":["Developer control plane"],"summary":"Create an API key and reveal its secret once","operationId":"create_api_key_v1_developer_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"EmableBrowserSession":[]}]}},"/v1/developer/usage/summary":{"get":{"tags":["Developer control plane"],"summary":"Summarise this month's MCP call usage for the current user's keys","operationId":"get_usage_summary_v1_developer_usage_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperUsageSummaryResponse"}}}}},"security":[{"EmableBrowserSession":[]}]}},"/v1/developer/api-keys/{key_id}":{"delete":{"tags":["Developer control plane"],"summary":"Revoke one of the current user's API keys","operationId":"revoke_api_key_v1_developer_api_keys__key_id__delete","security":[{"EmableBrowserSession":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"tags":["Profile"],"summary":"Get the caller profile","description":"Returns the six public profile fields for the user resolved from the API key. Requires `profile:read`. The caller cannot provide or override a user ID. Example: `curl -H 'Authorization: Bearer em_test_FAKE...' https://api.example.test/v1/me`.","operationId":"me_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The caller profile does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"profile_not_found","message":"The profile was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/workspaces":{"get":{"tags":["Workspaces"],"summary":"List the caller workspaces","description":"Returns active workspaces where the API-key user is a member. Requires `workspaces:read`. A workspace-bound key returns only its bound workspace. This first list is intentionally unpaginated; future list endpoints use opaque cursor pagination as documented in the README.","operationId":"workspaces_v1_workspaces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WorkspaceResponse"},"type":"array","title":"Response Workspaces V1 Workspaces Get"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/company-analyses":{"post":{"tags":["AI jobs"],"summary":"Submit a company analysis","description":"Queues one tenant-owned `company.analyze_url` job. Requires `company:analyze` and an `Idempotency-Key` header. Repeat submissions with the same canonical input return the original job (and do not consume quota). Each new analysis counts against the key's monthly quota; when it is exhausted the request is rejected with `402` before any work starts. Poll the returned URL for completion.","operationId":"submit_company_analysis_v1_company_analyses_post","security":[{"EmableApiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$","description":"Tenant-scoped retry key. Reuse only for the same request body.","examples":["company-analysis-018f7f4e"],"title":"Idempotency-Key"},"description":"Tenant-scoped retry key. Reuse only for the same request body."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyAnalysisRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyAnalysisSubmissionResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"example":{"error":{"code":"not_found","message":"The requested resource was not found."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"example":{"error":{"code":"validation_error","message":"The request is invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"example":{"error":{"code":"internal_error","message":"The request could not be completed."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The key's monthly company-analysis quota is exhausted.","content":{"application/json":{"example":{"error":{"code":"quota_exceeded","message":"Monthly company-analysis quota reached for this API key."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The idempotency key was already used with different input.","content":{"application/json":{"example":{"error":{"code":"idempotency_conflict","message":"The idempotency key was already used for a different request."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/jobs/{job_id}":{"get":{"tags":["AI jobs"],"summary":"Get an AI job","description":"Returns a safe polling view of one job owned by the API-key user. Requires `jobs:read`. Unknown and other-tenant identifiers share the same `404`.","operationId":"get_job_v1_jobs__job_id__get","security":[{"EmableApiKey":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"example":{"error":{"code":"not_found","message":"The requested resource was not found."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"example":{"error":{"code":"validation_error","message":"The request is invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"example":{"error":{"code":"internal_error","message":"The request could not be completed."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/validator/usage":{"post":{"tags":["Validator billing"],"summary":"Report validator study usage and deduct credits","description":"Requires `validator:usage:report`. personas_count is derived server-side from validator_personas — never trust a client-supplied count for billing. Idempotent per study_id.","operationId":"report_validator_usage_v1_validator_usage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidatorUsageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidatorUsageResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The study has no personas to charge for.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"no_personas_found","message":"No personas found for study — nothing to charge."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}},"402":{"description":"The account does not have enough validator credits for this study.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"insufficient_credits","message":"Insufficient validator credits."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/validator/credits/grant":{"post":{"tags":["Validator billing"],"summary":"Grant validator credits to a user (admin)","description":"Requires `admin:credits:grant`. Issued only to trusted internal API keys.","operationId":"grant_credits_v1_validator_credits_grant_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditGrantRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditGrantResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/validator/credits/checkout":{"post":{"tags":["Validator billing"],"summary":"Purchase a validator credit pack","description":"Requires `validator:billing:manage`. Charges the caller's default Stripe payment method immediately via the Invoice API when one exists; otherwise returns a Checkout redirect URL for a new card.","operationId":"create_validator_checkout_v1_validator_credits_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidatorCheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidatorCheckoutResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/validator/credits/portal":{"post":{"tags":["Validator billing"],"summary":"Create a Stripe billing portal session","description":"Requires `validator:billing:manage`.","operationId":"create_portal_session_v1_validator_credits_portal_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidatorPortalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidatorPortalResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/mcp/catalog":{"get":{"tags":["MCP session"],"summary":"List the MCP capabilities and what each call costs you","description":"Lets an agent or a person see what each capability does and what it costs before calling it, rather than discovering the price on the invoice. Prices are quoted for the caller: present a credential and you get your own prices, otherwise the public customer rate.","operationId":"get_catalog_v1_mcp_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogResponse"}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/mcp/session":{"post":{"tags":["MCP session"],"summary":"Exchange an MCP credential for a short-lived session token","description":"Mints a short-lived native access token for an MCP connector. Accepts a developer API key, a personal MCP connection token, or an OAuth bearer; when a scope is named, the credential must carry it, otherwise a 403 is returned, and when the scope is omitted the session simply carries the credential's own scopes. This is how the MCP server turns a caller's credential into something the downstream services accept, without any service having to impersonate a user.","operationId":"create_mcp_session_v1_mcp_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSessionResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/mcp/usage":{"post":{"tags":["MCP session"],"summary":"Charge and record one MCP tool call","description":"Deducts the tool's price from the caller's credit wallet and records the call. The caller is a developer API key (`em_…`), an OAuth bearer (`emat_…`), or a personal MCP connection token. Returns `402` when the wallet cannot cover the call (or the run it is about to start), in which case nothing is charged and no call is recorded. When the caller crosses its included monthly call quota, one operations alert is sent.","operationId":"record_mcp_usage_v1_mcp_usage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpUsageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpUsageResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/mcp/hub/catalog":{"get":{"tags":["MCP Hub"],"summary":"List the connectors this account can put on its MCP Hub","description":"Every connector this account is entitled to, each flagged with whether it is currently selected. A connector the account has no entitlement for is not listed at all — never shown as locked.","operationId":"get_catalog_v1_mcp_hub_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubCatalogResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/mcp/hub/selection":{"put":{"tags":["MCP Hub"],"summary":"Choose which connectors this account's MCP Hub exposes","description":"Writes the selection for every connector or group named in the request. A `group` item is expanded server-side to every LIVE member the account is entitled to — the graph's Connect all / Disconnect all. A slug or group the account is not entitled to, or a group with no connectable members, is refused with a reason, never silently dropped. Takes effect on the hub's next tools/list — no new connection or key needed.","operationId":"put_selection_v1_mcp_hub_selection_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubSelectionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubSelectionResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/mcp/hub/graph":{"get":{"tags":["MCP Hub"],"summary":"The MCP Hub as a network graph: groups, connectors and status","description":"A flat list of nodes (groups and connectors), each carrying parent_id and a status already computed against this account's entitlement and selection — connected, available, partial (a group with some but not all members on), locked (visible, not entitled) or planned (a showcase row with no backing service). Unlike GET catalog, a connector this account cannot use is still listed, as locked, so the graph's shape matches the target topology rather than only what is already unlocked.","operationId":"get_graph_v1_mcp_hub_graph_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubGraphResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/mcp/hub/personal-connectors":{"get":{"tags":["MCP Hub"],"summary":"List the MCP connectors this account registered for itself","operationId":"list_personal_connectors_v1_mcp_hub_personal_connectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalConnectorListResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmablePlatformCredential":[]}]},"post":{"tags":["MCP Hub"],"summary":"Register your own MCP server under the hub","description":"No admin involved — the URL must be https and resolve publicly (no loopback or private address). auth_mode is limited to 'none' or 'passthrough': a self-added connector can never hold a shared service-key secret.","operationId":"create_personal_connector_v1_mcp_hub_personal_connectors_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalConnectorCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalConnector"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/mcp/hub/personal-connectors/{connector_id}":{"patch":{"tags":["MCP Hub"],"summary":"Update or toggle one of your own connectors","operationId":"update_personal_connector_v1_mcp_hub_personal_connectors__connector_id__patch","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Connector Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalConnectorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalConnector"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"example":{"error":{"code":"not_found","message":"The requested resource was not found."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"example":{"error":{"code":"validation_error","message":"The request is invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"example":{"error":{"code":"internal_error","message":"The request could not be completed."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["MCP Hub"],"summary":"Remove one of your own connectors","operationId":"delete_personal_connector_v1_mcp_hub_personal_connectors__connector_id__delete","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"connector_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Delete Personal Connector V1 Mcp Hub Personal Connectors  Connector Id  Delete"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"example":{"error":{"code":"not_found","message":"The requested resource was not found."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"example":{"error":{"code":"validation_error","message":"The request is invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"example":{"error":{"code":"internal_error","message":"The request could not be completed."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/mcp/hub/session":{"post":{"tags":["MCP Hub"],"summary":"Resolve a caller credential into the connectors it may reach on the hub","description":"Called by services/mcp-orchestrator on every request, never by an end user directly. Returns selection INTERSECT entitlement, computed here and trusted by the orchestrator for the request.","operationId":"create_hub_session_v1_mcp_hub_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubSessionResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/mcp/hub/connector-token":{"post":{"tags":["MCP Hub"],"summary":"Mint a short-lived, resource-bound token for one hub-oauth connector","description":"Called by services/mcp-orchestrator on behalf of a caller it has already authenticated at the hub's own gate — never by an end user directly, and never for any user_id other than the one that credential already proved. Re-checks entitlement+selection the same way POST /v1/mcp/hub/session does, then mints a fresh OAuth access token bound to that connector's own resource, without a live consent screen. This is a deliberate, named exception to 'every OAuth token requires a live consent screen' (migrations/0025_mcp_oauth.sql) — see the hub-oauth addendum to docs/architecture/adrs/ADR-005-dual-mcp-rails.md for why: the account's own act of switching this connector on IS the consent for this specific grant.","operationId":"create_connector_token_v1_mcp_hub_connector_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorTokenResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmableApiKey":[]}]}},"/v1/admin/mcp/connectors":{"get":{"tags":["MCP Hub"],"summary":"List every hub connector, including disabled ones","operationId":"list_admin_connectors_v1_admin_mcp_connectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConnectorListResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmablePlatformCredential":[]}]},"post":{"tags":["MCP Hub"],"summary":"Register a new downstream MCP server under the hub","description":"Adding a connector here is the whole cost of a new module — no code change, per DoD #9.","operationId":"create_admin_connector_v1_admin_mcp_connectors_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConnectorCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConnector"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"not_found","message":"The requested resource was not found."}}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"validation_error","message":"The request is invalid."}}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"internal_error","message":"The request could not be completed."}}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/admin/mcp/connectors/{slug}":{"patch":{"tags":["MCP Hub"],"summary":"Update a hub connector","operationId":"update_admin_connector_v1_admin_mcp_connectors__slug__patch","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConnectorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConnector"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"example":{"error":{"code":"not_found","message":"The requested resource was not found."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"example":{"error":{"code":"validation_error","message":"The request is invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"example":{"error":{"code":"internal_error","message":"The request could not be completed."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/mcp/grants":{"get":{"tags":["MCP Hub"],"summary":"List grants for one connector that is not a Store capability","operationId":"list_admin_grants_v1_admin_mcp_grants_get","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"connector_slug","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"title":"Connector Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminGrantListResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"example":{"error":{"code":"not_found","message":"The requested resource was not found."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"example":{"error":{"code":"validation_error","message":"The request is invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"example":{"error":{"code":"internal_error","message":"The request could not be completed."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["MCP Hub"],"summary":"Grant a user or workspace access to a connector that is not a Store capability","operationId":"create_admin_grant_v1_admin_mcp_grants_post","security":[{"EmablePlatformCredential":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminGrantCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminGrant"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"example":{"error":{"code":"not_found","message":"The requested resource was not found."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"example":{"error":{"code":"validation_error","message":"The request is invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"example":{"error":{"code":"internal_error","message":"The request could not be completed."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/mcp/grants/{grant_id}":{"patch":{"tags":["MCP Hub"],"summary":"Suspend, revoke or reactivate a connector grant","operationId":"update_admin_grant_v1_admin_mcp_grants__grant_id__patch","security":[{"EmablePlatformCredential":[]}],"parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Grant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminGrantStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminGrant"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"example":{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key lacks the required scope.","content":{"application/json":{"example":{"error":{"code":"missing_scope","message":"The API key does not allow this operation."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The requested resource does not exist.","content":{"application/json":{"example":{"error":{"code":"not_found","message":"The requested resource was not found."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The request could not be validated.","content":{"application/json":{"example":{"error":{"code":"validation_error","message":"The request is invalid."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The caller exceeded a future rate limit.","content":{"application/json":{"example":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Try again later."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"An unexpected server error occurred.","content":{"application/json":{"example":{"error":{"code":"internal_error","message":"The request could not be completed."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The database is temporarily unavailable.","content":{"application/json":{"example":{"error":{"code":"database_unavailable","message":"The service is temporarily unavailable."}},"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["MCP OAuth"],"summary":"OAuth authorization server metadata (RFC 8414)","operationId":"authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"tags":["MCP OAuth"],"summary":"Protected resource metadata (RFC 9728)","operationId":"protected_resource_metadata__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/mcp-germany-market-intelligence":{"get":{"tags":["MCP OAuth"],"summary":"Germany Market Intelligence protected resource metadata (RFC 9728)","operationId":"germany_protected_resource_metadata__well_known_oauth_protected_resource_mcp_germany_market_intelligence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/mcp-nuda-notion":{"get":{"tags":["MCP OAuth"],"summary":"NUDA Notion protected resource metadata (RFC 9728)","operationId":"nuda_notion_protected_resource_metadata__well_known_oauth_protected_resource_mcp_nuda_notion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/mcp-crm":{"get":{"tags":["MCP OAuth"],"summary":"NUDA Sales CRM protected resource metadata (RFC 9728)","description":"Bez tohohle dokumentu se do CRM konektoru nedá přihlásit účtem.\n\ncrm-mcp do 9/2026 odpovídal na 401 hlavičkou `Bearer realm=\"crm-mcp\"`,\ncož je pro klienta jen „chce to nějaký klíč\" — kde ho vzít, neřekne. Claude\nproto spadl na obecné discovery celého api.emable.ai, vydal si token pro\njiný resource a crm-mcp ho odmítl; člověk viděl „Authorization with NUDA\nCRM failed\" a neměl co opravit. Tenhle dokument říká přesně, kterému\nresource token patří a s jakým scope si o něj říct.","operationId":"crm_protected_resource_metadata__well_known_oauth_protected_resource_mcp_crm_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/mcp-hub":{"get":{"tags":["MCP OAuth"],"summary":"MCP Hub protected resource metadata (RFC 9728)","description":"The hub's OWN identity — distinct from the bare\n/.well-known/oauth-protected-resource above, which advertises Validator's\nstandalone bundle ({base}/mcp), not the hub. A client that discovered the\nhub via services/mcp-orchestrator's 401 (which points here, not at the\nbare document) gets a token correctly scoped to {base}/mcp-hub instead of\nto an unrelated connector's own resource.","operationId":"hub_protected_resource_metadata__well_known_oauth_protected_resource_mcp_hub_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/mcp/connections":{"get":{"tags":["MCP OAuth"],"summary":"List this account's active MCP OAuth connections","description":"Connection state, not entitlement state.\n\nThe response contains client names, resource URLs and activity timestamps,\nnever access or refresh tokens. Key-based external connectors are omitted\nbecause Emable cannot prove whether a third-party client still holds a key.","operationId":"list_account_connections_v1_mcp_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"type":"object","title":"Response List Account Connections V1 Mcp Connections Get"}}}}},"security":[{"EmablePlatformCredential":[]}]}},"/v1/oauth/register":{"post":{"tags":["MCP OAuth"],"summary":"Register an MCP client (RFC 7591)","operationId":"register_client_v1_oauth_register_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/oauth/authorize":{"get":{"tags":["MCP OAuth"],"summary":"Begin the MCP authorization flow","operationId":"authorize_v1_oauth_authorize_get","parameters":[{"name":"client_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Client Id"}},{"name":"redirect_uri","in":"query","required":false,"schema":{"type":"string","default":"","title":"Redirect Uri"}},{"name":"response_type","in":"query","required":false,"schema":{"type":"string","default":"code","title":"Response Type"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"code_challenge","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code Challenge"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string","default":"S256","title":"Code Challenge Method"}},{"name":"resource","in":"query","required":false,"schema":{"type":"string","default":"","title":"Resource"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["MCP OAuth"],"summary":"Complete consent and issue a code","operationId":"authorize_submit_v1_oauth_authorize_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_authorize_submit_v1_oauth_authorize_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/oauth/authorize/google":{"post":{"tags":["MCP OAuth"],"summary":"Continue MCP authorization with the Emable Google login","operationId":"authorize_google_v1_oauth_authorize_google_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_authorize_google_v1_oauth_authorize_google_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/oauth/authorize/google/callback":{"get":{"tags":["MCP OAuth"],"summary":"Complete an MCP authorization after Emable Google login","operationId":"authorize_google_callback_v1_oauth_authorize_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"emable_mcp_oauth_context","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emable Mcp Oauth Context"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/oauth/token":{"post":{"tags":["MCP OAuth"],"summary":"Exchange a code or refresh token","operationId":"token_v1_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_v1_oauth_token_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/oauth/revoke":{"post":{"tags":["MCP OAuth"],"summary":"Revoke an access token","operationId":"revoke_v1_oauth_revoke_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_revoke_v1_oauth_revoke_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/oauth/introspect":{"post":{"tags":["MCP OAuth"],"summary":"Resolve a bearer for the MCP server","description":"Called by the MCP server to turn a bearer into an identity.\n\nProtected by a shared secret rather than left open: an open introspection\nendpoint is an oracle for guessing valid tokens.","operationId":"introspect_v1_oauth_introspect_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_introspect_v1_oauth_introspect_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/outreach/find-contacts":{"post":{"tags":["Outreach CRM"],"summary":"Find Contacts","description":"Return real, verifiable senior contacts at a firm for manual review.","operationId":"find_contacts_v1_outreach_find_contacts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindContactsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindContactsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/stripe/webhook":{"post":{"tags":["Stripe webhook"],"summary":"Stripe webhook (validator-scoped events)","description":"Public endpoint authenticated by Stripe-Signature, not an API key. Handles checkout.session.completed, invoice.paid and invoice.payment_failed for validator_credits / validator_auto_recharge. Other event types are acknowledged and logged as out of Wave 1 scope.","operationId":"stripe_webhook_v1_stripe_webhook_post","parameters":[{"name":"stripe-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdminConnector":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"transport":{"type":"string","enum":["streamable-http","sse"],"title":"Transport"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"auth_mode":{"type":"string","enum":["passthrough","service-key","none","hub-oauth"],"title":"Auth Mode"},"secret_env":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret Env"},"tool_prefix":{"type":"string","title":"Tool Prefix"},"capability_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability Slug"},"timeout_ms":{"type":"integer","title":"Timeout Ms"},"default_enabled":{"type":"boolean","title":"Default Enabled"},"enabled":{"type":"boolean","title":"Enabled"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"group_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Slug"},"display_order":{"type":"integer","title":"Display Order"},"icon_key":{"type":"string","title":"Icon Key"},"availability":{"type":"string","enum":["live","planned"],"title":"Availability"}},"type":"object","required":["slug","name","description","transport","url","auth_mode","secret_env","tool_prefix","capability_slug","timeout_ms","default_enabled","enabled","created_at","group_slug","display_order","icon_key","availability"],"title":"AdminConnector"},"AdminConnectorCreate":{"properties":{"slug":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z0-9][a-z0-9-]*$","title":"Slug"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":500,"title":"Description","default":""},"transport":{"type":"string","enum":["streamable-http","sse"],"title":"Transport"},"url":{"type":"string","maxLength":500,"minLength":1,"title":"Url"},"auth_mode":{"type":"string","enum":["passthrough","service-key","none","hub-oauth"],"title":"Auth Mode"},"secret_env":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Secret Env"},"tool_prefix":{"type":"string","maxLength":32,"minLength":1,"pattern":"^[a-z][a-z0-9_]*$","title":"Tool Prefix"},"capability_slug":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Capability Slug"},"timeout_ms":{"type":"integer","maximum":120000.0,"minimum":1000.0,"title":"Timeout Ms","default":60000},"default_enabled":{"type":"boolean","title":"Default Enabled","default":false},"enabled":{"type":"boolean","title":"Enabled","default":true},"group_slug":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Group Slug"},"display_order":{"type":"integer","title":"Display Order","default":0},"icon_key":{"type":"string","maxLength":32,"title":"Icon Key","default":"connector"}},"additionalProperties":false,"type":"object","required":["slug","name","transport","url","auth_mode","tool_prefix"],"title":"AdminConnectorCreate"},"AdminConnectorListResponse":{"properties":{"connectors":{"items":{"$ref":"#/components/schemas/AdminConnector"},"type":"array","title":"Connectors"}},"type":"object","required":["connectors"],"title":"AdminConnectorListResponse"},"AdminConnectorUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"url":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Url"},"auth_mode":{"anyOf":[{"type":"string","enum":["passthrough","service-key","none","hub-oauth"]},{"type":"null"}],"title":"Auth Mode"},"secret_env":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Secret Env"},"timeout_ms":{"anyOf":[{"type":"integer","maximum":120000.0,"minimum":1000.0},{"type":"null"}],"title":"Timeout Ms"},"default_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Default Enabled"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"group_slug":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Group Slug"},"display_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Order"},"icon_key":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Icon Key"}},"additionalProperties":false,"type":"object","title":"AdminConnectorUpdate","description":"Every field optional: PATCH semantics, only named fields change."},"AdminGrant":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"connector_slug":{"type":"string","title":"Connector Slug"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"status":{"type":"string","enum":["active","suspended","revoked"],"title":"Status"},"granted_by":{"type":"string","title":"Granted By"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["id","connector_slug","user_id","workspace_id","status","granted_by","created_at","expires_at"],"title":"AdminGrant"},"AdminGrantCreate":{"properties":{"connector_slug":{"type":"string","maxLength":64,"minLength":1,"title":"Connector Slug"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"additionalProperties":false,"type":"object","required":["connector_slug"],"title":"AdminGrantCreate"},"AdminGrantListResponse":{"properties":{"grants":{"items":{"$ref":"#/components/schemas/AdminGrant"},"type":"array","title":"Grants"}},"type":"object","required":["grants"],"title":"AdminGrantListResponse"},"AdminGrantStatusUpdate":{"properties":{"status":{"type":"string","enum":["active","suspended","revoked"],"title":"Status"}},"additionalProperties":false,"type":"object","required":["status"],"title":"AdminGrantStatusUpdate"},"ArrangementEdge":{"properties":{"from":{"type":"string","maxLength":120,"title":"From"},"to":{"type":"string","maxLength":120,"title":"To"},"flow":{"type":"string","maxLength":120,"title":"Flow"}},"additionalProperties":false,"type":"object","required":["from","to","flow"],"title":"ArrangementEdge"},"AskRequest":{"properties":{"question":{"type":"string","maxLength":1500,"minLength":3,"title":"Question"},"country":{"type":"string","maxLength":2,"minLength":2,"title":"Country"},"product_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Line"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"History"}},"type":"object","required":["question","country"],"title":"AskRequest"},"AskResponse":{"properties":{"answer":{"type":"string","title":"Answer"},"country":{"type":"string","title":"Country"},"product_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Line"},"query_type":{"type":"string","title":"Query Type"},"providers_consulted":{"items":{"type":"string"},"type":"array","title":"Providers Consulted"},"providers_without_answer":{"items":{"type":"string"},"type":"array","title":"Providers Without Answer"},"sources":{"items":{"$ref":"#/components/schemas/SourceOut"},"type":"array","title":"Sources"},"trust_state":{"type":"string","title":"Trust State"},"confidence":{"type":"number","title":"Confidence"},"coverage_level":{"type":"string","title":"Coverage Level"},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note"}},"type":"object","required":["answer","country","product_line","query_type","providers_consulted","providers_without_answer","sources","trust_state","confidence","coverage_level"],"title":"AskResponse"},"AuthLogoutRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"AuthLogoutRequest"},"AuthOAuthExchangeRequest":{"properties":{"code":{"type":"string","maxLength":256,"minLength":32,"title":"Code"}},"additionalProperties":false,"type":"object","required":["code"],"title":"AuthOAuthExchangeRequest"},"AuthRecoveryRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"AuthRecoveryRequest"},"AuthResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["token","password"],"title":"AuthResetPasswordRequest"},"AuthSessionResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","const":"bearer","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"},"expires_at":{"type":"integer","title":"Expires At"},"refresh_token":{"type":"string","title":"Refresh Token"},"user":{"$ref":"#/components/schemas/AuthUserResponse"}},"type":"object","required":["access_token","expires_in","expires_at","refresh_token","user"],"title":"AuthSessionResponse"},"AuthSignUpRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["email","password"],"title":"AuthSignUpRequest"},"AuthSignUpResponse":{"properties":{"user":{"$ref":"#/components/schemas/AuthUserResponse"},"session":{"$ref":"#/components/schemas/AuthSessionResponse"}},"type":"object","required":["user","session"],"title":"AuthSignUpResponse"},"AuthTokenRequest":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"type":"object","title":"AuthTokenRequest"},"AuthUpdateUserRequest":{"properties":{"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"additionalProperties":false,"type":"object","required":["password"],"title":"AuthUpdateUserRequest"},"AuthUserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"role":{"type":"string","title":"Role","default":"authenticated"},"user_metadata":{"additionalProperties":true,"type":"object","title":"User Metadata"},"app_metadata":{"additionalProperties":true,"type":"object","title":"App Metadata"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"email_confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Confirmed At"},"last_sign_in_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sign In At"}},"type":"object","required":["id"],"title":"AuthUserResponse"},"BlueprintRequest":{"properties":{"slots":{"additionalProperties":{"type":"string"},"type":"object","title":"Slots"},"answers":{"additionalProperties":{"type":"string"},"type":"object","title":"Answers"},"locale":{"type":"string","enum":["cs","en","de"],"title":"Locale","default":"en"}},"additionalProperties":false,"type":"object","title":"BlueprintRequest"},"Body_authorize_google_v1_oauth_authorize_google_post":{"properties":{"client_id":{"type":"string","title":"Client Id","default":""},"redirect_uri":{"type":"string","title":"Redirect Uri","default":""},"scope":{"type":"string","title":"Scope","default":""},"state":{"type":"string","title":"State","default":""},"code_challenge":{"type":"string","title":"Code Challenge","default":""},"code_challenge_method":{"type":"string","title":"Code Challenge Method","default":"S256"},"resource":{"type":"string","title":"Resource","default":""}},"type":"object","title":"Body_authorize_google_v1_oauth_authorize_google_post"},"Body_authorize_submit_v1_oauth_authorize_post":{"properties":{"email":{"type":"string","title":"Email","default":""},"password":{"type":"string","title":"Password","default":""},"client_id":{"type":"string","title":"Client Id","default":""},"redirect_uri":{"type":"string","title":"Redirect Uri","default":""},"scope":{"type":"string","title":"Scope","default":""},"state":{"type":"string","title":"State","default":""},"code_challenge":{"type":"string","title":"Code Challenge","default":""},"code_challenge_method":{"type":"string","title":"Code Challenge Method","default":"S256"},"resource":{"type":"string","title":"Resource","default":""}},"type":"object","title":"Body_authorize_submit_v1_oauth_authorize_post"},"Body_introspect_v1_oauth_introspect_post":{"properties":{"token":{"type":"string","title":"Token","default":""}},"type":"object","title":"Body_introspect_v1_oauth_introspect_post"},"Body_revoke_v1_oauth_revoke_post":{"properties":{"token":{"type":"string","title":"Token","default":""}},"type":"object","title":"Body_revoke_v1_oauth_revoke_post"},"Body_token_v1_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type","default":""},"code":{"type":"string","title":"Code","default":""},"redirect_uri":{"type":"string","title":"Redirect Uri","default":""},"client_id":{"type":"string","title":"Client Id","default":""},"code_verifier":{"type":"string","title":"Code Verifier","default":""},"refresh_token":{"type":"string","title":"Refresh Token","default":""},"resource":{"type":"string","title":"Resource","default":""}},"type":"object","title":"Body_token_v1_oauth_token_post"},"CapabilityDetailResponse":{"properties":{"capability":{"$ref":"#/components/schemas/CapabilityManifest"},"statistics":{"$ref":"#/components/schemas/PublicCapabilityStatistics"}},"type":"object","required":["capability","statistics"],"title":"CapabilityDetailResponse"},"CapabilityGroup":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"kind":{"type":"string","enum":["open","enterprise"],"title":"Kind"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"items":{"items":{"$ref":"#/components/schemas/CapabilityManifest"},"type":"array","title":"Items"}},"type":"object","required":["key","label","kind","items"],"title":"CapabilityGroup","description":"One heading in the signed-in catalogue: the open connectors everybody gets,\nor one enterprise tenant's private ones."},"CapabilityManifest":{"properties":{"slug":{"type":"string","title":"Slug"},"semantic_version":{"type":"string","pattern":"^\\d+\\.\\d+\\.\\d+$","title":"Semantic Version","default":"1.0.0"},"name":{"type":"string","title":"Name"},"outcome":{"type":"string","title":"Outcome"},"description":{"type":"string","title":"Description"},"provider":{"type":"string","title":"Provider"},"status":{"type":"string","enum":["live","pilot","internal"],"title":"Status"},"exposure":{"type":"string","enum":["public","gated","private"],"title":"Exposure"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"data_class":{"type":"string","enum":["aggregate","named","derived"],"title":"Data Class"},"access":{"type":"string","enum":["read","write"],"title":"Access"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"pricing":{"$ref":"#/components/schemas/PricingPolicy"},"trial":{"$ref":"#/components/schemas/TrialPolicy"},"input_schema":{"additionalProperties":true,"type":"object","title":"Input Schema"},"output_schema":{"additionalProperties":true,"type":"object","title":"Output Schema"},"tools":{"items":{"$ref":"#/components/schemas/CapabilityTool"},"type":"array","title":"Tools"},"connectors":{"items":{"type":"string"},"type":"array","title":"Connectors"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources"},"limitations":{"items":{"type":"string"},"type":"array","title":"Limitations"},"dependencies":{"items":{"type":"string"},"type":"array","title":"Dependencies","default":[]},"evidence_freshness":{"type":"string","title":"Evidence Freshness","default":"Returned with each result when the source provides it."},"supported_execution_surfaces":{"items":{"type":"string","enum":["specialist_web","rest","cli","mcp"]},"type":"array","title":"Supported Execution Surfaces","default":["specialist_web"]},"documentation_url":{"type":"string","title":"Documentation Url"},"support_url":{"type":"string","title":"Support Url"},"changelog_url":{"type":"string","title":"Changelog Url"},"try_url":{"type":"string","title":"Try Url"},"runnable":{"type":"boolean","title":"Runnable","default":false}},"type":"object","required":["slug","name","outcome","description","provider","status","exposure","countries","data_class","access","permissions","pricing","trial","input_schema","output_schema","tools","connectors","sources","limitations","documentation_url","support_url","changelog_url","try_url"],"title":"CapabilityManifest"},"CapabilityRunCreateRequest":{"properties":{"mode":{"type":"string","enum":["trial","live"],"title":"Mode","default":"trial"},"connector":{"type":"string","maxLength":80,"minLength":1,"title":"Connector","default":"web"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"input":{"additionalProperties":true,"type":"object","title":"Input"}},"additionalProperties":false,"type":"object","required":["input"],"title":"CapabilityRunCreateRequest"},"CapabilityRunListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CapabilityRunResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"CapabilityRunListResponse"},"CapabilityRunResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"run_kind":{"type":"string","enum":["capability","use_case"],"title":"Run Kind","default":"capability"},"capability_slug":{"type":"string","title":"Capability Slug"},"use_case_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case Slug"},"manifest_version":{"type":"string","title":"Manifest Version","default":"1.0.0"},"provider":{"type":"string","title":"Provider"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"mode":{"type":"string","enum":["trial","live"],"title":"Mode"},"connector":{"type":"string","title":"Connector"},"status":{"type":"string","enum":["queued","running","succeeded","failed","refused","awaiting_approval"],"title":"Status"},"safe_input_summary":{"additionalProperties":true,"type":"object","title":"Safe Input Summary"},"result_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Reference"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"sources":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Sources"},"quoted_credits":{"type":"integer","title":"Quoted Credits","default":0},"reserved_credits":{"type":"integer","title":"Reserved Credits","default":0},"charged_credits":{"type":"integer","title":"Charged Credits"},"completed_step_charges":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Completed Step Charges"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"idempotent_replay":{"type":"boolean","title":"Idempotent Replay","default":false}},"type":"object","required":["id","capability_slug","provider","workspace_id","mode","connector","status","safe_input_summary","result_reference","result","sources","charged_credits","created_at","updated_at","completed_at"],"title":"CapabilityRunResponse"},"CapabilityStoreFilters":{"properties":{"outcomes":{"items":{"type":"string"},"type":"array","title":"Outcomes"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"providers":{"items":{"type":"string"},"type":"array","title":"Providers"},"statuses":{"items":{"type":"string","enum":["live","pilot","internal"]},"type":"array","title":"Statuses"},"access":{"items":{"type":"string","enum":["read","write"]},"type":"array","title":"Access"},"pricing_models":{"items":{"type":"string"},"type":"array","title":"Pricing Models"}},"type":"object","required":["outcomes","countries","providers","statuses","access","pricing_models"],"title":"CapabilityStoreFilters"},"CapabilityStoreResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CapabilityManifest"},"type":"array","title":"Items"},"filters":{"$ref":"#/components/schemas/CapabilityStoreFilters"}},"type":"object","required":["items","filters"],"title":"CapabilityStoreResponse"},"CapabilityTool":{"properties":{"name":{"type":"string","title":"Name"},"title":{"type":"string","title":"Title"},"access":{"type":"string","enum":["read","write"],"title":"Access"},"summary":{"type":"string","title":"Summary"},"returns":{"type":"string","title":"Returns"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema"},"agent_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Description"},"human_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Human Summary"},"use_when":{"items":{"type":"string"},"type":"array","title":"Use When","default":[]},"do_not_use_when":{"items":{"type":"string"},"type":"array","title":"Do Not Use When","default":[]},"examples":{"items":{"$ref":"#/components/schemas/ToolExample"},"type":"array","title":"Examples","default":[]},"errors":{"items":{"$ref":"#/components/schemas/ToolError"},"type":"array","title":"Errors","default":[]},"latency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latency"},"related":{"items":{"type":"string"},"type":"array","title":"Related","default":[]}},"type":"object","required":["name","title","access","summary","returns"],"title":"CapabilityTool"},"CatalogEntry":{"properties":{"name":{"type":"string","title":"Name"},"title":{"type":"string","title":"Title"},"access":{"type":"string","enum":["read","write"],"title":"Access"},"summary":{"type":"string","title":"Summary"},"returns":{"type":"string","title":"Returns"},"data_class":{"type":"string","title":"Data Class"},"provider":{"type":"string","title":"Provider"},"price_credits":{"type":"integer","title":"Price Credits"},"reserves_credits":{"type":"integer","title":"Reserves Credits","default":0},"free_for_you":{"type":"boolean","title":"Free For You","default":false}},"type":"object","required":["name","title","access","summary","returns","data_class","provider","price_credits"],"title":"CatalogEntry"},"CatalogResponse":{"properties":{"currency":{"type":"string","const":"credits","title":"Currency","default":"credits"},"wallet":{"type":"string","title":"Wallet","default":"profiles.validator_credits"},"your_tier":{"type":"string","title":"Your Tier","default":"customer"},"note":{"type":"string","title":"Note","default":"Prices are per call, quoted for you, and charged before the capability runs. A call the wallet cannot cover is refused with 402 and is not charged. run_validation is charged when the run completes, so it reserves the cost of the whole run up front instead."},"capabilities":{"items":{"$ref":"#/components/schemas/CatalogEntry"},"type":"array","title":"Capabilities"}},"type":"object","required":["capabilities"],"title":"CatalogResponse","description":"What a call costs, in the same credits the wallet holds.\n\nPrices are quoted for the caller who asked. The same capability can be free\nfor one caller and paid for another — what it costs depends on what data\nleaves and who is asking, not on the capability alone."},"CompanyAnalysisRequest":{"properties":{"company_url":{"type":"string","maxLength":2048,"minLength":1,"format":"uri","title":"Company Url","description":"Absolute HTTP or HTTPS URL for the company website.","examples":["https://example.com"]}},"additionalProperties":false,"type":"object","required":["company_url"],"title":"CompanyAnalysisRequest"},"CompanyAnalysisResult":{"properties":{"company_name":{"type":"string","maxLength":300,"minLength":1,"title":"Company Name"},"target_audience":{"type":"string","maxLength":10000,"minLength":1,"title":"Target Audience"},"products_services":{"items":{"type":"string"},"type":"array","maxItems":100,"title":"Products Services"},"market":{"type":"string","maxLength":10000,"title":"Market","default":""}},"type":"object","required":["company_name","target_audience"],"title":"CompanyAnalysisResult","examples":[{"company_name":"Example Labs","market":"B2B financial software in Europe","products_services":["Forecasting"],"target_audience":"European finance teams"}]},"CompanyAnalysisSubmissionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"type":"string","const":"company.analyze_url","title":"Type"},"status":{"type":"string","enum":["queued","running","succeeded","failed","cancelled"],"title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"polling_url":{"type":"string","title":"Polling Url"}},"type":"object","required":["id","type","status","created_at","polling_url"],"title":"CompanyAnalysisSubmissionResponse"},"ComposeRequest":{"properties":{"slots":{"additionalProperties":{"type":"string"},"type":"object","title":"Slots"},"answers":{"additionalProperties":{"type":"string"},"type":"object","title":"Answers"},"raw_input":{"type":"string","maxLength":6000,"title":"Raw Input","default":""},"locale":{"type":"string","enum":["cs","en","de"],"title":"Locale","default":"en"},"company_name":{"type":"string","maxLength":240,"title":"Company Name","default":""},"selection":{"anyOf":[{"$ref":"#/components/schemas/ComposeSelection"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"ComposeRequest","description":"The wired arrangement. Ungated, like /blueprint, and the same shape."},"ComposeSelection":{"properties":{"recommendation_id":{"type":"string","maxLength":120,"minLength":1,"title":"Recommendation Id"},"source_pattern_id":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Source Pattern Id"},"product_ids":{"items":{"type":"string"},"type":"array","maxItems":20,"minItems":1,"title":"Product Ids"},"use_case_ids":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Use Case Ids"},"kb_version":{"type":"string","maxLength":120,"minLength":1,"title":"Kb Version"}},"additionalProperties":false,"type":"object","required":["recommendation_id","product_ids","kb_version"],"title":"ComposeSelection"},"ConnectorSummary":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"transport":{"type":"string","enum":["streamable-http","sse"],"title":"Transport"},"auth_mode":{"type":"string","enum":["passthrough","service-key","none","hub-oauth"],"title":"Auth Mode"},"tool_prefix":{"type":"string","title":"Tool Prefix"},"capability_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability Slug"},"default_enabled":{"type":"boolean","title":"Default Enabled"},"selected":{"type":"boolean","title":"Selected"}},"type":"object","required":["slug","name","description","transport","auth_mode","tool_prefix","capability_slug","default_enabled","selected"],"title":"ConnectorSummary","description":"One connector as this account sees it: what it does, and whether the\naccount currently has it switched on. Only ever includes connectors this\naccount is entitled to — one this account cannot have is not listed as\n\"off\", it is simply absent, the same posture as a private capability\nreturning 404 rather than a locked card."},"ConnectorTokenRequest":{"properties":{"connector_slug":{"type":"string","maxLength":64,"minLength":1,"title":"Connector Slug"}},"additionalProperties":false,"type":"object","required":["connector_slug"],"title":"ConnectorTokenRequest","description":"Body of POST /v1/mcp/hub/connector-token — called by\nservices/mcp-orchestrator on behalf of an already-authenticated caller,\nnever by an end user directly."},"ConnectorTokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["access_token","expires_in"],"title":"ConnectorTokenResponse"},"CreditGrantRequest":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"credits":{"type":"integer","maximum":1000000.0,"exclusiveMinimum":0.0,"title":"Credits"}},"additionalProperties":false,"type":"object","required":["user_id","credits"],"title":"CreditGrantRequest"},"CreditGrantResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"user_id":{"type":"string","format":"uuid","title":"User Id"},"credits_granted":{"type":"integer","title":"Credits Granted"},"validator_credits":{"type":"integer","title":"Validator Credits"}},"type":"object","required":["user_id","credits_granted","validator_credits"],"title":"CreditGrantResponse"},"DesignRequest":{"properties":{"situation":{"type":"string","maxLength":6000,"minLength":15,"title":"Situation"},"locale":{"type":"string","enum":["cs","en","de"],"title":"Locale","default":"en"}},"additionalProperties":false,"type":"object","required":["situation"],"title":"DesignRequest"},"DeveloperApiKeyCreateRequest":{"properties":{"label":{"type":"string","maxLength":80,"minLength":1,"title":"Label"},"environment":{"type":"string","enum":["test","live"],"title":"Environment","default":"test"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"scopes":{"items":{"type":"string"},"type":"array","maxItems":32,"minItems":1,"title":"Scopes"},"expires_in_days":{"type":"integer","enum":[30,90,365],"title":"Expires In Days","default":90}},"additionalProperties":false,"type":"object","required":["label","scopes"],"title":"DeveloperApiKeyCreateRequest"},"DeveloperApiKeyCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"label":{"type":"string","title":"Label"},"key_prefix":{"type":"string","title":"Key Prefix"},"environment":{"type":"string","enum":["test","live"],"title":"Environment"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"secret":{"type":"string","title":"Secret","description":"The API-key secret. It is returned once and is never stored."}},"type":"object","required":["id","workspace_id","label","key_prefix","environment","scopes","created_at","expires_at","revoked_at","last_used_at","secret"],"title":"DeveloperApiKeyCreatedResponse"},"DeveloperApiKeyResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"label":{"type":"string","title":"Label"},"key_prefix":{"type":"string","title":"Key Prefix"},"environment":{"type":"string","enum":["test","live"],"title":"Environment"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","workspace_id","label","key_prefix","environment","scopes","created_at","expires_at","revoked_at","last_used_at"],"title":"DeveloperApiKeyResponse"},"DeveloperScopeResponse":{"properties":{"name":{"type":"string","title":"Name"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"}},"type":"object","required":["name","title","description"],"title":"DeveloperScopeResponse"},"DeveloperUsageConnection":{"properties":{"mcp_token_id":{"type":"string","format":"uuid","title":"Mcp Token Id"},"calls":{"type":"integer","title":"Calls"}},"type":"object","required":["mcp_token_id","calls"],"title":"DeveloperUsageConnection","description":"Calls made through one personal MCP connection token — the live\n\"Connect to Claude\" rail, which carries no API key."},"DeveloperUsageKey":{"properties":{"key_id":{"type":"string","format":"uuid","title":"Key Id"},"calls":{"type":"integer","title":"Calls"}},"type":"object","required":["key_id","calls"],"title":"DeveloperUsageKey"},"DeveloperUsageSummaryResponse":{"properties":{"included_quota":{"type":"integer","title":"Included Quota"},"total_calls":{"type":"integer","title":"Total Calls"},"over_quota":{"type":"boolean","title":"Over Quota"},"keys":{"items":{"$ref":"#/components/schemas/DeveloperUsageKey"},"type":"array","title":"Keys"},"connections":{"items":{"$ref":"#/components/schemas/DeveloperUsageConnection"},"type":"array","title":"Connections","default":[]},"tools":{"items":{"$ref":"#/components/schemas/DeveloperUsageTool"},"type":"array","title":"Tools"}},"type":"object","required":["included_quota","total_calls","over_quota","keys","tools"],"title":"DeveloperUsageSummaryResponse"},"DeveloperUsageTool":{"properties":{"tool":{"type":"string","title":"Tool"},"calls":{"type":"integer","title":"Calls"}},"type":"object","required":["tool","calls"],"title":"DeveloperUsageTool"},"DeveloperWorkspaceResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"product":{"type":"string","title":"Product"},"member_role":{"type":"string","title":"Member Role"}},"type":"object","required":["id","name","product","member_role"],"title":"DeveloperWorkspaceResponse"},"DocDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"kind":{"type":"string","title":"Kind"},"url":{"type":"string","title":"Url"},"summary":{"type":"string","title":"Summary"},"related_slugs":{"items":{"type":"string"},"type":"array","title":"Related Slugs"}},"type":"object","required":["slug","title","kind","url","summary","related_slugs"],"title":"DocDetail"},"DocSummary":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"kind":{"type":"string","title":"Kind"},"url":{"type":"string","title":"Url"},"summary":{"type":"string","title":"Summary"}},"type":"object","required":["slug","title","kind","url","summary"],"title":"DocSummary"},"ErrorDetail":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine-readable error code."},"message":{"type":"string","title":"Message","description":"Safe human-readable error message."}},"type":"object","required":["code","message"],"title":"ErrorDetail"},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"}},"type":"object","required":["error"],"title":"ErrorResponse","examples":[{"error":{"code":"invalid_api_key","message":"The API key is missing or invalid."}}]},"ExpandRequest":{"properties":{"run_id":{"type":"string","format":"uuid","title":"Run Id"},"slots":{"additionalProperties":{"type":"string"},"type":"object","title":"Slots"},"answers":{"additionalProperties":{"type":"string"},"type":"object","title":"Answers"},"raw_input":{"type":"string","maxLength":6000,"title":"Raw Input","default":""},"locale":{"type":"string","enum":["cs","en","de"],"title":"Locale","default":"en"},"solution":{"additionalProperties":true,"type":"object","title":"Solution"},"product_ids":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Product Ids"},"edges":{"items":{"$ref":"#/components/schemas/ArrangementEdge"},"type":"array","maxItems":60,"title":"Edges"},"full_name":{"type":"string","maxLength":200,"minLength":2,"title":"Full Name"},"company_name":{"type":"string","maxLength":240,"minLength":2,"title":"Company Name"},"email":{"type":"string","maxLength":320,"minLength":3,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email"},"phone":{"type":"string","maxLength":80,"minLength":5,"title":"Phone"},"consent":{"type":"boolean","title":"Consent"}},"additionalProperties":false,"type":"object","required":["run_id","solution","full_name","company_name","email","phone","consent"],"title":"ExpandRequest","description":"The integration half, which sits behind a contact.\n\nThe composed solution travels in rather than being generated again, so the\nsecond pass describes the diagram the caller is holding. It doubles as the\nartefact stored against the lead, which is why it is required and not\noptional: a lead with no solution attached is a row nobody can act on."},"FindContactsRequest":{"properties":{"company":{"type":"string","maxLength":200,"minLength":1,"title":"Company"},"country":{"type":"string","maxLength":80,"minLength":1,"title":"Country"},"max_contacts":{"type":"integer","maximum":12.0,"minimum":1.0,"title":"Max Contacts","default":6}},"type":"object","required":["company","country"],"title":"FindContactsRequest"},"FindContactsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/OutreachContactCandidate"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"FindContactsResponse"},"GermanyEnrichmentRequest":{"properties":{"candidate_id":{"type":"string","maxLength":120,"minLength":3,"pattern":"^DE-[A-Za-z0-9-]+$","title":"Candidate Id"},"focus":{"items":{"type":"string","pattern":"^(identity|permissions|financials|distribution|technology|decision_makers|recent_changes)$"},"type":"array","maxItems":7,"minItems":1,"title":"Focus"},"max_people":{"type":"integer","maximum":8.0,"minimum":1.0,"title":"Max People","default":5}},"additionalProperties":false,"type":"object","required":["candidate_id"],"title":"GermanyEnrichmentRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"service":{"type":"string","title":"Service"},"version":{"type":"string","title":"Version"},"status":{"type":"string","const":"ok","title":"Status","default":"ok"}},"type":"object","required":["service","version"],"title":"HealthResponse","examples":[{"service":"emable-api","status":"ok","version":"0.1.0"}]},"HubCatalogResponse":{"properties":{"hub_url":{"type":"string","title":"Hub Url"},"connectors":{"items":{"$ref":"#/components/schemas/ConnectorSummary"},"type":"array","title":"Connectors"}},"type":"object","required":["hub_url","connectors"],"title":"HubCatalogResponse"},"HubGraphNode":{"properties":{"id":{"type":"string","title":"Id"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"type":{"type":"string","enum":["group","mcp"],"title":"Type"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"icon_key":{"type":"string","title":"Icon Key"},"status":{"type":"string","enum":["connected","available","partial","locked","planned"],"title":"Status"},"connectable":{"type":"boolean","title":"Connectable"},"tool_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Prefix"},"connected_children":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connected Children"},"connectable_children":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connectable Children"},"total_children":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Children"}},"type":"object","required":["id","parent_id","type","name","description","icon_key","status","connectable"],"title":"HubGraphNode","description":"One node in the flat parentId tree GET /v1/mcp/hub/graph returns.\nEdges are derived from parent_id by the caller, never authored\nseparately — see src/lib/mcpHubGraphLayout.ts's own edgesFromTree."},"HubGraphResponse":{"properties":{"hub":{"$ref":"#/components/schemas/HubGraphSummary"},"nodes":{"items":{"$ref":"#/components/schemas/HubGraphNode"},"type":"array","title":"Nodes"}},"type":"object","required":["hub","nodes"],"title":"HubGraphResponse"},"HubGraphSummary":{"properties":{"id":{"type":"string","const":"hub","title":"Id","default":"hub"},"name":{"type":"string","const":"MCP Hub","title":"Name","default":"MCP Hub"},"url":{"type":"string","title":"Url"},"connected_count":{"type":"integer","title":"Connected Count"},"total_count":{"type":"integer","title":"Total Count"}},"type":"object","required":["url","connected_count","total_count"],"title":"HubGraphSummary"},"HubSelectionRejection":{"properties":{"slug":{"type":"string","title":"Slug"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["slug","reason"],"title":"HubSelectionRejection"},"HubSelectionRequest":{"properties":{"selections":{"items":{"$ref":"#/components/schemas/HubSelectionUpdate"},"type":"array","maxItems":100,"minItems":1,"title":"Selections"}},"additionalProperties":false,"type":"object","required":["selections"],"title":"HubSelectionRequest"},"HubSelectionResponse":{"properties":{"connectors":{"items":{"$ref":"#/components/schemas/ConnectorSummary"},"type":"array","title":"Connectors"},"rejected":{"items":{"$ref":"#/components/schemas/HubSelectionRejection"},"type":"array","title":"Rejected"}},"type":"object","required":["connectors","rejected"],"title":"HubSelectionResponse"},"HubSelectionUpdate":{"properties":{"slug":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Slug"},"group":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Group"},"enabled":{"type":"boolean","title":"Enabled"}},"additionalProperties":false,"type":"object","required":["enabled"],"title":"HubSelectionUpdate","description":"Exactly one of slug or group. `group` is the graph's \"Connect all\" /\n\"Disconnect all\" — the server expands it to every LIVE child itself\n(McpHubService.apply_group_selection), so this shape never needs to\nchange when a group grows a new member."},"HubSessionConnector":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"tool_prefix":{"type":"string","title":"Tool Prefix"},"transport":{"type":"string","enum":["streamable-http","sse"],"title":"Transport"},"url":{"type":"string","title":"Url"},"auth_mode":{"type":"string","enum":["passthrough","service-key","none","hub-oauth"],"title":"Auth Mode"},"secret_env":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret Env"},"timeout_ms":{"type":"integer","title":"Timeout Ms"}},"type":"object","required":["slug","name","tool_prefix","transport","url","auth_mode","secret_env","timeout_ms"],"title":"HubSessionConnector"},"HubSessionRequest":{"properties":{},"additionalProperties":false,"type":"object","title":"HubSessionRequest","description":"Empty today — unlike /v1/mcp/session, the hub never accepts a named\nscope. Connectors are the entitlement surface here, not scopes."},"HubSessionResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"connectors":{"items":{"$ref":"#/components/schemas/HubSessionConnector"},"type":"array","title":"Connectors"}},"type":"object","required":["user_id","workspace_id","scopes","connectors"],"title":"HubSessionResponse"},"IntakeRequest":{"properties":{"raw_input":{"type":"string","maxLength":6000,"minLength":3,"title":"Raw Input"},"locale":{"type":"string","enum":["cs","en","de"],"title":"Locale","default":"en"},"slots":{"additionalProperties":{"type":"string"},"type":"object","title":"Slots"},"answers":{"additionalProperties":{"type":"string"},"type":"object","title":"Answers"},"adaptive":{"type":"boolean","title":"Adaptive","default":false}},"additionalProperties":false,"type":"object","required":["raw_input"],"title":"IntakeRequest"},"JobError":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"}},"type":"object","required":["code","message"],"title":"JobError"},"JobResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"type":"string","title":"Type"},"status":{"type":"string","enum":["queued","running","succeeded","failed","cancelled"],"title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"result":{"anyOf":[{"$ref":"#/components/schemas/CompanyAnalysisResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/JobError"},{"type":"null"}]}},"type":"object","required":["id","type","status","created_at","updated_at","completed_at","result","error"],"title":"JobResponse","examples":[{"completed_at":"2026-07-17T13:00:05Z","created_at":"2026-07-17T13:00:00Z","id":"018f7f4e-7c2a-7f0c-8000-111111111111","result":{"company_name":"Example Labs","market":"B2B financial software in Europe","products_services":["Forecasting"],"target_audience":"European finance teams"},"status":"succeeded","type":"company.analyze_url","updated_at":"2026-07-17T13:00:05Z"}]},"LegacyMcpUsage":{"properties":{"calls":{"type":"integer","title":"Calls"},"charged_credits":{"type":"integer","title":"Charged Credits"}},"type":"object","required":["calls","charged_credits"],"title":"LegacyMcpUsage"},"McpSessionRequest":{"properties":{"scope":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Scope"},"resource":{"anyOf":[{"type":"string","maxLength":2000,"minLength":1},{"type":"null"}],"title":"Resource"}},"additionalProperties":false,"type":"object","title":"McpSessionRequest"},"McpSessionResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"session_jwt":{"type":"string","title":"Session Jwt"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["user_id","workspace_id","scopes","session_jwt","expires_in"],"title":"McpSessionResponse"},"McpUsageRequest":{"properties":{"tool":{"type":"string","maxLength":100,"minLength":1,"title":"Tool"},"reserve_units":{"type":"integer","maximum":10000.0,"minimum":0.0,"title":"Reserve Units","default":0}},"additionalProperties":false,"type":"object","required":["tool"],"title":"McpUsageRequest"},"McpUsageResponse":{"properties":{"recorded":{"type":"boolean","title":"Recorded"},"calls_this_month":{"type":"integer","title":"Calls This Month"},"included_quota":{"type":"integer","title":"Included Quota"},"over_quota":{"type":"boolean","title":"Over Quota"},"credits_charged":{"type":"integer","title":"Credits Charged","default":0},"credits_remaining":{"type":"integer","title":"Credits Remaining","default":0}},"type":"object","required":["recorded","calls_this_month","included_quota","over_quota"],"title":"McpUsageResponse"},"MessageResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"MessageResponse"},"MyCapabilitiesResponse":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/CapabilityGroup"},"type":"array","title":"Groups"},"total":{"type":"integer","title":"Total"},"enterprise_workspaces":{"items":{"type":"string"},"type":"array","title":"Enterprise Workspaces"}},"type":"object","required":["groups","total","enterprise_workspaces"],"title":"MyCapabilitiesResponse","description":"What this account may actually see, open and private together.\n\nDeliberately a separate response from the public store: the store is\nunauthenticated and must never learn that a private capability exists, while\nthis one is the whole point of being an enterprise customer."},"NudaToolCall":{"properties":{"tool":{"type":"string","maxLength":64,"minLength":3,"title":"Tool"},"arguments":{"additionalProperties":true,"type":"object","title":"Arguments"}},"type":"object","required":["tool"],"title":"NudaToolCall"},"OutreachContactCandidate":{"properties":{"company":{"type":"string","title":"Company"},"country":{"type":"string","title":"Country"},"contact_name":{"type":"string","title":"Contact Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"source":{"type":"string","title":"Source"},"found_method":{"type":"string","title":"Found Method"},"confidence":{"type":"string","title":"Confidence"},"linkedin_search_url":{"type":"string","title":"Linkedin Search Url"}},"type":"object","required":["company","country","contact_name","title","linkedin_url","email","phone","source","found_method","confidence","linkedin_search_url"],"title":"OutreachContactCandidate"},"PersonalConnector":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"transport":{"type":"string","enum":["streamable-http","sse"],"title":"Transport"},"url":{"type":"string","title":"Url"},"auth_mode":{"type":"string","enum":["none","passthrough"],"title":"Auth Mode"},"enabled":{"type":"boolean","title":"Enabled"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","slug","name","description","transport","url","auth_mode","enabled","created_at"],"title":"PersonalConnector"},"PersonalConnectorCreate":{"properties":{"slug":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z0-9][a-z0-9-]*$","title":"Slug"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":500,"title":"Description","default":""},"transport":{"type":"string","enum":["streamable-http","sse"],"title":"Transport"},"url":{"type":"string","maxLength":500,"minLength":1,"title":"Url"},"auth_mode":{"type":"string","enum":["none","passthrough"],"title":"Auth Mode","default":"none"}},"additionalProperties":false,"type":"object","required":["slug","name","transport","url"],"title":"PersonalConnectorCreate"},"PersonalConnectorListResponse":{"properties":{"connectors":{"items":{"$ref":"#/components/schemas/PersonalConnector"},"type":"array","title":"Connectors"}},"type":"object","required":["connectors"],"title":"PersonalConnectorListResponse"},"PersonalConnectorUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"url":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Url"},"transport":{"anyOf":[{"type":"string","enum":["streamable-http","sse"]},{"type":"null"}],"title":"Transport"},"auth_mode":{"anyOf":[{"type":"string","enum":["none","passthrough"]},{"type":"null"}],"title":"Auth Mode"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"additionalProperties":false,"type":"object","title":"PersonalConnectorUpdate"},"PricingPolicy":{"properties":{"model":{"type":"string","enum":["per_run","per_query","included","contract"],"title":"Model"},"charging_unit":{"type":"string","title":"Charging Unit"},"currency":{"type":"string","const":"credits","title":"Currency","default":"credits"},"live_credits":{"type":"integer","minimum":0.0,"title":"Live Credits"},"trial_credits":{"type":"integer","minimum":0.0,"title":"Trial Credits","default":0},"hard_cost_limit_credits":{"type":"integer","minimum":0.0,"title":"Hard Cost Limit Credits"},"provider_cost_credits":{"type":"integer","minimum":0.0,"title":"Provider Cost Credits","default":0}},"type":"object","required":["model","charging_unit","live_credits","hard_cost_limit_credits"],"title":"PricingPolicy"},"ProfileResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"app_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Role"}},"type":"object","required":["id","email","first_name","last_name","company","app_role"],"title":"ProfileResponse","examples":[{"app_role":"user","company":"Example Labs","email":"developer@example.test","first_name":"Ada","id":"11111111-1111-4111-8111-111111111111","last_name":"Example"}]},"ProviderCapabilityBreakdown":{"properties":{"capability_slug":{"type":"string","title":"Capability Slug"},"runs":{"type":"integer","title":"Runs"},"successful_runs":{"type":"integer","title":"Successful Runs"},"owed_credits":{"type":"integer","title":"Owed Credits"}},"type":"object","required":["capability_slug","runs","successful_runs","owed_credits"],"title":"ProviderCapabilityBreakdown"},"ProviderOverviewItem":{"properties":{"provider":{"type":"string","title":"Provider"},"runs":{"type":"integer","title":"Runs"},"successful_runs":{"type":"integer","title":"Successful Runs"},"active_accounts":{"anyOf":[{"type":"integer"},{"type":"string","const":"<5"}],"title":"Active Accounts"},"owed_credits":{"type":"integer","title":"Owed Credits"},"legacy_mcp_calls":{"type":"integer","title":"Legacy Mcp Calls"},"legacy_mcp_owed_credits":{"type":"integer","title":"Legacy Mcp Owed Credits"},"settlement_status":{"type":"string","title":"Settlement Status"},"by_capability":{"items":{"$ref":"#/components/schemas/ProviderCapabilityBreakdown"},"type":"array","title":"By Capability"},"trend":{"items":{"$ref":"#/components/schemas/ProviderTrendPoint"},"type":"array","title":"Trend"}},"type":"object","required":["provider","runs","successful_runs","active_accounts","owed_credits","legacy_mcp_calls","legacy_mcp_owed_credits","settlement_status","by_capability","trend"],"title":"ProviderOverviewItem"},"ProviderOverviewResponse":{"properties":{"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"providers":{"items":{"$ref":"#/components/schemas/ProviderOverviewItem"},"type":"array","title":"Providers"}},"type":"object","required":["period_start","period_end","providers"],"title":"ProviderOverviewResponse"},"ProviderTrendPoint":{"properties":{"date":{"type":"string","title":"Date"},"runs":{"type":"integer","title":"Runs"},"successful_runs":{"type":"integer","title":"Successful Runs"},"owed_credits":{"type":"integer","title":"Owed Credits"}},"type":"object","required":["date","runs","successful_runs","owed_credits"],"title":"ProviderTrendPoint"},"PublicCapabilityStatistics":{"properties":{"verified_runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Verified Runs"},"unique_accounts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unique Accounts"},"success_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Success Rate"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"PublicCapabilityStatistics"},"QuoteLineItem":{"properties":{"step_id":{"type":"string","title":"Step Id"},"title":{"type":"string","title":"Title"},"capability_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability Slug"},"maximum_credits":{"type":"integer","title":"Maximum Credits"}},"type":"object","required":["step_id","title","capability_slug","maximum_credits"],"title":"QuoteLineItem"},"ReadyResponse":{"properties":{"status":{"type":"string","const":"ready","title":"Status","default":"ready"}},"type":"object","title":"ReadyResponse","examples":[{"status":"ready"}]},"RecommendationsRequest":{"properties":{"company_type":{"type":"string","enum":["distributor","bank","insurer","fintech","dealer_retail","other"],"title":"Company Type"},"company_name":{"type":"string","maxLength":240,"title":"Company Name","default":""},"market":{"type":"string","enum":["cz","sk","pl","de","at","hu","gr","other"],"title":"Market"},"company_type_other":{"type":"string","maxLength":200,"title":"Company Type Other","default":""},"market_other":{"type":"string","maxLength":200,"title":"Market Other","default":""},"pain_point":{"type":"string","maxLength":1000,"minLength":3,"title":"Pain Point"},"current_infrastructure":{"type":"string","maxLength":1000,"title":"Current Infrastructure","default":""},"goal":{"type":"string","maxLength":1000,"title":"Goal","default":""},"locale":{"type":"string","enum":["cs","en","de"],"title":"Locale","default":"en"},"answers":{"additionalProperties":{"type":"string"},"type":"object","title":"Answers"}},"additionalProperties":false,"type":"object","required":["company_type","market","pain_point"],"title":"RecommendationsRequest"},"SavedConfigurationCreateRequest":{"properties":{"run_kind":{"type":"string","enum":["capability","use_case"],"title":"Run Kind","default":"capability"},"slug":{"type":"string","maxLength":100,"minLength":1,"title":"Slug"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"mode":{"type":"string","enum":["trial","live"],"title":"Mode","default":"live"},"connector":{"type":"string","maxLength":80,"minLength":1,"title":"Connector","default":"web"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"input":{"additionalProperties":true,"type":"object","title":"Input"}},"additionalProperties":false,"type":"object","required":["slug","name","input"],"title":"SavedConfigurationCreateRequest"},"SavedConfigurationListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SavedConfigurationResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"SavedConfigurationListResponse"},"SavedConfigurationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"run_kind":{"type":"string","enum":["capability","use_case"],"title":"Run Kind"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"mode":{"type":"string","enum":["trial","live"],"title":"Mode"},"connector":{"type":"string","title":"Connector"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"input":{"additionalProperties":true,"type":"object","title":"Input"},"safe_input_summary":{"additionalProperties":true,"type":"object","title":"Safe Input Summary"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","run_kind","slug","name","mode","connector","workspace_id","input","safe_input_summary","created_at","updated_at"],"title":"SavedConfigurationResponse"},"SourceOut":{"properties":{"title":{"type":"string","title":"Title"},"section_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section Ref"},"insurer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Insurer Name"},"doc_type":{"type":"string","title":"Doc Type"},"layer":{"type":"string","title":"Layer"},"source_kind":{"type":"string","title":"Source Kind"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["title","doc_type","layer","source_kind"],"title":"SourceOut"},"ToolError":{"properties":{"code":{"type":"string","title":"Code"},"meaning":{"type":"string","title":"Meaning"},"caller_action":{"type":"string","title":"Caller Action"}},"type":"object","required":["code","meaning","caller_action"],"title":"ToolError"},"ToolExample":{"properties":{"title":{"type":"string","title":"Title"},"input":{"additionalProperties":true,"type":"object","title":"Input"},"output_excerpt":{"type":"string","title":"Output Excerpt"}},"type":"object","required":["title","input","output_excerpt"],"title":"ToolExample"},"TrialBalance":{"properties":{"capability_slug":{"type":"string","title":"Capability Slug"},"included":{"type":"integer","title":"Included"},"used":{"type":"integer","title":"Used"},"remaining":{"type":"integer","title":"Remaining"}},"type":"object","required":["capability_slug","included","used","remaining"],"title":"TrialBalance"},"TrialPolicy":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"max_runs":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Max Runs"},"requires_login":{"type":"boolean","title":"Requires Login","default":true},"requires_card":{"type":"boolean","title":"Requires Card","default":false},"sandbox_only":{"type":"boolean","title":"Sandbox Only","default":false},"restrictions":{"items":{"type":"string"},"type":"array","title":"Restrictions","default":[]}},"type":"object","required":["enabled","max_runs"],"title":"TrialPolicy"},"UnlockRequest":{"properties":{"run_id":{"type":"string","format":"uuid","title":"Run Id"},"situation":{"type":"string","maxLength":6000,"minLength":15,"title":"Situation"},"answers":{"additionalProperties":{"type":"string"},"type":"object","title":"Answers"},"locale":{"type":"string","enum":["cs","en","de"],"title":"Locale","default":"en"},"full_name":{"type":"string","maxLength":200,"minLength":2,"title":"Full Name"},"company_name":{"type":"string","maxLength":240,"minLength":2,"title":"Company Name"},"email":{"type":"string","maxLength":320,"minLength":3,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email"},"phone":{"type":"string","maxLength":80,"minLength":5,"title":"Phone"},"consent":{"type":"boolean","title":"Consent"}},"additionalProperties":false,"type":"object","required":["run_id","situation","full_name","company_name","email","phone","consent"],"title":"UnlockRequest"},"UsageBreakdown":{"properties":{"key":{"type":"string","title":"Key"},"runs":{"type":"integer","title":"Runs"},"successful_runs":{"type":"integer","title":"Successful Runs"},"charged_credits":{"type":"integer","title":"Charged Credits"}},"type":"object","required":["key","runs","successful_runs","charged_credits"],"title":"UsageBreakdown"},"UsageSummaryResponse":{"properties":{"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"runs":{"type":"integer","title":"Runs"},"successful_runs":{"type":"integer","title":"Successful Runs"},"success_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Success Rate"},"charged_credits":{"type":"integer","title":"Charged Credits"},"legacy_mcp_usage":{"$ref":"#/components/schemas/LegacyMcpUsage"},"trial_balance":{"items":{"$ref":"#/components/schemas/TrialBalance"},"type":"array","title":"Trial Balance"},"by_capability":{"items":{"$ref":"#/components/schemas/UsageBreakdown"},"type":"array","title":"By Capability"},"by_connector":{"items":{"$ref":"#/components/schemas/UsageBreakdown"},"type":"array","title":"By Connector"},"trend":{"items":{"$ref":"#/components/schemas/UsageTrendPoint"},"type":"array","title":"Trend"}},"type":"object","required":["period_start","period_end","runs","successful_runs","success_rate","charged_credits","legacy_mcp_usage","trial_balance","by_capability","by_connector","trend"],"title":"UsageSummaryResponse"},"UsageTrendPoint":{"properties":{"date":{"type":"string","title":"Date"},"runs":{"type":"integer","title":"Runs"},"successful_runs":{"type":"integer","title":"Successful Runs"},"charged_credits":{"type":"integer","title":"Charged Credits"}},"type":"object","required":["date","runs","successful_runs","charged_credits"],"title":"UsageTrendPoint"},"UseCaseManifest":{"properties":{"slug":{"type":"string","title":"Slug"},"semantic_version":{"type":"string","pattern":"^\\d+\\.\\d+\\.\\d+$","title":"Semantic Version"},"name":{"type":"string","title":"Name"},"outcome":{"type":"string","title":"Outcome"},"description":{"type":"string","title":"Description"},"category":{"type":"string","title":"Category"},"buyer_roles":{"items":{"type":"string"},"type":"array","title":"Buyer Roles"},"provider":{"type":"string","title":"Provider"},"owner":{"type":"string","title":"Owner"},"status":{"type":"string","enum":["available","pilot","validation_required"],"title":"Status"},"access":{"type":"string","enum":["public","gated"],"title":"Access"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"capability_slugs":{"items":{"type":"string"},"type":"array","title":"Capability Slugs"},"dependencies":{"items":{"type":"string"},"type":"array","title":"Dependencies"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"pricing":{"$ref":"#/components/schemas/UseCasePricing"},"input_schema":{"additionalProperties":true,"type":"object","title":"Input Schema"},"deliverables":{"items":{"type":"string"},"type":"array","title":"Deliverables"},"steps":{"items":{"$ref":"#/components/schemas/UseCaseStep"},"type":"array","title":"Steps"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources"},"evidence_freshness":{"type":"string","title":"Evidence Freshness"},"limitations":{"items":{"type":"string"},"type":"array","title":"Limitations"},"supported_execution_surfaces":{"items":{"type":"string","enum":["web","rest","cli","mcp"]},"type":"array","title":"Supported Execution Surfaces"},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url"},"documentation_url":{"type":"string","title":"Documentation Url","default":"/developers"},"validation_gate":{"$ref":"#/components/schemas/UseCaseValidationGate","default":{"required":false,"accepted_evidence":[],"satisfied":false}},"runnable":{"type":"boolean","title":"Runnable","default":false},"featured":{"type":"boolean","title":"Featured","default":false}},"type":"object","required":["slug","semantic_version","name","outcome","description","category","buyer_roles","provider","owner","status","access","countries","capability_slugs","dependencies","permissions","pricing","input_schema","deliverables","steps","sources","evidence_freshness","limitations","supported_execution_surfaces"],"title":"UseCaseManifest"},"UseCasePricing":{"properties":{"currency":{"type":"string","const":"credits","title":"Currency","default":"credits"},"charging_unit":{"type":"string","title":"Charging Unit"},"maximum_run_credits":{"type":"integer","minimum":0.0,"title":"Maximum Run Credits"},"trial_credits":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Trial Credits"}},"type":"object","required":["charging_unit","maximum_run_credits"],"title":"UseCasePricing"},"UseCaseQuoteRequest":{"properties":{"input":{"additionalProperties":true,"type":"object","title":"Input"}},"additionalProperties":false,"type":"object","required":["input"],"title":"UseCaseQuoteRequest"},"UseCaseQuoteResponse":{"properties":{"quote_id":{"type":"string","format":"uuid","title":"Quote Id"},"use_case_slug":{"type":"string","title":"Use Case Slug"},"manifest_version":{"type":"string","title":"Manifest Version"},"currency":{"type":"string","const":"credits","title":"Currency","default":"credits"},"maximum_credits":{"type":"integer","title":"Maximum Credits"},"reserved_credits":{"type":"integer","title":"Reserved Credits"},"line_items":{"items":{"$ref":"#/components/schemas/QuoteLineItem"},"type":"array","title":"Line Items"},"approval_required":{"type":"boolean","title":"Approval Required"},"execution_enabled":{"type":"boolean","title":"Execution Enabled"},"execution_blocker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Blocker"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["quote_id","use_case_slug","manifest_version","maximum_credits","reserved_credits","line_items","approval_required","execution_enabled","execution_blocker","expires_at"],"title":"UseCaseQuoteResponse"},"UseCaseStep":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"capability_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability Slug"},"maximum_credits":{"type":"integer","minimum":0.0,"title":"Maximum Credits","default":0},"human_approval":{"type":"boolean","title":"Human Approval","default":false}},"type":"object","required":["id","title"],"title":"UseCaseStep"},"UseCaseStoreFilters":{"properties":{"outcomes":{"items":{"type":"string"},"type":"array","title":"Outcomes"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"providers":{"items":{"type":"string"},"type":"array","title":"Providers"},"statuses":{"items":{"type":"string","enum":["available","pilot","validation_required"]},"type":"array","title":"Statuses"},"access":{"items":{"type":"string","enum":["public","gated"]},"type":"array","title":"Access"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"maximum_prices":{"items":{"type":"integer"},"type":"array","title":"Maximum Prices"}},"type":"object","required":["outcomes","countries","providers","statuses","access","categories","maximum_prices"],"title":"UseCaseStoreFilters"},"UseCaseStoreResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UseCaseManifest"},"type":"array","title":"Items"},"filters":{"$ref":"#/components/schemas/UseCaseStoreFilters"}},"type":"object","required":["items","filters"],"title":"UseCaseStoreResponse"},"UseCaseValidationGate":{"properties":{"required":{"type":"boolean","title":"Required","default":false},"accepted_evidence":{"items":{"type":"string"},"type":"array","title":"Accepted Evidence","default":[]},"satisfied":{"type":"boolean","title":"Satisfied","default":false},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"UseCaseValidationGate"},"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"},"ValidatorCheckoutRequest":{"properties":{"pack":{"type":"string","enum":["starter","growth","scale","pro"],"title":"Pack","default":"starter"}},"additionalProperties":false,"type":"object","title":"ValidatorCheckoutRequest"},"ValidatorCheckoutResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"pack":{"type":"string","enum":["starter","growth","scale","pro"],"title":"Pack"},"credits_added":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Added"},"invoice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Id"},"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"}},"type":"object","required":["success","pack"],"title":"ValidatorCheckoutResponse","description":"Exactly one of (invoice_id, checkout_url) is set.\n\nAn existing default payment method pays immediately via the Invoice API\n(credits_added is set); a new card falls back to a Stripe Checkout\nredirect (checkout_url is set, credits land later via webhook) — mirrors\ncreate-validator-checkout's dual-path behavior."},"ValidatorPortalRequest":{"properties":{"return_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Url"}},"additionalProperties":false,"type":"object","title":"ValidatorPortalRequest"},"ValidatorPortalResponse":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"ValidatorPortalResponse"},"ValidatorUsageRequest":{"properties":{"study_id":{"type":"string","format":"uuid","title":"Study Id"}},"additionalProperties":false,"type":"object","required":["study_id"],"title":"ValidatorUsageRequest"},"ValidatorUsageResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"credits_deducted":{"type":"integer","title":"Credits Deducted"},"idempotent":{"type":"boolean","title":"Idempotent","default":false}},"type":"object","required":["credits_deducted"],"title":"ValidatorUsageResponse"},"WebhookAckResponse":{"properties":{"received":{"type":"boolean","title":"Received","default":true}},"type":"object","title":"WebhookAckResponse"},"WorkspaceResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"product":{"type":"string","title":"Product"},"is_personal":{"type":"boolean","title":"Is Personal"},"member_role":{"type":"string","title":"Member Role"}},"type":"object","required":["id","name","slug","product","is_personal","member_role"],"title":"WorkspaceResponse","examples":[{"id":"aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa","is_personal":false,"member_role":"owner","name":"Example Workspace","product":"validator","slug":"example-workspace"}]}},"securitySchemes":{"EmableAccessToken":{"type":"http","scheme":"bearer"},"EmablePlatformCredential":{"type":"http","scheme":"bearer"},"HTTPBearer":{"type":"http","scheme":"bearer"},"EmableBrowserSession":{"type":"http","description":"Native Emable browser access token. This is not a developer API key.","scheme":"bearer"},"EmableApiKey":{"type":"http","description":"Send `Authorization: Bearer em_test_...` or `Authorization: Bearer em_live_...`. Keys are shown once when created.","scheme":"bearer","bearerFormat":"Emable API key"}}}}