{"openapi":"3.1.0","info":{"title":"Faro API","description":"Faro: the tools your AI agent can't run on its own","version":"0.1.0"},"paths":{"/auth/request-invite":{"post":{"tags":["auth"],"summary":"Request Invite","description":"Submit an email to request an invite to Faro.","operationId":"request_invite_auth_request_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteRequestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"Create a new user account. Optionally accepts an invite_token query parameter.","operationId":"register_auth_register_post","parameters":[{"name":"invite_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__auth__TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Authenticate with email and password. Returns a JWT access token.","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__auth__TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"Get the current authenticated user's profile.","operationId":"get_me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["auth"],"summary":"Update Me","description":"Update the current user's profile (full_name only).","operationId":"update_me_auth_me_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Request a password reset email.","operationId":"forgot_password_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Reset password using a token from the reset email.","operationId":"reset_password_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"Change password for the currently authenticated user.","operationId":"change_password_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/agent-signup":{"post":{"tags":["auth"],"summary":"Agent Signup","description":"Create an account from an email alone and return a usable API key.\n\nNo password is set: the account is reachable by its API key (the agent) and\nby a magic-login link (its human). It starts unverified, which pins it to\nthe reduced UNVERIFIED tier with access only to self-hosted tools; clicking\nthe verification email unlocks the free data tier.","operationId":"agent_signup_auth_agent_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSignupRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSignupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify-email":{"post":{"tags":["auth"],"summary":"Verify Email","description":"Redeem an emailed verification token, marking the account verified.","operationId":"verify_email_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","description":"Send a fresh verification email. Always returns the same generic message.","operationId":"resend_verification_auth_resend_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login-link":{"post":{"tags":["auth"],"summary":"Login Link","description":"Mint a one-time magic-login link for the calling account.\n\nAuthenticated by JWT or API key, so an agent can hand its human a fresh\ndashboard link in chat. The resulting session is passwordless and cannot\nmint API keys (see routers/tokens.py), so a leaked key gains nothing here.","operationId":"login_link_auth_login_link_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginLinkResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/magic-login":{"post":{"tags":["auth"],"summary":"Magic Login","description":"Redeem a one-time magic-login token for a dashboard session (JWT).","operationId":"magic_login_auth_magic_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__auth__TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/credits/balance":{"get":{"tags":["credits"],"summary":"Get Balance","description":"Get the current user's credit balance, lifetime stats, and auto-recharge config.","operationId":"get_balance_credits_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditBalanceResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/credits/purchase":{"post":{"tags":["credits"],"summary":"Purchase Credits","description":"Start a credit top-up: create a Paddle transaction for the overlay checkout.","operationId":"purchase_credits_credits_purchase_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/credits/auto-recharge/checkout":{"post":{"tags":["credits"],"summary":"Auto Recharge Checkout","description":"Create the $0/mo subscription checkout that captures a payment method.","operationId":"auto_recharge_checkout_credits_auto_recharge_checkout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRechargeCheckoutResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/credits/auto-recharge":{"put":{"tags":["credits"],"summary":"Configure Auto Recharge","description":"Enable/disable auto-recharge and set the threshold + top-up amount.","operationId":"configure_auto_recharge_credits_auto_recharge_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRechargeConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRechargeConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/credits/low-balance-alert":{"put":{"tags":["credits"],"summary":"Set Low Balance Alert","description":"Set the low-balance email alert threshold (USD); 0 turns it off.\n\nIndependent of auto-recharge. Resetting the threshold re-arms the warning so\nthe next drawdown can trigger it under the new setting.","operationId":"set_low_balance_alert_credits_low_balance_alert_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LowBalanceAlertRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LowBalanceAlertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/credits/purchases":{"get":{"tags":["credits"],"summary":"Get Purchases","description":"List the current user's credit purchase history.","operationId":"get_purchases_credits_purchases_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CreditPurchaseResponse"},"type":"array","title":"Response Get Purchases Credits Purchases Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/tokens/":{"get":{"tags":["tokens"],"summary":"List Tokens","description":"List all API tokens for the current user.","operationId":"list_tokens_tokens__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/schemas__tokens__TokenResponse"},"type":"array","title":"Response List Tokens Tokens  Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["tokens"],"summary":"Create Token","description":"Create a new API token with optional spending limits and namespace restrictions.\n\nRequires a JWT (email + password session). A leaked API key must not be\nable to mint additional keys; revocation would lose meaning otherwise.\n\nAlso requires a real password on the account. Agent-created accounts are\npasswordless and reachable via magic-login link; without this check a\nleaked API key could mint a login link, open a session, and escalate to\nminting more keys. Set a password (via the reset flow) to enable this.","operationId":"create_token_tokens__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTokenRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tokens/{token_id}":{"put":{"tags":["tokens"],"summary":"Update Token","description":"Update an API token's name, limits, or namespace restrictions.\n\nJWT-only: a token shouldn't be able to lift its own spend caps or\nwhitelist additional namespaces.","operationId":"update_token_tokens__token_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTokenRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/schemas__tokens__TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tokens"],"summary":"Revoke Token","description":"Permanently revoke an API token.","operationId":"revoke_token_tokens__token_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/listings/register":{"post":{"tags":["listings"],"summary":"Register Publisher","description":"Register as a publisher to sell tools on Faro.","operationId":"register_publisher_listings_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublisherRegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublisherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/listings/me":{"get":{"tags":["listings"],"summary":"Get Publisher Profile","description":"Get the current user's publisher profile.","operationId":"get_publisher_profile_listings_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublisherResponse"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["listings"],"summary":"Update Publisher Profile","description":"Update publisher profile (display name, bio, website, etc).","operationId":"update_publisher_profile_listings_me_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublisherUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublisherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/listings/me/logo":{"post":{"tags":["listings"],"summary":"Upload Publisher Logo","description":"Upload a publisher logo image (PNG, JPG, WebP, or SVG, max 2 MB).","operationId":"upload_publisher_logo_listings_me_logo_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_publisher_logo_listings_me_logo_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublisherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/listings/earnings":{"get":{"tags":["listings"],"summary":"Get Earnings","description":"Get the publisher's earnings summary (total earned, pending, invocation count).","operationId":"get_earnings_listings_earnings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EarningsSummaryResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/listings/invocations":{"get":{"tags":["listings"],"summary":"Get Publisher Invocations","description":"List recent invocations across all publisher's namespaces.\n\nWarnings that the publisher can't act on (billing-side events about the\ncaller's balance) are stripped from the response. Dismissed warnings are\nalso hidden — caller can re-surface by clearing warning_acknowledged_at.","operationId":"get_publisher_invocations_listings_invocations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Get Publisher Invocations Listings Invocations Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/listings/invocations/{invocation_id}/acknowledge":{"patch":{"tags":["listings"],"summary":"Acknowledge Invocation Warning","description":"Mark an invocation's warning as acknowledged so it drops out of the\npublisher's warnings panel. Only the publisher who owns the namespace\ncan acknowledge.","operationId":"acknowledge_invocation_warning_listings_invocations__invocation_id__acknowledge_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invocation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invocation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/listings/sales-summary":{"get":{"tags":["listings"],"summary":"Get Sales Summary","description":"Return private aggregate sales stats only (no buyer/tool breakdown).","operationId":"get_sales_summary_listings_sales_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(current_month|last_month|month)$","default":"current_month","title":"Period"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Month"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"group_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(namespace)$"},{"type":"null"}],"title":"Group By"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/search":{"get":{"tags":["tools"],"summary":"Search Tools","description":"Hybrid search using Postgres FTS + pgvector embeddings, fused via RRF.\n\nReturns an envelope: {items, returned, limit, query} plus a `note` telling\nthe caller how to get more when the page is full. Each item includes:\n  - `score`: the original semantic similarity (0..1) when the tool matched\n             the embedding retriever; null otherwise.\n  - `match_type`: one of \"keyword\" (lexical only), \"semantic\" (embedding\n                  only), or \"hybrid\" (both retrievers picked it up).\n\nThe result list is ordered by the fused RRF score, which the client uses\ndirectly. The lexical/semantic distinction is exposed only so the UI can\ngroup results into intuitive sections.","operationId":"search_tools_tools_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Hybrid lexical + semantic search query","title":"Q"},"description":"Hybrid lexical + semantic search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by namespace category","title":"Category"},"description":"Filter by namespace category"},{"name":"sid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Anonymous client session id (for analytics)","title":"Sid"},"description":"Anonymous client session id (for analytics)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/popular":{"get":{"tags":["tools"],"summary":"Popular Tools","description":"Top public tools ranked by invocation count.\n\nFalls back to most-recently-created tools when there are no invocations yet\n(e.g. fresh deploy) so the section is never empty.","operationId":"popular_tools_tools_popular_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":12,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/":{"get":{"tags":["tools"],"summary":"List Tools","description":"List public, active tools from active namespaces.\n\nReturns a paginated envelope: {items, total, returned, limit, offset,\nhas_more, next_offset}. When has_more is true, a `note` explains how to\nfetch the next page. There are hundreds of tools, so page until has_more\nis false, or use GET /tools/search?q=... to find tools by intent.","operationId":"list_tools_tools__get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/{namespace_slug}/{tool_name}":{"get":{"tags":["tools"],"summary":"Get Tool","description":"Get a single public tool by namespace/name.","operationId":"get_tool_tools__namespace_slug___tool_name__get","parameters":[{"name":"namespace_slug","in":"path","required":true,"schema":{"type":"string","title":"Namespace Slug"}},{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connections/check-domain":{"get":{"tags":["connections"],"summary":"Check Domain Availability","description":"Check whether the domain of an MCP URL is already claimed by another publisher.\n\nSame publisher may reuse a domain freely; only cross-publisher conflicts are blocked.\nUsers without a publisher profile yet (first-time flow) see global conflicts only.","operationId":"check_domain_availability_connections_check_domain_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"Full MCP URL whose domain to check","title":"Url"},"description":"Full MCP URL whose domain to check"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connections/":{"get":{"tags":["connections"],"summary":"List Connections","description":"List all MCP connections owned by the current publisher.","operationId":"list_connections_connections__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MCPConnectionListItem"},"type":"array","title":"Response List Connections Connections  Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["connections"],"summary":"Create Connection","description":"Create a new connection (MCP or REST).","operationId":"create_connection_connections__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPConnectionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPConnectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/connections/{connection_id}":{"get":{"tags":["connections"],"summary":"Get Connection","description":"Get an MCP connection.","operationId":"get_connection_connections__connection_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPConnectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["connections"],"summary":"Update Connection","description":"Update an MCP connection's label and/or upstream URL.\n\n`mcp_url` is only writable on MCP connections; `base_url` only on REST. Setting\nthe wrong one for the connection type is silently ignored.","operationId":"update_connection_connections__connection_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPConnectionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPConnectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["connections"],"summary":"Delete Connection","description":"Delete an MCP connection. Blocked if any namespace tools reference it.","operationId":"delete_connection_connections__connection_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connections/{connection_id}/scan":{"post":{"tags":["connections"],"summary":"Scan Connection","description":"Scan the MCP server and optionally import/update tools in a target namespace.\n\nIf namespace_id is provided, tools are upserted into that namespace.\nIf omitted, only returns the discovered tool list (no import).","operationId":"scan_connection_connections__connection_id__scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Target namespace to import tools into","title":"Namespace Id"},"description":"Target namespace to import tools into"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connections/{connection_id}/credentials":{"put":{"tags":["connections"],"summary":"Set Connection Credentials","description":"Store encrypted API key for the MCP connection.","operationId":"set_connection_credentials_connections__connection_id__credentials_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionCredentialSet"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connections/import-openapi":{"post":{"tags":["connections"],"summary":"Import Openapi","description":"Import an OpenAPI 3.x spec.\n\nCreates a REST `MCPConnection` (`connection_type='rest'`), a `Namespace`,\nand one `MCPTool` (`tool_type='rest'`) per JSON operation in the spec.\nAuth credentials are not stored here — the publisher sets those separately\nvia PUT /connections/{id}/credentials.","operationId":"import_openapi_connections_import_openapi_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAPIImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAPIImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/partners/":{"post":{"tags":["partners"],"summary":"Request Partner Access","description":"Request to become a Faro partner. Creates a pending application for admin review.","operationId":"request_partner_access_partners__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerRequestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/partners/me":{"get":{"tags":["partners"],"summary":"Get Partner Dashboard","description":"Get the current user's partner dashboard with balance, user count, and usage stats.","operationId":"get_partner_dashboard_partners_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerDashboard"}}}}},"security":[{"HTTPBearer":[]}]}},"/partners/me/token/regenerate":{"post":{"tags":["partners"],"summary":"Regenerate Partner Token","description":"Regenerate the partner API token. Previous token is immediately invalidated.","operationId":"regenerate_partner_token_partners_me_token_regenerate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/partners/users":{"post":{"tags":["partners"],"summary":"Create Partner User","description":"Provision a user with an optional credit budget. Budget credits are moved from the partner's pool.","operationId":"create_partner_user_partners_users_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePartnerUserBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["partners"],"summary":"List Partner Users","description":"List all users provisioned by this partner.","operationId":"list_partner_users_partners_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PartnerUserResponse"},"title":"Response List Partner Users Partners Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/partners/users/{external_id}":{"get":{"tags":["partners"],"summary":"Get Partner User","description":"Get a specific partner user by external ID.","operationId":"get_partner_user_partners_users__external_id__get","parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/partners/users/{external_id}/budget":{"patch":{"tags":["partners"],"summary":"Adjust Partner User Budget","description":"Set a partner user's credit budget. Credits move between the partner pool and user balance.","operationId":"adjust_partner_user_budget_partners_users__external_id__budget_patch","parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePartnerUserBudgetBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/partners/users/{external_id}/usage":{"get":{"tags":["partners"],"summary":"Get Partner User Usage","description":"Get per-tool usage breakdown for a specific partner user.","operationId":"get_partner_user_usage_partners_users__external_id__usage_get","parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerUserUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/check/{slug}":{"get":{"tags":["namespaces","namespaces-public"],"summary":"Check Namespace Availability","description":"Check whether a namespace slug is available.","operationId":"check_namespace_availability_namespaces_check__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"}}}}}}},"/namespaces/check-domain":{"get":{"tags":["namespaces"],"summary":"Check Domain Availability","description":"Check whether the domain of an MCP URL is already claimed by another publisher.\n\nSame publisher may reuse a domain freely; only cross-publisher conflicts are blocked.\nUsers without a publisher profile yet (first-time flow) see global conflicts only.\nChecks against mcp_connections table.","operationId":"check_domain_availability_namespaces_check_domain_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"Full MCP URL whose domain to check","title":"Url"},"description":"Full MCP URL whose domain to check"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/public":{"get":{"tags":["namespaces","namespaces-public"],"summary":"List Public Namespaces","description":"List active namespaces for the public marketplace.\n\nReturns a paginated envelope: {items, total, returned, limit, offset,\nhas_more, next_offset}. The default limit (200) returns the whole catalog\nin one call; if it ever grows past that, page using offset until has_more\nis false.","operationId":"list_public_namespaces_namespaces_public_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","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"}}}}}}},"/namespaces/public/{slug}":{"get":{"tags":["namespaces","namespaces-public"],"summary":"Get Public Namespace","description":"Public namespace detail — used by SSR pages.","operationId":"get_public_namespace_namespaces_public__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/PublicNamespaceDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/quick-setup":{"post":{"tags":["namespaces"],"summary":"Quick Setup","description":"One-shot convenience endpoint for the simple case:\nCreates an MCPConnection, scans it, creates a Namespace, and imports all tools.\nAuto-registers the user as a publisher if they aren't one already.","operationId":"quick_setup_namespaces_quick_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickSetupRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/namespaces/":{"get":{"tags":["namespaces"],"summary":"List Namespaces","description":"List all namespaces owned by the current publisher.","operationId":"list_namespaces_namespaces__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NamespaceListItem"},"type":"array","title":"Response List Namespaces Namespaces  Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["namespaces"],"summary":"Create Namespace","description":"Create a new namespace linked to an existing MCPConnection.","operationId":"create_namespace_namespaces__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/namespaces/{namespace_id}":{"get":{"tags":["namespaces"],"summary":"Get Namespace","description":"Get a namespace with all its tools.","operationId":"get_namespace_namespaces__namespace_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["namespaces"],"summary":"Update Namespace","description":"Update namespace fields (e.g. rename the slug).","operationId":"update_namespace_namespaces__namespace_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/icon":{"post":{"tags":["namespaces"],"summary":"Upload Namespace Icon","description":"Upload a namespace icon image (PNG, JPG, WebP, or SVG, max 2 MB).","operationId":"upload_namespace_icon_namespaces__namespace_id__icon_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_namespace_icon_namespaces__namespace_id__icon_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/scan":{"post":{"tags":["namespaces"],"summary":"Scan Namespace","description":"Scan the MCP server (via the namespace's connection) and import/update tools.\nAlso fetches README if readme_source_url is a GitHub URL.","operationId":"scan_namespace_namespaces__namespace_id__scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/import-tools":{"post":{"tags":["namespaces"],"summary":"Import Tools","description":"Import specific tools from an MCP connection scan into this namespace.","operationId":"import_tools_namespaces__namespace_id__import_tools_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportToolsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/auto-listing":{"post":{"tags":["namespaces"],"summary":"Schedule Auto Listing","description":"Schedule background listing generation against currently-public tools.\n\nReturns immediately; the namespace's listing fields and per-tool\nshort_description/example_prompts are populated when GPT returns.\nUsed by the publisher wizard after the user has chosen tool visibility.","operationId":"schedule_auto_listing_namespaces__namespace_id__auto_listing_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/generate-listing":{"post":{"tags":["namespaces"],"summary":"Generate Namespace Listing","description":"Auto-generate marketplace listing from README and tool metadata using GPT.","operationId":"generate_namespace_listing_namespaces__namespace_id__generate_listing_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GenerateListingRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateListingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/fetch-readme":{"post":{"tags":["namespaces"],"summary":"Fetch Namespace Readme","description":"Fetch README from a URL (e.g. GitHub) and store it on the namespace.","operationId":"fetch_namespace_readme_namespaces__namespace_id__fetch_readme_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchReadmeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/listing":{"put":{"tags":["namespaces"],"summary":"Save Namespace Listing","description":"Save the editable listing data (description + per-tool descriptions/example_prompts).\n\nFor active namespaces, changes are saved as a draft overlay instead of\nmodifying live columns directly.","operationId":"save_namespace_listing_namespaces__namespace_id__listing_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveListingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/publish":{"put":{"tags":["namespaces"],"summary":"Publish Namespace","description":"Set namespace status to 'draft' or 'review'. Defaults to 'review' if no body.\n\nFor active namespaces, submitting for review sets draft_status='review'\ninstead of changing the namespace status (which stays 'active').","operationId":"publish_namespace_namespaces__namespace_id__publish_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SubmitAction"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/draft":{"delete":{"tags":["namespaces"],"summary":"Discard Draft","description":"Discard the current draft overlay. Fails if draft is under review.","operationId":"discard_draft_namespaces__namespace_id__draft_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/status":{"put":{"tags":["namespaces"],"summary":"Update Namespace Status","description":"Suspend or re-enable a namespace. Suspending sets all tools to private.","operationId":"update_namespace_status_namespaces__namespace_id__status_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/tools/{tool_id}/name":{"put":{"tags":["namespaces"],"summary":"Update Tool Name","description":"Rename a tool. The public route is `/invoke/{namespace}/{name}`, so this\nchanges how agents call it. The old name stops resolving immediately.\n\nWorks for both MCP and REST tools. Name must be unique within the\nnamespace; the regex matches the create-side validation.","operationId":"update_tool_name_namespaces__namespace_id__tools__tool_id__name_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolNameUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/tools/{tool_id}/mcp-url-override":{"put":{"tags":["namespaces"],"summary":"Update Tool Mcp Url Override","description":"Set (or clear) a per-tool MCP URL override.\n\nWhen set, invocations of this tool POST to the override URL instead of the\nparent connection's `mcp_url`. Pass `null` to clear. Has no effect on REST\ntools.","operationId":"update_tool_mcp_url_override_namespaces__namespace_id__tools__tool_id__mcp_url_override_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolMCPUrlOverrideUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/tools/{tool_id}/visibility":{"put":{"tags":["namespaces"],"summary":"Update Tool Visibility","description":"Toggle a tool's visibility (public/private).","operationId":"update_tool_visibility_namespaces__namespace_id__tools__tool_id__visibility_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolVisibilityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/tools/{tool_id}/pricing":{"put":{"tags":["namespaces"],"summary":"Update Tool Pricing","description":"DEPRECATED: Use group pricing instead. Kept for backward compatibility.","operationId":"update_tool_pricing_namespaces__namespace_id__tools__tool_id__pricing_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolPricingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/groups":{"post":{"tags":["namespaces"],"summary":"Create Tool Group","description":"Create a new pricing group within a namespace.","operationId":"create_tool_group_namespaces__namespace_id__groups_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolGroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["namespaces"],"summary":"List Tool Groups","description":"List all pricing groups in a namespace with tool counts.","operationId":"list_tool_groups_namespaces__namespace_id__groups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ToolGroupResponse"},"title":"Response List Tool Groups Namespaces  Namespace Id  Groups Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/groups/{group_id}":{"put":{"tags":["namespaces"],"summary":"Update Tool Group","description":"Update a pricing group's name, description, or sort order.","operationId":"update_tool_group_namespaces__namespace_id__groups__group_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["namespaces"],"summary":"Delete Tool Group","description":"Delete a pricing group. Tools are moved to the default group. Cannot delete the default group.","operationId":"delete_tool_group_namespaces__namespace_id__groups__group_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/groups/{group_id}/pricing":{"put":{"tags":["namespaces"],"summary":"Update Tool Group Pricing","description":"Set or update pricing for a tool group. Deactivates the previous active config.","operationId":"update_tool_group_pricing_namespaces__namespace_id__groups__group_id__pricing_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolGroupPricingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/tools/{tool_id}/group":{"put":{"tags":["namespaces"],"summary":"Assign Tool To Group","description":"Move a tool to a different pricing group.","operationId":"assign_tool_to_group_namespaces__namespace_id__tools__tool_id__group_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolGroupAssignment"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/tools/rest":{"post":{"tags":["namespaces"],"summary":"Create Rest Tool","description":"Create a REST tool inside a namespace.\n\nRequires the namespace's connection to be `connection_type='rest'`. The tool\nstarts as `status='active'`, `visibility='private'`. If the namespace has a\ndefault tool group and `tool_group_id` is omitted, the tool is auto-assigned\nto it (so pricing inheritance works out of the box).","operationId":"create_rest_tool_namespaces__namespace_id__tools_rest_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestToolCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/tools/{tool_id}/rest":{"put":{"tags":["namespaces"],"summary":"Update Rest Tool","description":"Update REST runtime fields on a tool (method/path/param map/body template/\nstatic headers/static query/input schema/descriptions).\n\nOnly valid for `tool_type='rest'` tools. Omitted fields are left unchanged.","operationId":"update_rest_tool_namespaces__namespace_id__tools__tool_id__rest_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestToolUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/tools/{tool_id}/mcp":{"put":{"tags":["namespaces"],"summary":"Update Mcp Tool","description":"Update MCP-runtime fields on an imported MCP tool.\n\nEditable MCP-runtime fields:\n- `mcp_static_args`: dict shallow-merged into every invocation's\n  `arguments`, overriding caller values. Hidden from the publicly-served\n  input_schema.\n- `mcp_default_args`: dict shallow-merged UNDER caller values (caller\n  wins). Surfaced in the public schema as `default:` values and dropped\n  from `required`.\n- `input_schema`: replace the stored JSON Schema.\n\n`tool_type='mcp'` is NOT required: `mcp_default_args` also applies to\nREST tools (e.g. Apify actors run through the worker). The name is kept\nfor symmetry with `mcp_static_args`. Pass `{}` to clear any field.","operationId":"update_mcp_tool_namespaces__namespace_id__tools__tool_id__mcp_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"tool_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpToolUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/namespaces/{namespace_id}/credentials":{"put":{"tags":["namespaces"],"summary":"Set Namespace Credentials","description":"Store encrypted API key for the namespace's MCP connection.","operationId":"set_namespace_credentials_namespaces__namespace_id__credentials_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceCredentialSet"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["namespaces"],"summary":"Get Namespace Credentials","description":"Return credential metadata (no secret) so the publisher UI can prefill the form.","operationId":"get_namespace_credentials_namespaces__namespace_id__credentials_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invoke/{namespace}/{tool_name}":{"post":{"tags":["invocations"],"summary":"Invoke Tool","description":"Invoke an MCP tool through the Faro gateway.\n\nAccepts JWT tokens, Faro API keys (faro_...), and partner tokens (faro_partner_...).\nPartner tokens can include X-Faro-User header to identify the end user.\n\nRaw tools are plumbing behind skills: the skill agent presents X-Faro-Service-Token\nto invoke them, while Authorization still carries the forwarded caller, so billing\nis unchanged. The service token never decides who pays. A direct caller without a\nvalid service token is refused (use the skill layer).","operationId":"invoke_tool_invoke__namespace___tool_name__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}},{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-faro-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Faro-User"}},{"name":"x-faro-service-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Faro-Service-Token"}},{"name":"x-faro-skill","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Faro-Skill"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvokeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invocations/{invocation_id}/orchestration-cost":{"post":{"tags":["invocations"],"summary":"Finalize Orchestration Cost Endpoint","description":"Bundle the skill agent's orchestration (LLM) cost into an existing invocation's\nONE buyer charge (Spec 5 §10). Same auth as /invoke; the caller must own the\ninvocation. Idempotent. Returns the new bundled credits_charged.\n\nThe deduction is matched off the invocation row (partner user budget -> partner\npool -> user balance), so a trusted-partner on-behalf-of run charges the same\nbalance the raw tool did.","operationId":"finalize_orchestration_cost_endpoint_invocations__invocation_id__orchestration_cost_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invocation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invocation Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-faro-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Faro-User"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrchestrationCostRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preflight":{"post":{"tags":["invocations"],"summary":"Preflight Endpoint","description":"Can the caller afford to START a charged skill run? The skill agent calls this\nBEFORE running the LLM, so an under-funded caller incurs zero orchestration cost.\nAuth is the forwarded caller (user or partner token, + X-Faro-User); the resolved\nprincipal follows the same three billing cases as /invoke. Never deducts.","operationId":"preflight_endpoint_preflight_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-faro-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Faro-User"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cost/estimate":{"post":{"tags":["invocations"],"summary":"Estimate Cost Endpoint","description":"Observed cost of the calls behind a skill operation, for the smart per-call\nestimate (Spec 5 §10). The skill agent passes the operation's recipe tool names\n(faro-api owns the cost data; the agent owns the seed/fixed policy). Returns\naggregate median/p90/count only — never a per-call payload, vendor, or margin —\nso it is buyer-safe. Aggregated globally (the operation's usual cost). Auth-gated\nlike /invoke but the figure is not user-specific.","operationId":"estimate_cost_endpoint_cost_estimate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostEstimateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invocations/":{"get":{"tags":["invocations"],"summary":"List Invocations","description":"List the current user's invocations, most recent first.","operationId":"list_invocations_invocations__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InvocationListItem"},"title":"Response List Invocations Invocations  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invocations/{invocation_id}":{"get":{"tags":["invocations"],"summary":"Get Invocation","description":"Get a specific invocation (must belong to current user).","operationId":"get_invocation_invocations__invocation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invocation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invocation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/skills/runs/{invocation_id}/feedback":{"post":{"tags":["skill-runs"],"summary":"Submit Skill Feedback","description":"Submit binary feedback on a skill run (Spec 5 §9, Tier 3), keyed on the buyer\nenvelope `id`. Thumbs up/down + an optional reason; resubmitting updates it.","operationId":"submit_skill_feedback_skills_runs__invocation_id__feedback_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invocation_id","in":"path","required":true,"schema":{"type":"string","title":"Invocation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillFeedbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillFeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/docs/":{"get":{"tags":["docs"],"summary":"Get Api Guide","description":"Structured API guide for agents and developers.","operationId":"get_api_guide_docs__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiGuide"}}}}}}},"/docs/namespaces/{slug}":{"get":{"tags":["docs"],"summary":"Get Namespace Docs","description":"Agent-friendly documentation for a namespace and all its public tools.","operationId":"get_namespace_docs_docs_namespaces__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/NamespaceDoc"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/docs/namespaces/{slug}/{tool_name}":{"get":{"tags":["docs"],"summary":"Get Tool Docs","description":"Agent-friendly documentation for a single tool with curl example.","operationId":"get_tool_docs_docs_namespaces__slug___tool_name__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolDoc"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pcx/manifest":{"get":{"tags":["pcx"],"summary":"Pcx Manifest","description":"The pcx manifest JSON for a budget variant (e.g. 4k, 32k).","operationId":"pcx_manifest_pcx_manifest_get","parameters":[{"name":"budget","in":"query","required":false,"schema":{"type":"string","default":"4k","title":"Budget"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pcx/catalog.md":{"get":{"tags":["pcx"],"summary":"Pcx Catalog Md","description":"The human/agent-readable llms.txt rendering of the catalog index.","operationId":"pcx_catalog_md_pcx_catalog_md_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/catalog/public":{"get":{"tags":["catalog"],"summary":"Get Public Catalog","description":"The public skill catalog (headers + capabilities + prices), edge-cacheable.","operationId":"get_public_catalog_catalog_public_get","parameters":[{"name":"if-none-match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/uploads/presign":{"post":{"tags":["uploads"],"summary":"Generate a pre-signed URL pair for uploading a transient tool input.","description":"Returns a `put_url` (one-shot upload, ~1h TTL) and a `get_url` (~24h TTL).\n\nUpload your file with `PUT put_url`, `Content-Length: <content_length>`,\nand the matching `Content-Type` header. The pre-signed URL is bound to the\nexact byte length you declared — R2 rejects mismatched uploads. Then pass\n`get_url` as the input argument to whatever tool consumes it.","operationId":"presign_upload_uploads_presign_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/health":{"get":{"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AgentSignupRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"token_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Name"}},"type":"object","required":["email"],"title":"AgentSignupRequest","description":"Self-serve signup for an agent. Email is the only required field."},"AgentSignupResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"api_key":{"type":"string","title":"Api Key"},"login_url":{"type":"string","title":"Login Url"},"is_verified":{"type":"boolean","title":"Is Verified"},"verification_required":{"type":"boolean","title":"Verification Required"},"message":{"type":"string","title":"Message"}},"type":"object","required":["user_id","api_key","login_url","is_verified","verification_required","message"],"title":"AgentSignupResponse"},"ApiGuide":{"properties":{"version":{"type":"string","title":"Version"},"authentication":{"additionalProperties":true,"type":"object","title":"Authentication"},"endpoints":{"items":{"$ref":"#/components/schemas/EndpointDoc"},"type":"array","title":"Endpoints"},"pagination":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pagination"},"credits":{"additionalProperties":true,"type":"object","title":"Credits"},"verification":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Verification"},"errors":{"additionalProperties":{"type":"string"},"type":"object","title":"Errors"},"cli":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cli"}},"type":"object","required":["version","authentication","endpoints","credits","errors"],"title":"ApiGuide"},"AutoRechargeCheckoutResponse":{"properties":{"transaction_id":{"type":"string","title":"Transaction Id"}},"type":"object","required":["transaction_id"],"title":"AutoRechargeCheckoutResponse"},"AutoRechargeConfigRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"threshold_usd":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Threshold Usd"},"amount_usd":{"type":"integer","maximum":2000.0,"minimum":1.0,"title":"Amount Usd"}},"type":"object","required":["enabled","threshold_usd","amount_usd"],"title":"AutoRechargeConfigRequest"},"AutoRechargeConfigResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"threshold_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Threshold Usd"},"amount_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Usd"},"triggered_immediately":{"type":"boolean","title":"Triggered Immediately","default":false}},"type":"object","required":["enabled"],"title":"AutoRechargeConfigResponse"},"Body_upload_namespace_icon_namespaces__namespace_id__icon_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_namespace_icon_namespaces__namespace_id__icon_post"},"Body_upload_publisher_logo_listings_me_logo_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_publisher_logo_listings_me_logo_post"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"ConnectionCredentialSet":{"properties":{"api_key":{"type":"string","maxLength":2000,"minLength":1,"title":"Api Key"},"key_identifier":{"type":"string","maxLength":100,"title":"Key Identifier","default":"Authorization"},"param_location":{"type":"string","pattern":"^(header|query)$","title":"Param Location","default":"header"},"param_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Param Description"}},"type":"object","required":["api_key"],"title":"ConnectionCredentialSet","description":"Set (or update) the encrypted API key for an MCP connection."},"ConnectionScanResponse":{"properties":{"connection_id":{"type":"string","format":"uuid","title":"Connection Id"},"namespace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Namespace Id"},"tools_found":{"type":"integer","title":"Tools Found"},"tools_imported":{"type":"integer","title":"Tools Imported"},"tools_updated":{"type":"integer","title":"Tools Updated"},"scan_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Error"},"tools":{"items":{"$ref":"#/components/schemas/ScanToolResult"},"type":"array","title":"Tools"}},"type":"object","required":["connection_id","namespace_id","tools_found","tools_imported","tools_updated","scan_error","tools"],"title":"ConnectionScanResponse"},"CostEstimateRequest":{"properties":{"tool_names":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Tool Names"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"}},"type":"object","required":["tool_names"],"title":"CostEstimateRequest","description":"Ask for the observed cost of the calls behind a skill operation (Spec 5 §10).\n\n`tool_names` are the qualified `<namespace>.<tool>` names the operation drives\n(the skill agent supplies them from the shielded recipe; faro-api stays\ncatalog-free). `params` optionally narrows to the SIMILAR calls that share the\nstated cost-determining values (e.g. {\"size\": \"3840x2160\"})."},"CreatePartnerUserBody":{"properties":{"external_id":{"type":"string","maxLength":255,"minLength":1,"title":"External Id"},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name"},"budget_credits":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Budget Credits","default":"0"}},"type":"object","required":["external_id"],"title":"CreatePartnerUserBody"},"CreateTokenRequest":{"properties":{"name":{"type":"string","title":"Name"},"daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Limit","default":100000},"weekly_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit"},"total_spend_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Spend Limit"},"whitelisted_slugs":{"items":{"type":"string"},"type":"array","title":"Whitelisted Slugs","default":[]},"blacklisted_slugs":{"items":{"type":"string"},"type":"array","title":"Blacklisted Slugs","default":[]}},"type":"object","required":["name"],"title":"CreateTokenRequest"},"CreditBalanceResponse":{"properties":{"balance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Balance"},"lifetime_loaded":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifetime Loaded"},"lifetime_spent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifetime Spent"},"balance_dollars":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Balance Dollars"},"auto_recharge_enabled":{"type":"boolean","title":"Auto Recharge Enabled","default":false},"auto_recharge_threshold_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Recharge Threshold Usd"},"auto_recharge_amount_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Recharge Amount Usd"},"has_autorecharge_subscription":{"type":"boolean","title":"Has Autorecharge Subscription","default":false},"low_balance_alert_usd":{"type":"integer","title":"Low Balance Alert Usd","default":0}},"type":"object","required":["balance","lifetime_loaded","lifetime_spent","balance_dollars"],"title":"CreditBalanceResponse"},"CreditPurchaseResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"credits_amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credits Amount"},"dollar_amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dollar Amount"},"fee_amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fee Amount"},"payment_method":{"type":"string","title":"Payment Method"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","credits_amount","dollar_amount","fee_amount","payment_method","status","created_at"],"title":"CreditPurchaseResponse"},"EarningsSummaryResponse":{"properties":{"total_earned":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Earned"},"total_pending":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Pending"},"total_earned_dollars":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Earned Dollars"},"total_pending_dollars":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Pending Dollars"},"total_invocations":{"type":"integer","title":"Total Invocations"},"total_namespaces":{"type":"integer","title":"Total Namespaces"}},"type":"object","required":["total_earned","total_pending","total_earned_dollars","total_pending_dollars","total_invocations","total_namespaces"],"title":"EarningsSummaryResponse"},"EndpointDoc":{"properties":{"method":{"type":"string","title":"Method"},"path":{"type":"string","title":"Path"},"description":{"type":"string","title":"Description"},"auth_required":{"type":"boolean","title":"Auth Required"},"parameters":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Parameters","default":[]}},"type":"object","required":["method","path","description","auth_required"],"title":"EndpointDoc"},"FetchReadmeRequest":{"properties":{"url":{"type":"string","maxLength":1000,"title":"Url"}},"type":"object","required":["url"],"title":"FetchReadmeRequest"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"GenerateListingRequest":{"properties":{"readme_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readme Content"}},"type":"object","title":"GenerateListingRequest"},"GenerateListingResponse":{"properties":{"listing_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Name"},"namespace_description":{"type":"string","title":"Namespace Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]},"tools":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tools"}},"type":"object","required":["namespace_description","tools"],"title":"GenerateListingResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportToolsRequest":{"properties":{"connection_id":{"type":"string","format":"uuid","title":"Connection Id"},"mcp_tool_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mcp Tool Names"},"visibility":{"type":"string","pattern":"^(public|private)$","title":"Visibility","default":"private"}},"type":"object","required":["connection_id"],"title":"ImportToolsRequest","description":"Import discovered tools from a scan into this namespace."},"InviteRequestBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"InviteRequestBody"},"InvocationListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"idempotency_key":{"type":"string","title":"Idempotency Key"},"namespace":{"type":"string","title":"Namespace"},"tool_name":{"type":"string","title":"Tool Name"},"status":{"type":"string","title":"Status"},"credits_charged":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credits Charged"},"credits_estimated":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credits Estimated"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","idempotency_key","namespace","tool_name","status","credits_charged","started_at","completed_at"],"title":"InvocationListItem"},"InvokeRequest":{"properties":{"arguments":{"additionalProperties":true,"type":"object","title":"Arguments"},"idempotency_key":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Idempotency Key"}},"type":"object","title":"InvokeRequest","description":"Request body to invoke a tool."},"LoginLinkResponse":{"properties":{"login_url":{"type":"string","title":"Login Url"},"expires_in_minutes":{"type":"integer","title":"Expires In Minutes"}},"type":"object","required":["login_url","expires_in_minutes"],"title":"LoginLinkResponse"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"LowBalanceAlertRequest":{"properties":{"alert_usd":{"type":"integer","maximum":500.0,"minimum":0.0,"title":"Alert Usd"}},"type":"object","required":["alert_usd"],"title":"LowBalanceAlertRequest"},"LowBalanceAlertResponse":{"properties":{"alert_usd":{"type":"integer","title":"Alert Usd"}},"type":"object","required":["alert_usd"],"title":"LowBalanceAlertResponse"},"MCPConnectionCreate":{"properties":{"label":{"type":"string","maxLength":255,"minLength":1,"title":"Label"},"connection_type":{"type":"string","pattern":"^(mcp|rest)$","title":"Connection Type","default":"mcp"},"mcp_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Mcp Url"},"base_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Base Url"}},"type":"object","required":["label"],"title":"MCPConnectionCreate"},"MCPConnectionListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"label":{"type":"string","title":"Label"},"connection_type":{"type":"string","title":"Connection Type"},"mcp_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Url"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"last_validation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Validation Status"},"namespace_count":{"type":"integer","title":"Namespace Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","label","connection_type","mcp_url","base_url","last_scanned_at","last_validation_status","created_at"],"title":"MCPConnectionListItem"},"MCPConnectionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"publisher_id":{"type":"string","format":"uuid","title":"Publisher Id"},"label":{"type":"string","title":"Label"},"connection_type":{"type":"string","title":"Connection Type"},"mcp_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Url"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"last_validation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Validation Status"},"validation_error_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Error 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","publisher_id","label","connection_type","mcp_url","base_url","last_scanned_at","last_validation_status","validation_error_summary","created_at","updated_at"],"title":"MCPConnectionResponse"},"MCPConnectionUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Label"},"mcp_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Mcp Url"},"base_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Base Url"}},"type":"object","title":"MCPConnectionUpdate"},"MagicLoginRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"MagicLoginRequest"},"McpToolUpdate":{"properties":{"mcp_static_args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mcp Static Args"},"mcp_default_args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mcp Default Args"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema"},"pricing_unit_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pricing Unit Fields"},"pricing_credits_per_unit":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pricing Credits Per Unit"}},"type":"object","title":"McpToolUpdate","description":"Edit MCP-runtime fields on an imported MCP tool.\n\nFields:\n- `mcp_static_args`: flat dict shallow-merged into every invocation's\n  `arguments`, overriding caller values. Use for publisher invariants like\n  `{\"refresh\": true}`. Pass `{}` to clear.\n- `mcp_default_args`: flat dict shallow-merged UNDER caller arguments\n  (caller wins). Visible in the public schema as `default:` values and\n  dropped from `required`. Use to bound unbounded inputs (e.g.\n  `{\"maxItemsPerSearch\": 50}` on an Apify scraper). Pass `{}` to clear.\n- `input_schema`: replace the stored JSON Schema. Use to layer publisher\n  caps onto the upstream's schema, e.g. add `maxItems: 10` to an array\n  property to reduce blast radius. Pass `{}` to reset to a no-validation\n  object schema.\n\nOmitted fields are left unchanged."},"MessageResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"MessageResponse"},"NamespaceCreate":{"properties":{"namespace":{"type":"string","maxLength":100,"minLength":2,"pattern":"^[a-z0-9][a-z0-9\\-]*[a-z0-9]$","title":"Namespace"},"connection_id":{"type":"string","format":"uuid","title":"Connection Id"},"readme_source_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Readme Source Url"}},"type":"object","required":["namespace","connection_id"],"title":"NamespaceCreate"},"NamespaceCredentialSet":{"properties":{"api_key":{"type":"string","maxLength":2000,"minLength":1,"title":"Api Key"},"key_identifier":{"type":"string","maxLength":100,"title":"Key Identifier","default":"Authorization"},"param_location":{"type":"string","pattern":"^(header|query)$","title":"Param Location","default":"header"},"param_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Param Description"}},"type":"object","required":["api_key"],"title":"NamespaceCredentialSet","description":"Set (or update) the encrypted API key for the namespace's MCP connection."},"NamespaceDoc":{"properties":{"namespace":{"type":"string","title":"Namespace"},"listing_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]},"readme_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readme Content"},"how_to_use":{"type":"string","title":"How To Use"},"invoke_url_template":{"type":"string","title":"Invoke Url Template"},"tools":{"items":{"$ref":"#/components/schemas/ToolDoc"},"type":"array","title":"Tools","default":[]}},"type":"object","required":["namespace","how_to_use","invoke_url_template"],"title":"NamespaceDoc"},"NamespaceListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"namespace":{"type":"string","title":"Namespace"},"connection_id":{"type":"string","format":"uuid","title":"Connection Id"},"connection_type":{"type":"string","title":"Connection Type","default":"mcp"},"mcp_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Url"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"status":{"type":"string","title":"Status"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"last_validation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Validation Status"},"tool_count":{"type":"integer","title":"Tool Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","namespace","connection_id","status","last_scanned_at","last_validation_status","created_at"],"title":"NamespaceListItem"},"NamespaceResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"publisher_id":{"type":"string","format":"uuid","title":"Publisher Id"},"namespace":{"type":"string","title":"Namespace"},"connection_id":{"type":"string","format":"uuid","title":"Connection Id"},"connection_type":{"type":"string","title":"Connection Type","default":"mcp"},"mcp_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Url"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"status":{"type":"string","title":"Status"},"listing_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Name"},"namespace_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Icon Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]},"readme_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readme Content"},"readme_source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readme Source Url"},"readme_last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Readme Last Synced At"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"last_validation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Validation Status"},"validation_error_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Error Summary"},"draft_listing":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Draft Listing"},"draft_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Status"},"draft_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Draft Updated At"},"live_version":{"type":"integer","title":"Live Version","default":1},"tools":{"items":{"$ref":"#/components/schemas/ToolSummary"},"type":"array","title":"Tools","default":[]},"tool_groups":{"items":{"$ref":"#/components/schemas/ToolGroupResponse"},"type":"array","title":"Tool Groups","default":[]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","publisher_id","namespace","connection_id","status","readme_source_url","readme_last_synced_at","last_scanned_at","last_validation_status","validation_error_summary","created_at","updated_at"],"title":"NamespaceResponse"},"NamespaceStatusUpdate":{"properties":{"status":{"type":"string","pattern":"^(suspended|draft)$","title":"Status"}},"type":"object","required":["status"],"title":"NamespaceStatusUpdate"},"NamespaceUpdate":{"properties":{"namespace":{"anyOf":[{"type":"string","maxLength":100,"minLength":2,"pattern":"^[a-z0-9][a-z0-9\\-]*[a-z0-9]$"},{"type":"null"}],"title":"Namespace"},"readme_source_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Readme Source Url"},"namespace_icon_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Namespace Icon Url"}},"type":"object","title":"NamespaceUpdate"},"OpenAPIImportRequest":{"properties":{"namespace":{"type":"string","maxLength":100,"minLength":2,"pattern":"^[a-z0-9][a-z0-9\\-]*[a-z0-9]$","title":"Namespace"},"label":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Label"},"spec_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Spec Url"},"spec":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Spec"},"base_url_override":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Base Url Override"}},"type":"object","required":["namespace"],"title":"OpenAPIImportRequest","description":"Create a REST connection + namespace from an OpenAPI 3.x spec.\n\nProvide either spec_url (we'll fetch it) or spec (the raw JSON/YAML object)."},"OpenAPIImportResponse":{"properties":{"connection_id":{"type":"string","format":"uuid","title":"Connection Id"},"namespace_id":{"type":"string","format":"uuid","title":"Namespace Id"},"base_url":{"type":"string","title":"Base Url"},"tools_imported":{"type":"integer","title":"Tools Imported"},"tools":{"items":{"$ref":"#/components/schemas/OpenAPIImportToolResult"},"type":"array","title":"Tools"},"auth_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Hint"}},"type":"object","required":["connection_id","namespace_id","base_url","tools_imported","tools"],"title":"OpenAPIImportResponse"},"OpenAPIImportToolResult":{"properties":{"name":{"type":"string","title":"Name"},"method":{"type":"string","title":"Method"},"path":{"type":"string","title":"Path"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"}},"type":"object","required":["name","method","path","summary"],"title":"OpenAPIImportToolResult"},"OrchestrationCostRequest":{"properties":{"cost_credits":{"type":"number","minimum":0.0,"title":"Cost Credits"}},"type":"object","required":["cost_credits"],"title":"OrchestrationCostRequest","description":"Report the skill agent's orchestration (LLM) cost in raw credits (no margin)\nto bundle into the invocation's one buyer charge (Spec 5 §10)."},"PartnerDashboard":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"company_name":{"type":"string","title":"Company Name"},"status":{"type":"string","title":"Status"},"credit_balance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credit Balance"},"api_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Token Prefix"},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"},"total_users":{"type":"integer","title":"Total Users"},"total_spent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Spent"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Approved At"}},"type":"object","required":["id","company_name","status","credit_balance","total_users","total_spent","created_at"],"title":"PartnerDashboard"},"PartnerRequestBody":{"properties":{"company_name":{"type":"string","maxLength":255,"minLength":1,"title":"Company Name"},"use_case":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Use Case"}},"type":"object","required":["company_name"],"title":"PartnerRequestBody"},"PartnerStatus":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"company_name":{"type":"string","title":"Company Name"},"status":{"type":"string","title":"Status"},"credit_balance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credit Balance"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Approved At"}},"type":"object","required":["id","company_name","status","credit_balance","created_at"],"title":"PartnerStatus"},"PartnerUserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"external_id":{"type":"string","title":"External Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"credit_balance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credit Balance"},"lifetime_allocated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifetime Allocated"},"lifetime_spent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifetime Spent"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","external_id","display_name","credit_balance","lifetime_allocated","lifetime_spent","is_active","created_at","updated_at"],"title":"PartnerUserResponse"},"PartnerUserUsageItem":{"properties":{"namespace":{"type":"string","title":"Namespace"},"tool_name":{"type":"string","title":"Tool Name"},"invocation_count":{"type":"integer","title":"Invocation Count"},"total_credits":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Credits"}},"type":"object","required":["namespace","tool_name","invocation_count","total_credits"],"title":"PartnerUserUsageItem"},"PartnerUserUsageResponse":{"properties":{"external_id":{"type":"string","title":"External Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"credit_balance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credit Balance"},"lifetime_spent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifetime Spent"},"tools":{"items":{"$ref":"#/components/schemas/PartnerUserUsageItem"},"type":"array","title":"Tools"}},"type":"object","required":["external_id","display_name","credit_balance","lifetime_spent","tools"],"title":"PartnerUserUsageResponse"},"PreflightRequest":{"properties":{"estimated_credits":{"type":"number","minimum":0.0,"title":"Estimated Credits","default":0}},"type":"object","title":"PreflightRequest","description":"Ask whether the caller can afford to START a charged skill run, BEFORE the\nskill agent spends anything on the LLM. `estimated_credits` is the operation's\nexpected cost; the resolved principal (user / partner-user / partner) follows the\nsame 3 billing cases as /invoke. Never deducts."},"PresignRequest":{"properties":{"filename":{"type":"string","maxLength":256,"minLength":1,"title":"Filename"},"content_type":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Content Type"},"content_length":{"type":"integer","maximum":524288000.0,"minimum":1.0,"title":"Content Length","description":"Exact byte length of the file you are about to upload. The pre-signed PUT URL is bound to this length — R2 rejects uploads of any other size. Hard ceiling: 500 MB."},"put_expires_s":{"type":"integer","maximum":21600.0,"minimum":60.0,"title":"Put Expires S","default":3600},"get_expires_s":{"type":"integer","maximum":86400.0,"minimum":60.0,"title":"Get Expires S","default":3600}},"type":"object","required":["filename","content_length"],"title":"PresignRequest"},"PresignResponse":{"properties":{"key":{"type":"string","title":"Key"},"put_url":{"type":"string","title":"Put Url"},"get_url":{"type":"string","title":"Get Url"},"content_length":{"type":"integer","title":"Content Length"},"put_expires_at":{"type":"string","format":"date-time","title":"Put Expires At"},"get_expires_at":{"type":"string","format":"date-time","title":"Get Expires At"}},"type":"object","required":["key","put_url","get_url","content_length","put_expires_at","get_expires_at"],"title":"PresignResponse"},"PublicNamespaceDetail":{"properties":{"namespace":{"type":"string","title":"Namespace"},"listing_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Name"},"namespace_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Icon Url"},"publisher_display_name":{"type":"string","title":"Publisher Display Name"},"publisher_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Logo Url"},"publisher_website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Website Url"},"publisher_support_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Support Email"},"mcp_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Url","description":"Upstream MCP server URL (the publisher's origin). None for non-MCP namespaces. Informational only — agents authenticate and pay through Faro, so call faro_invoke_url_template instead."},"faro_invoke_url_template":{"type":"string","title":"Faro Invoke Url Template","description":"Faro-callable URL for tools in this namespace. Substitute {tool_name} with the tool's mcp_tool_name and POST with Authorization: Bearer faro_<key>."},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]},"readme_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readme Content"},"tools":{"items":{"$ref":"#/components/schemas/PublicToolDetail"},"type":"array","title":"Tools"},"tool_groups":{"items":{"$ref":"#/components/schemas/ToolGroupResponse"},"type":"array","title":"Tool Groups","default":[]}},"type":"object","required":["namespace","publisher_display_name","faro_invoke_url_template","status","readme_content","tools"],"title":"PublicNamespaceDetail"},"PublicToolDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"mcp_tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Tool Name"},"short_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Description"},"long_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Long Description"},"input_schema":{"additionalProperties":true,"type":"object","title":"Input Schema"},"status":{"type":"string","title":"Status"},"visibility":{"type":"string","title":"Visibility"},"example_prompts":{"items":{"type":"string"},"type":"array","title":"Example Prompts","default":[]},"display_order":{"type":"integer","title":"Display Order","default":0},"pricing":{"anyOf":[{"$ref":"#/components/schemas/ToolPricingSummary"},{"type":"null"}]},"tool_group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tool Group Id"},"tool_group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Group Name"}},"type":"object","required":["id","name","short_description","long_description","input_schema","status","visibility","pricing"],"title":"PublicToolDetail"},"PublisherRegisterRequest":{"properties":{"display_name":{"type":"string","title":"Display Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"support_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Support Email"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"}},"type":"object","required":["display_name"],"title":"PublisherRegisterRequest"},"PublisherResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"support_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Support Email"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"commission_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Commission Rate"},"is_approved":{"type":"boolean","title":"Is Approved"},"is_trusted":{"type":"boolean","title":"Is Trusted"},"external_billing":{"type":"boolean","title":"External Billing"},"total_earned":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Earned"},"total_pending":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Pending"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","display_name","website_url","support_email","logo_url","bio","commission_rate","is_approved","is_trusted","external_billing","total_earned","total_pending","created_at"],"title":"PublisherResponse"},"PublisherUpdateRequest":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"support_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Support Email"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","title":"PublisherUpdateRequest"},"PurchaseRequest":{"properties":{"amount_usd":{"type":"integer","maximum":2000.0,"minimum":1.0,"title":"Amount Usd"}},"type":"object","required":["amount_usd"],"title":"PurchaseRequest"},"PurchaseResponse":{"properties":{"transaction_id":{"type":"string","title":"Transaction Id"}},"type":"object","required":["transaction_id"],"title":"PurchaseResponse"},"QuickSetupRequest":{"properties":{"namespace":{"type":"string","maxLength":100,"minLength":2,"pattern":"^[a-z0-9][a-z0-9\\-]*[a-z0-9]$","title":"Namespace"},"mcp_url":{"type":"string","maxLength":1000,"title":"Mcp Url"},"readme_source_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Readme Source Url"}},"type":"object","required":["namespace","mcp_url"],"title":"QuickSetupRequest","description":"One-shot: create connection + scan + create namespace + import all tools."},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"full_name":{"type":"string","title":"Full Name"}},"type":"object","required":["email","password","full_name"],"title":"RegisterRequest"},"ResendVerificationRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ResendVerificationRequest"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"RestToolCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"pattern":"^[a-zA-Z0-9_\\-]+$","title":"Name"},"short_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Short Description"},"long_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Long Description"},"rest_method":{"type":"string","pattern":"^(GET|POST|PUT|PATCH|DELETE|HEAD)$","title":"Rest Method","default":"POST"},"rest_path":{"type":"string","maxLength":1000,"title":"Rest Path","default":"/"},"rest_param_map":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rest Param Map"},"rest_body_template":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"null"}],"title":"Rest Body Template"},"rest_static_headers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rest Static Headers"},"rest_static_query":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rest Static Query"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema"},"tool_group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tool Group Id"},"visibility":{"type":"string","pattern":"^(public|private)$","title":"Visibility","default":"public"}},"type":"object","required":["name"],"title":"RestToolCreate","description":"Create a REST tool inside a namespace whose connection is `connection_type='rest'`.\n\nAll REST-runtime fields are optional at create time — a publisher (or an agent\non their behalf) can fill them in incrementally via PUT /tools/{id}/rest."},"RestToolUpdate":{"properties":{"rest_method":{"anyOf":[{"type":"string","pattern":"^(GET|POST|PUT|PATCH|DELETE|HEAD)$"},{"type":"null"}],"title":"Rest Method"},"rest_path":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Rest Path"},"rest_param_map":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rest Param Map"},"rest_body_template":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"null"}],"title":"Rest Body Template"},"rest_static_headers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rest Static Headers"},"rest_static_query":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rest Static Query"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema"},"short_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Short Description"},"long_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Long Description"}},"type":"object","title":"RestToolUpdate","description":"Edit the REST-runtime fields of a tool. All fields optional — omitted ones stay as-is."},"SalesSummaryResponse":{"properties":{"period":{"type":"string","title":"Period"},"start_date":{"type":"string","title":"Start Date"},"end_date":{"type":"string","title":"End Date"},"total_transactions":{"type":"integer","title":"Total Transactions"},"total_sales_credits":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Sales Credits"},"total_sales_dollars":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Sales Dollars"},"daily":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Daily"},"by_namespace":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"By Namespace"},"daily_by_namespace":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Daily By Namespace","default":[]}},"type":"object","required":["period","start_date","end_date","total_transactions","total_sales_credits","total_sales_dollars","daily","by_namespace"],"title":"SalesSummaryResponse"},"SaveListingRequest":{"properties":{"listing_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Name"},"namespace_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Icon Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"readme_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readme Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"tools":{"items":{"$ref":"#/components/schemas/ToolListingUpdate"},"type":"array","title":"Tools","default":[]}},"type":"object","title":"SaveListingRequest"},"ScanResponse":{"properties":{"namespace_id":{"type":"string","format":"uuid","title":"Namespace Id"},"tools_found":{"type":"integer","title":"Tools Found"},"tools_imported":{"type":"integer","title":"Tools Imported"},"tools_updated":{"type":"integer","title":"Tools Updated"},"scan_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Error"},"tools":{"items":{"$ref":"#/components/schemas/ScanToolResult"},"type":"array","title":"Tools"}},"type":"object","required":["namespace_id","tools_found","tools_imported","tools_updated","scan_error","tools"],"title":"ScanResponse"},"ScanToolResult":{"properties":{"name":{"type":"string","title":"Name"},"mcp_tool_name":{"type":"string","title":"Mcp Tool Name"},"short_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Description"},"input_schema":{"additionalProperties":true,"type":"object","title":"Input Schema"},"is_new":{"type":"boolean","title":"Is New"},"is_changed":{"type":"boolean","title":"Is Changed"}},"type":"object","required":["name","mcp_tool_name","short_description","input_schema","is_new","is_changed"],"title":"ScanToolResult"},"SkillFeedbackRequest":{"properties":{"rating":{"type":"string","enum":["up","down"],"title":"Rating"},"reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Reason"}},"type":"object","required":["rating"],"title":"SkillFeedbackRequest","description":"Binary user feedback on a skill run (Spec 5 §9, Tier 3): a thumbs up/down plus\nan optional short reason. Keyed on the buyer envelope `id` (the path param)."},"SkillFeedbackResponse":{"properties":{"id":{"type":"string","title":"Id"},"invocation_id":{"type":"string","title":"Invocation Id"},"rating":{"type":"string","title":"Rating"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["id","invocation_id","rating"],"title":"SkillFeedbackResponse"},"SubmitAction":{"properties":{"action":{"type":"string","pattern":"^(draft|review)$","title":"Action","default":"review"}},"type":"object","title":"SubmitAction"},"TokenCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"token":{"type":"string","title":"Token"},"token_prefix":{"type":"string","title":"Token Prefix"},"daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Limit"},"weekly_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit"},"total_spend_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Spend Limit"},"whitelisted_slugs":{"items":{"type":"string"},"type":"array","title":"Whitelisted Slugs"},"blacklisted_slugs":{"items":{"type":"string"},"type":"array","title":"Blacklisted Slugs"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","token","token_prefix","daily_limit","weekly_limit","total_spend_limit","whitelisted_slugs","blacklisted_slugs","created_at"],"title":"TokenCreatedResponse","description":"Returned only on creation — includes the full token (shown once)."},"ToolDoc":{"properties":{"name":{"type":"string","title":"Name"},"mcp_tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Tool Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"long_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Long Description"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema"},"example_prompts":{"items":{"type":"string"},"type":"array","title":"Example Prompts","default":[]},"pricing":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pricing"},"curl_example":{"type":"string","title":"Curl Example"}},"type":"object","required":["name","curl_example"],"title":"ToolDoc"},"ToolGroupAssignment":{"properties":{"tool_group_id":{"type":"string","format":"uuid","title":"Tool Group Id"}},"type":"object","required":["tool_group_id"],"title":"ToolGroupAssignment"},"ToolGroupCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"sort_order":{"type":"integer","minimum":0.0,"title":"Sort Order","default":0}},"type":"object","required":["name"],"title":"ToolGroupCreate"},"ToolGroupPricingUpdate":{"properties":{"pricing_mode":{"type":"string","pattern":"^(fixed_per_request|tool_returned)$","title":"Pricing Mode"},"fixed_credit_cost":{"anyOf":[{"type":"number","maximum":2000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,15}|(?=[\\d.]{1,36}0*$)\\d{0,15}\\.\\d{0,20}0*$)"},{"type":"null"}],"title":"Fixed Credit Cost"},"returned_credit_cost_path":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Returned Credit Cost Path"},"returned_credit_multiplier":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,15}|(?=[\\d.]{1,36}0*$)\\d{0,15}\\.\\d{0,20}0*$)"}],"title":"Returned Credit Multiplier","default":"1"},"base_credit_cost":{"anyOf":[{"type":"number","maximum":20000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,15}|(?=[\\d.]{1,36}0*$)\\d{0,15}\\.\\d{0,20}0*$)"}],"title":"Base Credit Cost","default":"0"},"estimated_max_credit_cost":{"anyOf":[{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,15}|(?=[\\d.]{1,36}0*$)\\d{0,15}\\.\\d{0,20}0*$)"},{"type":"null"}],"title":"Estimated Max Credit Cost"},"charge_on":{"type":"string","pattern":"^(success|attempt)$","title":"Charge On","default":"success"},"pricing_rules":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Pricing Rules"},"pricing_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Pricing Description"}},"type":"object","required":["pricing_mode"],"title":"ToolGroupPricingUpdate"},"ToolGroupResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"namespace_id":{"type":"string","format":"uuid","title":"Namespace Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"sort_order":{"type":"integer","title":"Sort Order"},"is_default":{"type":"boolean","title":"Is Default"},"pricing":{"anyOf":[{"$ref":"#/components/schemas/ToolPricingSummary"},{"type":"null"}]},"pending_pricing":{"type":"boolean","title":"Pending Pricing","default":false},"tool_count":{"type":"integer","title":"Tool Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","namespace_id","name","sort_order","is_default","created_at","updated_at"],"title":"ToolGroupResponse"},"ToolGroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ToolGroupUpdate"},"ToolListingUpdate":{"properties":{"tool_id":{"type":"string","format":"uuid","title":"Tool Id"},"short_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Description"},"example_prompts":{"items":{"type":"string"},"type":"array","title":"Example Prompts","default":[]},"display_order":{"type":"integer","title":"Display Order","default":0},"search_keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Search Keywords"}},"type":"object","required":["tool_id"],"title":"ToolListingUpdate"},"ToolMCPUrlOverrideUpdate":{"properties":{"mcp_url_override":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Mcp Url Override"}},"type":"object","title":"ToolMCPUrlOverrideUpdate","description":"Set or clear a per-tool MCP URL override.\n\nPass `mcp_url_override=null` to clear and fall back to the connection's\ndefault `mcp_url`."},"ToolNameUpdate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"pattern":"^[a-zA-Z0-9_\\-]+$","title":"Name"}},"type":"object","required":["name"],"title":"ToolNameUpdate","description":"Rename a tool. The new name must be unique within the namespace."},"ToolPricingSummary":{"properties":{"pricing_mode":{"type":"string","title":"Pricing Mode"},"fixed_credit_cost":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Fixed Credit Cost"},"returned_credit_cost_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Returned Credit Cost Path"},"returned_credit_multiplier":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Returned Credit Multiplier"},"base_credit_cost":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Base Credit Cost"},"estimated_max_credit_cost":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Estimated Max Credit Cost"},"pricing_rules":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Pricing Rules"},"charge_on":{"type":"string","title":"Charge On"},"pricing_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Description"}},"type":"object","required":["pricing_mode","charge_on"],"title":"ToolPricingSummary"},"ToolPricingUpdate":{"properties":{"pricing_mode":{"type":"string","pattern":"^(fixed_per_request|tool_returned)$","title":"Pricing Mode"},"fixed_credit_cost":{"anyOf":[{"type":"number","maximum":2000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,15}|(?=[\\d.]{1,36}0*$)\\d{0,15}\\.\\d{0,20}0*$)"},{"type":"null"}],"title":"Fixed Credit Cost"},"returned_credit_cost_path":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Returned Credit Cost Path"},"returned_credit_multiplier":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,15}|(?=[\\d.]{1,36}0*$)\\d{0,15}\\.\\d{0,20}0*$)"}],"title":"Returned Credit Multiplier","default":"1"},"base_credit_cost":{"anyOf":[{"type":"number","maximum":20000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,15}|(?=[\\d.]{1,36}0*$)\\d{0,15}\\.\\d{0,20}0*$)"}],"title":"Base Credit Cost","default":"0"},"charge_on":{"type":"string","pattern":"^(success|attempt)$","title":"Charge On","default":"success"},"pricing_rules":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Pricing Rules"}},"type":"object","required":["pricing_mode"],"title":"ToolPricingUpdate"},"ToolSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"tool_type":{"type":"string","title":"Tool Type","default":"mcp"},"mcp_tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Tool Name"},"short_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Description"},"status":{"type":"string","title":"Status"},"visibility":{"type":"string","title":"Visibility"},"example_prompts":{"items":{"type":"string"},"type":"array","title":"Example Prompts","default":[]},"display_order":{"type":"integer","title":"Display Order","default":0},"pricing":{"anyOf":[{"$ref":"#/components/schemas/ToolPricingSummary"},{"type":"null"}]},"tool_group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tool Group Id"},"tool_group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Group Name"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema"},"rest_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rest Method"},"rest_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rest Path"},"rest_param_map":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rest Param Map"},"rest_body_template":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"null"}],"title":"Rest Body Template"},"rest_static_headers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rest Static Headers"},"rest_static_query":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rest Static Query"},"long_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Long Description"},"mcp_static_args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mcp Static Args"},"mcp_default_args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mcp Default Args"},"pricing_unit_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pricing Unit Fields"},"pricing_credits_per_unit":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Pricing Credits Per Unit"}},"type":"object","required":["id","name","short_description","status","visibility","pricing"],"title":"ToolSummary"},"ToolUpdateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"visibility":{"type":"string","title":"Visibility"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","name","visibility","status"],"title":"ToolUpdateResponse"},"ToolVisibilityUpdate":{"properties":{"visibility":{"type":"string","pattern":"^(public|private)$","title":"Visibility"}},"type":"object","required":["visibility"],"title":"ToolVisibilityUpdate"},"UpdatePartnerUserBudgetBody":{"properties":{"budget_credits":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Budget Credits"}},"type":"object","required":["budget_credits"],"title":"UpdatePartnerUserBudgetBody"},"UpdateProfileRequest":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"}},"type":"object","title":"UpdateProfileRequest"},"UpdateTokenRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Limit"},"weekly_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit"},"total_spend_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Spend Limit"},"whitelisted_slugs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Whitelisted Slugs"},"blacklisted_slugs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blacklisted Slugs"}},"type":"object","title":"UpdateTokenRequest"},"UserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"is_active":{"type":"boolean","title":"Is Active"},"is_verified":{"type":"boolean","title":"Is Verified"},"has_paid":{"type":"boolean","title":"Has Paid"},"is_publisher":{"type":"boolean","title":"Is Publisher"},"is_admin":{"type":"boolean","title":"Is Admin"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","full_name","is_active","is_verified","has_paid","is_publisher","is_admin","created_at"],"title":"UserResponse"},"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"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest"},"schemas__auth__TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token"],"title":"TokenResponse"},"schemas__tokens__TokenResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"token_prefix":{"type":"string","title":"Token Prefix"},"daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Limit"},"weekly_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weekly Limit"},"total_spend_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Spend Limit"},"whitelisted_slugs":{"items":{"type":"string"},"type":"array","title":"Whitelisted Slugs"},"blacklisted_slugs":{"items":{"type":"string"},"type":"array","title":"Blacklisted Slugs"},"is_active":{"type":"boolean","title":"Is Active"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","token_prefix","daily_limit","weekly_limit","total_spend_limit","whitelisted_slugs","blacklisted_slugs","is_active","last_used_at","expires_at","created_at"],"title":"TokenResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}