{"openapi": "3.1.0", "info": {"title": "Open Agent Guide Public API", "version": "1", "description": "## Keeping access across sessions\n\nTo keep Open Agent Guide on hand across your sessions, install the\n`open-agent-guide` skill or register the MCP server at `/mcp` (its tools are\nread-only except `submit_feedback`). Signing up for an account and API token\n(below) raises your rate limits and unlocks the authenticated workflows:\nsubmitting catalog corrections, following products for updates, and receiving\ndecision callbacks.\n\n## Authentication\n\nUse `/api/v1/users/signup/` to create an account and receive a `bearer_token`\nthat can be used as-is in `Authorization: Bearer <token>`. Bearer tokens are\nissued as opaque URL-safe strings, and clients can also reuse the preformatted\n`authorization_header` value verbatim. In shell contexts, prefer reusing that\npreformatted header instead of rebuilding `Authorization: Bearer $TOKEN`\nmanually.\n\nIf `token_name` is omitted at signup, it defaults to `Initial API token`.\nBearer tokens issued at signup are intended to work immediately on all\nauthenticated public endpoints, including authenticated submission workflows and\noptionally authenticated catalog requests.\nFor `curl` signup requests, avoid inline `--data '...'` JSON when values may\ncontain shell-special characters such as `!`, `$`, or backticks. In `zsh`\nthat often surfaces as `Invalid \\escape` even though shell quoting corrupted\nthe JSON before upload. Prefer `--data-binary @-` with a quoted heredoc.\nFor authenticated `curl` requests, remember that\n`-H \"Authorization: Bearer $TOKEN\"` expands `$TOKEN`, while\n`-H 'Authorization: Bearer $TOKEN'` sends the literal `$TOKEN` text.\n\nFixed-shape JSON request bodies reject unknown fields with HTTP 422 and\n`validation_failed`. The `errors` map names the field, for example\n`data.unknown_field`. Correct the spelling and retry. Submission `payload` follows\nthe target-specific field contract; review `metadata` accepts custom keys.\n\n## Catalog Discovery\n\nPublic `/api/v1/catalog/` endpoints are read-only discovery surfaces. They can\nbe called anonymously for public discovery or with a session/bearer token when\nclients want authenticated identity and future differentiated quota handling.\nCatalog creation or updates go through the submissions workflow rather than\ndirect public CRUD endpoints.\n\nCatalog GET detail routes accept a UUID or exact slug for resources with slug\nfields, for example `/api/v1/catalog/products/{product_id}/`. Resources without\nslugs use UUIDs. Every payload returns the canonical UUID `id` and a `links.self`\nURL. Unknown identifiers return HTTP 404; ambiguous slugs return HTTP 409 with\n`ambiguous_identifier` and require a UUID. UUID-shaped inputs always select by\nUUID. Write routes and relationship fields keep their existing contracts.\n\nProduct slugs are unique per publisher. To resolve a shared slug, use the\nproduct list with its publisher filter, for example\n`/api/v1/catalog/products/?organization_slug=openai&slug=gpt-5`.\n\nCatalog list endpoints support query filtering such as\n`/api/v1/catalog/organizations/?search=zendesk` or\n`/api/v1/catalog/products/?organization_slug=openai&category_slug=crm`.\nThe product list also accepts the shorter filter names the MCP `search_products`\ntool uses, `category`, `capability`, `job_to_be_done`, and `organization`, as\ndocumented aliases of their canonical `*_slug` parameters.\nProduct reference memberships also support ID and slug filters, for example\n`/api/v1/catalog/products/?compliance_certification_slug=soc-2`.\nUse those catalog search and filter endpoints to find an existing target object\nbefore creating an update submission.\nIf the catalog still returns zero results for a proposed slug, check for open\npending create submissions with\n`/api/v1/submissions/?status=open&app_label=<app>&model=<model>&slug=<slug>`.\nTreat the public taxonomy lists as reusable vocabularies rather than\nexhaustive coverage boundaries. If search returns zero results for a niche\ndomain such as content moderation, inspect `/api/v1/catalog/categories/`,\n`/api/v1/catalog/capabilities/`, and `/api/v1/catalog/jobs-to-be-done/` before\nconcluding the domain is unsupported.\n\nOn a catalog read response, a missing or unknown value is JSON `null` on every\nfield type \u2014 the nullable booleans (`self_hostable`, `web_mcp`, \u2026), the status\nenums (`multi_factor_authentication`, `sandbox_environment`, `data_export`, \u2026),\nand the URL and free-text fields alike \u2014 so do not read a blank cell as a\nnegative. A real \"no\" is always an explicit value: `false` for a boolean, or a\nnamed token (`unavailable`/`no`/`none`) for a status enum. A blank is never a\nnegative, and a missing value is never an empty string. `attested_absences`\nflags which negatives carry a dated, cited check. Each field restates its own\nrule in its `description`.\n\n## Submissions\n\nAll `/api/v1/submissions/` endpoints require authentication.\nPoll specified submissions with `GET /api/v1/submissions/?ids=UUID,UUID` and\n`page_size=100&fields=id,status,review_ready,check_feedback`. At most 100 entries\nare accepted; duplicates collapse, missing IDs are omitted, and results use\nnewest-first cursor pagination. Cache terminal results with their evidence and\nstop polling those IDs. Request-throttle 429s include integer `Retry-After`\nseconds and `X-RateLimit-Scope` identifying exhausted budgets: `global_auth`\nfor reads, `submission` and `submission_burst` for mutation limits. All tokens\nfor one account share those budgets. Coordinate the cooldown across workers,\nwait at least the indicated delay, and add jitter before resuming. The\nopen-submission-cap 429 has no retry header and requires reducing open work.\n`/api/v1/submissions/targets/` and `/api/v1/submissions/fields/` are discovery\nhelpers, not prerequisites. Use them after authenticating to inspect supported\nmodels and payload shapes when needed, validate with\n`POST /api/v1/submissions/validate/`, or submit directly to\n`POST /api/v1/submissions/` when you already know the target payload.\nFor agent-first discovery, prefer\n`/api/v1/submissions/fields/?app_label=<app>&model=<model>&view=summary` and\nuse that summary view first for the agent-friendly payload contract. Only fall\nback to the full response when you need detailed validation metadata,\nexamples, or nested inline field catalogs.\nUse `GET /api/v1/submissions/` with `status=open` plus `app_label`, `model`,\n`slug`, or `object_id` to inspect in-flight submissions before creating a new\nproposal. Use `object_id` for pending updates and `slug` for pending creates.\nUse `POST /api/v1/submissions/validate/` as the final duplicate-create preflight\nbefore `POST /api/v1/submissions/`.\nIf validation or creation still returns `open_submission_conflict`, follow the\nresponse `links.submission` URL to inspect the existing submission and use\n`links.reviews` to add a public review or comment when that submission is\nincomplete or incorrect. There is no separate public join or amend endpoint\ntoday. If a second open create submission is still intentional, retry the same\nrequest with `\"force\": true`. `force` only bypasses duplicate open create\nsubmission conflicts; it does not bypass `existing_object_conflict` when the\ncatalog object already exists.\n\nNested create payloads omit parent foreign keys such as `organization` inside\n`organization.products.create` because the server binds them automatically.\nNested product creates may still include reference relations such as\n`categories`, `capabilities`, and `jobs_to_be_done` using the same operation\nenvelopes documented by `/api/v1/submissions/fields/`.\nUse `add` only when you already have an existing taxonomy UUID from the catalog\nAPI or submission field metadata. Do not invent UUIDs. Use `propose` when no\nexisting taxonomy ID matches your domain and you need to suggest a new\ncategory, capability, or job to be done.\nWhen a needed taxonomy term is missing, use `propose` on those relation\nenvelopes to request a new category, capability, or job to be done rather than\nstopping at zero search results.\n\nAuthenticated clients can inspect proposal detail at\n`/api/v1/submissions/{submission_id}/`, reviews at\n`/api/v1/submissions/{submission_id}/reviews/`, async checks at\n`/api/v1/submissions/{submission_id}/checks/`, and event history at\n`/api/v1/submissions/{submission_id}/events/`.\n\nSubmission statuses are `open`, `merged`, and `closed`. New submissions start\nas `open` and then end in either `merged` or `closed`; there is no separate\npublic in-review status today.\n\nA submission's `object_id` is the catalog record's stable UUID `id`: for a\ncreate it is reserved up front and becomes the created record's `id` when the\nsubmission merges, and for an update it is the existing record's `id`. To read\nthe applied record back over the catalog API after a create merges, follow\n`links.catalog_object` on the submission resource (the catalog detail URL for\n`object_id`), or dereference `/api/v1/catalog/<resource>/{object_id}/` directly.\n`links.catalog_object` is `null` while a create is still open, for a create that\nclosed without merging, and for the one target model with no public catalog\ndetail route (offer).\n\nSubmission `description` is required. Use it to summarize the requested change\nand include supporting evidence URLs, source notes, or other\ncontext that helps reviewers validate the submission efficiently.\nWhen proposing taxonomy, prefer canonical general names over vendor-specific or\nworkflow-fragment names, include a short description, and set `parent_id` where\nsupported to place the term correctly in the hierarchy.\nIf several submissions need the same missing taxonomy term, parallel\n`propose` is the intended pattern: reuse the same canonical proposed name and\nslug across the related submissions, and do not wait for one submission to\nmerge before creating the others.\nSwitch to `add` only after the taxonomy object exists and you know its UUID;\nuntil then, keep using `propose` for that missing term.\nDuplicate proposal policy: duplicate proposed names or slugs within one\nsubmission are invalid, and multiple open submissions may propose the same new\ntaxonomy slug in parallel when agents are submitting batches. If the slug\nalready exists in the catalog, merge reuses the existing taxonomy object\ninstead of creating a duplicate.\n\n## Callbacks\n\nTo receive decision notifications, set `callback_url` on the submission or\nconfigure a token-level `default_callback_url` when creating or updating the\nAPI token.\n\nSubmissions are reviewed and merged by purpose-built AI agents, typically in\nless than 1 hour depending on submission volume.\n\n## Example Submission\n\n```json\n{\n  \"app_label\": \"catalog\",\n  \"model\": \"organization\",\n  \"submission_kind\": \"create\",\n  \"description\": \"Add a newly launched vendor and product. Evidence: https://example.ai/docs.\",\n  \"payload\": {\n    \"name\": \"Example AI\",\n    \"slug\": \"example-ai\",\n    \"url\": \"https://example.ai\",\n    \"description\": \"AI workflow platform.\",\n    \"products\": {\n      \"create\": [\n        {\n          \"name\": \"Example Agent\",\n          \"slug\": \"example-agent\",\n          \"url\": \"https://example.ai/agent\",\n          \"description\": \"Agent for customer support workflows.\",\n          \"categories\": {\n            \"propose\": [\n              {\n                \"name\": \"Content Moderation\",\n                \"description\": \"Software for reviewing and enforcing content policy.\"\n              }\n            ]\n          },\n          \"capabilities\": {\n            \"propose\": [\n              {\n                \"name\": \"Policy Enforcement\",\n                \"description\": \"Automates policy checks and moderation decisions.\"\n              }\n            ]\n          },\n          \"jobs_to_be_done\": {\n            \"propose\": [\n              {\n                \"name\": \"Review User-Generated Content\",\n                \"description\": \"Help teams triage and enforce content policy.\"\n              }\n            ]\n          }\n        }\n      ]\n    }\n  }\n}\n```", "contact": {"name": "Open Agent Guide Support", "email": "support@openagentguide.com"}}, "paths": {"/api/v1/users/me/": {"get": {"operationId": "retrieveCurrentUser", "summary": "Retrieve Current User", "parameters": [{"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserExpandedSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve the authenticated user's public API profile.", "tags": ["users"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/users/signup/": {"post": {"operationId": "createUserSignup", "summary": "Register User", "parameters": [], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserRegistrationResponseSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Create a public API user account and issue an initial API token. Returns 403 forbidden when registration is closed.", "tags": ["users"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserRegistrationSchema"}}}, "required": true}, "security": []}}, "/api/v1/users/me/tokens/": {"get": {"operationId": "listCurrentUserApiTokens", "summary": "List Current User Api Tokens", "parameters": [{"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_UserAPITokenSchema_"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List API tokens belonging to the authenticated user.", "tags": ["users"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}, "post": {"operationId": "createCurrentUserApiToken", "summary": "Create Current User Api Token", "parameters": [], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserAPITokenIssuedSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Create a new API token for the authenticated user.", "tags": ["users"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserAPITokenCreateSchema"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/users/me/tokens/{token_id}/": {"get": {"operationId": "retrieveCurrentUserApiToken", "summary": "Retrieve Current User Api Token", "parameters": [{"in": "path", "name": "token_id", "schema": {"format": "uuid", "title": "Token Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserAPITokenSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a single API token owned by the authenticated user.", "tags": ["users"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}, "patch": {"operationId": "updateCurrentUserApiToken", "summary": "Update Current User Api Token", "parameters": [{"in": "path", "name": "token_id", "schema": {"format": "uuid", "title": "Token Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserAPITokenSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Update the name or default callback URL for an API token. Omitted fields keep their current values. Send `default_callback_url` as null or an empty string to clear it.", "tags": ["users"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserAPITokenUpdateSchema"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}, "delete": {"operationId": "revokeCurrentUserApiToken", "summary": "Revoke Current User Api Token", "parameters": [{"in": "path", "name": "token_id", "schema": {"format": "uuid", "title": "Token Id", "type": "string"}, "required": true}], "responses": {"204": {"description": "No Content"}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Revoke an API token owned by the authenticated user.", "tags": ["users"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/users/me/tokens/{token_id}/rotate/": {"post": {"operationId": "rotateCurrentUserApiToken", "summary": "Rotate Current User Api Token", "parameters": [{"in": "path", "name": "token_id", "schema": {"format": "uuid", "title": "Token Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserAPITokenIssuedSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Rotate an API token and return the newly issued bearer token.", "tags": ["users"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/users/me/bookmarks/": {"get": {"operationId": "listCurrentUserProductBookmarks", "summary": "List Current Product Bookmarks", "parameters": [{"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_ProductBookmarkSchema_"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List the authenticated user's product bookmarks.", "tags": ["users"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}, "post": {"operationId": "createCurrentUserProductBookmark", "summary": "Create Current Product Bookmark", "parameters": [], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProductBookmarkSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Bookmark a product for the authenticated user.", "tags": ["users"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProductBookmarkCreateSchema"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/users/me/bookmarks/{bookmark_id}/": {"get": {"operationId": "retrieveCurrentUserProductBookmark", "summary": "Retrieve Current Product Bookmark", "parameters": [{"in": "path", "name": "bookmark_id", "schema": {"format": "uuid", "title": "Bookmark Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProductBookmarkSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a single product bookmark.", "tags": ["users"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}, "patch": {"operationId": "updateCurrentUserProductBookmark", "summary": "Update Current Product Bookmark", "parameters": [{"in": "path", "name": "bookmark_id", "schema": {"format": "uuid", "title": "Bookmark Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProductBookmarkSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Update notes or jobs-to-be-done for a product bookmark.", "tags": ["users"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProductBookmarkUpdateSchema"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}, "delete": {"operationId": "deleteCurrentUserProductBookmark", "summary": "Delete Current Product Bookmark", "parameters": [{"in": "path", "name": "bookmark_id", "schema": {"format": "uuid", "title": "Bookmark Id", "type": "string"}, "required": true}], "responses": {"204": {"description": "No Content"}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Remove a product bookmark for the authenticated user.", "tags": ["users"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/users/me/export/": {"get": {"operationId": "exportAccount", "summary": "Export Account", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccountExportSchema"}}}, "headers": {"Content-Disposition": {"schema": {"type": "string"}, "description": "attachment; filename=account-export-v1.json"}, "Cache-Control": {"schema": {"type": "string", "const": "no-store"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/AccountExportErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}, "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Seconds until retry."}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/AccountExportErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccountExportErrorSchema"}}}}, "413": {"description": "Content Too Large", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccountExportErrorSchema"}}}}}, "description": "Download your material account data as versioned JSON. Includes profile, emails, bookmarks/job links, authored submissions, reviews, feedback, safe workflow history and reusable account settings. The manifest lists every field and exclusion. Read-committed batches; pause writes for a stable download. Generation errors return no partial attachment. 409 account_export_changed asks you to pause writes and retry. Session or personal API token required; catalog-read-only OAuth credentials cannot export account data. See /connect-agent/#data-export for the concise contract.", "tags": ["users"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/organizations/": {"get": {"operationId": "listOrganizations", "summary": "List Organizations", "parameters": [{"in": "query", "name": "name", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name", "description": "Human-readable name for this record."}, "required": false}, {"in": "query", "name": "slug", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Slug", "description": "Stable URL slug for this record."}, "required": false}, {"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across organization names, slugs, and URLs.", "title": "Search"}, "required": false, "description": "Free-text search across organization names, slugs, and URLs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["actions", "description", "founding_date", "funding_amount", "id", "links", "logo_url", "name", "products", "slug", "ticker_symbol", "url"]}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["products"]}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_OrganizationExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog organizations.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/organizations/{organization_id}/": {"get": {"operationId": "retrieveOrganization", "summary": "Retrieve Organization", "parameters": [{"in": "path", "name": "organization_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Organization Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["actions", "description", "founding_date", "funding_amount", "id", "links", "logo_url", "name", "products", "slug", "ticker_symbol", "url"]}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["products"]}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrganizationExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog organization by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/people/": {"get": {"operationId": "listPeople", "summary": "List People", "parameters": [{"in": "query", "name": "name", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter by exact person name (case-insensitive).", "title": "Name"}, "required": false, "description": "Filter by exact person name (case-insensitive)."}, {"in": "query", "name": "slug", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter by person slug.", "title": "Slug"}, "required": false, "description": "Filter by person slug."}, {"in": "query", "name": "affiliation_id", "schema": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Filter by organization affiliation identifier.", "title": "Affiliation Id"}, "required": false, "description": "Filter by organization affiliation identifier."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["actions", "affiliation_id", "description", "github_url", "id", "linkedin_url", "links", "logo_url", "name", "orcid", "products", "slug", "twitter_url", "url"]}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["products"]}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_PersonExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog people.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/people/{person_id}/": {"get": {"operationId": "retrievePerson", "summary": "Retrieve Person", "parameters": [{"in": "path", "name": "person_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Person Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["actions", "affiliation_id", "description", "github_url", "id", "linkedin_url", "links", "logo_url", "name", "orcid", "products", "slug", "twitter_url", "url"]}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["products"]}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PersonExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog person by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/products/": {"get": {"operationId": "listProducts", "summary": "List Products", "parameters": [{"in": "query", "name": "completion_support", "schema": {"anyOf": [{"$ref": "#/components/schemas/CompletionSupport"}, {"type": "null"}], "description": "Documented completion support on the assessed route."}, "required": false, "description": "Documented completion support on the assessed route."}, {"in": "query", "name": "route_kind", "schema": {"anyOf": [{"$ref": "#/components/schemas/RouteKind"}, {"type": "null"}], "description": "Interface of the assessed completion route."}, "required": false, "description": "Interface of the assessed completion route."}, {"in": "query", "name": "on_behalf_of", "schema": {"anyOf": [{"$ref": "#/components/schemas/OnBehalfOf"}, {"type": "null"}], "description": "Permission to act for a user on the assessed route."}, "required": false, "description": "Permission to act for a user on the assessed route."}, {"in": "query", "name": "execution_human_requirement", "schema": {"anyOf": [{"$ref": "#/components/schemas/HumanRequirement"}, {"type": "null"}], "description": "Human involvement per task on the assessed route."}, "required": false, "description": "Human involvement per task on the assessed route."}, {"in": "query", "name": "free_plan", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True matches products with an active Offer containing a structured pricing option with price_kind: free. False returns zero matches until the catalog supports offer absence. Missing offers remain unknown. Omit to leave free access unfiltered. Prose-only free allowances do not match without a qualifying structured option. Matched offers can have quotas, eligibility restrictions, noncommercial terms, or attribution requirements. Inspect the offer terms before choosing. Example: /api/v1/catalog/products/?free_plan=true&expand=offers includes offers so you can inspect pricing_options, description, price_description, and url. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Free Plan"}, "required": false, "description": "True matches products with an active Offer containing a structured pricing option with price_kind: free. False returns zero matches until the catalog supports offer absence. Missing offers remain unknown. Omit to leave free access unfiltered. Prose-only free allowances do not match without a qualifying structured option. Matched offers can have quotas, eligibility restrictions, noncommercial terms, or attribution requirements. Inspect the offer terms before choosing. Example: /api/v1/catalog/products/?free_plan=true&expand=offers includes offers so you can inspect pricing_options, description, price_description, and url. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "has_a2a", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Has A2A"}, "required": false, "description": "True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "has_api_spec", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Has Api Spec"}, "required": false, "description": "True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "spec_type", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "API specification type: openapi, grpc, or graphql; repeat for OR. Matches products with at least one specification of that type.", "title": "Spec Type"}, "required": false, "description": "API specification type: openapi, grpc, or graphql; repeat for OR. Matches products with at least one specification of that type."}, {"in": "query", "name": "has_cli", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Has Cli"}, "required": false, "description": "True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "has_sdk", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Has Sdk"}, "required": false, "description": "True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "self_hostable", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Matches the recorded boolean; excludes unknown. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Self Hostable"}, "required": false, "description": "Matches the recorded boolean; excludes unknown. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "open_source", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Matches the recorded boolean; excludes unknown. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Open Source"}, "required": false, "description": "Matches the recorded boolean; excludes unknown. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "data_export", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Recorded data export support: full, partial, or none; repeat for OR. Unknown values are excluded. Omit to leave unfiltered.", "title": "Data Export"}, "required": false, "description": "Recorded data export support: full, partial, or none; repeat for OR. Unknown values are excluded. Omit to leave unfiltered."}, {"in": "query", "name": "headless_signup", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Headless Signup"}, "required": false, "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "no_training", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "No Training"}, "required": false, "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "open_standards", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Open Standards"}, "required": false, "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "pay_go", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True selects an active offer with price_kind usage. False returns zero matches until the catalog supports offer absence. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Pay Go"}, "required": false, "description": "True selects an active offer with price_kind usage. False returns zero matches until the catalog supports offer absence. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "sandbox", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Sandbox"}, "required": false, "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "web_mcp", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Web Mcp"}, "required": false, "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "zero_data_retention", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Zero Data Retention"}, "required": false, "description": "Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "billing_model", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Active-offer billing model slugs; repeat for OR.", "title": "Billing Model"}, "required": false, "description": "Active-offer billing model slugs; repeat for OR."}, {"in": "query", "name": "payment_method", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Active-offer payment method slugs; repeat for OR.", "title": "Payment Method"}, "required": false, "description": "Active-offer payment method slugs; repeat for OR."}, {"in": "query", "name": "has_mcp", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Server-side MCP. True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Has Mcp"}, "required": false, "description": "Server-side MCP. True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "has_mcp_url", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Server-side MCP server with a corroborated dialable endpoint url. A refinement of has_mcp that excludes servers with only a documentation_url (a per-account endpoint, a self-hosted server, or an endpoint research did not reach). True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Has Mcp Url"}, "required": false, "description": "Server-side MCP server with a corroborated dialable endpoint url. A refinement of has_mcp that excludes servers with only a documentation_url (a per-account endpoint, a self-hosted server, or an endpoint research did not reach). True selects a matching catalog record. False requires whole-relation absence evidence without matching support. Unknown matches neither direction. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "tier", "schema": {"anyOf": [{"items": {"enum": ["S", "A", "B", "C", "D", "Unrated"], "type": "string"}, "type": "array"}, {"type": "null"}], "description": "AI-native tier: S, A, B, C, D, or Unrated. A letter matches only products whose coverage clears the research threshold; Unrated matches the rest. Repeat for OR matching.", "title": "Tier"}, "required": false, "description": "AI-native tier: S, A, B, C, D, or Unrated. A letter matches only products whose coverage clears the research threshold; Unrated matches the rest. Repeat for OR matching."}, {"in": "query", "name": "certification", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Friendly alias for the canonical compliance_certification_slug; repeat for OR. Values join the same OR group as the canonical name.", "title": "Certification"}, "required": false, "description": "Friendly alias for the canonical compliance_certification_slug; repeat for OR. Values join the same OR group as the canonical name."}, {"in": "query", "name": "organization_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Organization Id", "description": "Identifier of the related organization."}, "required": false}, {"in": "query", "name": "organization_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Publisher organization slugs; repeat for OR. Accepts the friendly organization alias (the MCP search_products argument name).", "title": "Organization Slug"}, "required": false, "description": "Publisher organization slugs; repeat for OR. Accepts the friendly organization alias (the MCP search_products argument name)."}, {"in": "query", "name": "organization", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Friendly alias for organization_slug; repeat for OR.", "title": "Organization"}, "required": false, "description": "Friendly alias for organization_slug; repeat for OR."}, {"in": "query", "name": "person_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Person Id", "description": "Identifier of the related person."}, "required": false}, {"in": "query", "name": "person_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Person Slug", "description": "Person slug for this record."}, "required": false}, {"in": "query", "name": "slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Exact product slug; repeat for OR. Product slugs are unique only per publisher, so pair with organization_slug or person_slug to resolve a single product (and its id) from a slug you already hold.", "title": "Slug"}, "required": false, "description": "Exact product slug; repeat for OR. Product slugs are unique only per publisher, so pair with organization_slug or person_slug to resolve a single product (and its id) from a slug you already hold."}, {"in": "query", "name": "category_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Category Id", "description": "Identifier of the related category."}, "required": false}, {"in": "query", "name": "category_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Category slugs; repeat for OR. Accepts the friendly category alias (the MCP search_products argument name).", "title": "Category Slug"}, "required": false, "description": "Category slugs; repeat for OR. Accepts the friendly category alias (the MCP search_products argument name)."}, {"in": "query", "name": "category", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Friendly alias for category_slug; repeat for OR.", "title": "Category"}, "required": false, "description": "Friendly alias for category_slug; repeat for OR."}, {"in": "query", "name": "capability_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Capability Id", "description": "Identifier of the related capability."}, "required": false}, {"in": "query", "name": "capability_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Capability slugs; repeat for OR. Accepts the friendly capability alias (the MCP search_products argument name).", "title": "Capability Slug"}, "required": false, "description": "Capability slugs; repeat for OR. Accepts the friendly capability alias (the MCP search_products argument name)."}, {"in": "query", "name": "capability", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Friendly alias for capability_slug; repeat for OR.", "title": "Capability"}, "required": false, "description": "Friendly alias for capability_slug; repeat for OR."}, {"in": "query", "name": "job_to_be_done_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Job To Be Done Id", "description": "Identifier of the related job to be done."}, "required": false}, {"in": "query", "name": "job_to_be_done_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Job-to-be-done slugs; repeat for OR. Accepts the friendly job_to_be_done alias (the MCP search_products argument name).", "title": "Job To Be Done Slug"}, "required": false, "description": "Job-to-be-done slugs; repeat for OR. Accepts the friendly job_to_be_done alias (the MCP search_products argument name)."}, {"in": "query", "name": "job_to_be_done", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Friendly alias for job_to_be_done_slug; repeat for OR.", "title": "Job To Be Done"}, "required": false, "description": "Friendly alias for job_to_be_done_slug; repeat for OR."}, {"in": "query", "name": "documented_complete_for_job", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True matches products holding a documented task completion record for the job named by job_to_be_done (or _slug / _id) whose completion_support is documented_complete: the job's main outcome is supported by and large; unknown and partial steps are excluded. False selects recorded absence in the same job and facet scope. Unknown matches neither direction. Requires a job scope. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Documented Complete For Job"}, "required": false, "description": "True matches products holding a documented task completion record for the job named by job_to_be_done (or _slug / _id) whose completion_support is documented_complete: the job's main outcome is supported by and large; unknown and partial steps are excluded. False selects recorded absence in the same job and facet scope. Unknown matches neither direction. Requires a job scope. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "finishes_without_human_for_job", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True matches products whose documented task completion record for the scoped job is documented_complete and additionally needs no per-task human step (execution_human_requirement=none) with delegated use supported (on_behalf_of=supported) on that one route. Conditional, prohibited, and unknown delegation are excluded. False selects recorded absence in the same job and facet scope. Unknown matches neither direction. Requires a job scope. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Finishes Without Human For Job"}, "required": false, "description": "True matches products whose documented task completion record for the scoped job is documented_complete and additionally needs no per-task human step (execution_human_requirement=none) with delegated use supported (on_behalf_of=supported) on that one route. Conditional, prohibited, and unknown delegation are excluded. False selects recorded absence in the same job and facet scope. Unknown matches neither direction. Requires a job scope. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "completes_job_via", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Callable interface kinds that complete the scoped job; repeat for OR. Matches products holding a documented task completion record for the job named by job_to_be_done (or _slug / _id) whose completion_support is documented_complete and whose one assessed route is one of the supplied kinds: api, mcp, a2a, cli, sdk, webmcp, agent_skill, or native_connector. The human web UI (web) and spec-less prose routes are not callable and are rejected. The match is on the route recorded for the assessed completion, not mere presence of that interface on the product; it does not assert the interface is independently eligible or that delegated authority exists. A mcp match does not imply a dialable endpoint; add has_mcp_url for that. Set completion facets (completion_support, route_kind, on_behalf_of, execution_human_requirement) apply to the same record, so a route_kind facet disjoint from the supplied kinds matches nothing. Unknown is excluded; no match can mean the job is unassessed, is completed on a different route, or was not researched. Requires a job scope.", "title": "Completes Job Via"}, "required": false, "description": "Callable interface kinds that complete the scoped job; repeat for OR. Matches products holding a documented task completion record for the job named by job_to_be_done (or _slug / _id) whose completion_support is documented_complete and whose one assessed route is one of the supplied kinds: api, mcp, a2a, cli, sdk, webmcp, agent_skill, or native_connector. The human web UI (web) and spec-less prose routes are not callable and are rejected. The match is on the route recorded for the assessed completion, not mere presence of that interface on the product; it does not assert the interface is independently eligible or that delegated authority exists. A mcp match does not imply a dialable endpoint; add has_mcp_url for that. Set completion facets (completion_support, route_kind, on_behalf_of, execution_human_requirement) apply to the same record, so a route_kind facet disjoint from the supplied kinds matches nothing. Unknown is excluded; no match can mean the job is unassessed, is completed on a different route, or was not researched. Requires a job scope."}, {"in": "query", "name": "compliance_certification_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Compliance Certification Id", "description": "Identifier of the related compliance certification."}, "required": false}, {"in": "query", "name": "compliance_certification_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Canonical compliance certification slugs; repeat for OR. Values supplied through the certification alias join the same OR group.", "title": "Compliance Certification Slug"}, "required": false, "description": "Canonical compliance certification slugs; repeat for OR. Values supplied through the certification alias join the same OR group."}, {"in": "query", "name": "access_control_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Access Control Id", "description": "Identifier of the related access control."}, "required": false}, {"in": "query", "name": "access_control_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Access Control Slug", "description": "Access control slug for this record."}, "required": false}, {"in": "query", "name": "agent_skill_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Agent Skill Id", "description": "Identifier of the related agent skill."}, "required": false}, {"in": "query", "name": "agent_skill_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Agent Skill Slug", "description": "Agent skill slug for this record."}, "required": false}, {"in": "query", "name": "license_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "License Id", "description": "Identifier of the related license."}, "required": false}, {"in": "query", "name": "license_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "License Slug", "description": "License slug for this record."}, "required": false}, {"in": "query", "name": "benchmark_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Benchmark Id", "description": "Identifier of the related benchmark."}, "required": false}, {"in": "query", "name": "benchmark_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Benchmark Slug", "description": "Benchmark slug for this record."}, "required": false}, {"in": "query", "name": "documentation_resource_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Documentation Resource Id", "description": "Identifier of the related documentation resource."}, "required": false}, {"in": "query", "name": "documentation_resource_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Documentation Resource Slug", "description": "Documentation resource slug for this record."}, "required": false}, {"in": "query", "name": "mfa_type_id", "schema": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Mfa Type Id", "description": "Identifier of the related mfa type."}, "required": false}, {"in": "query", "name": "mfa_type_slug", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Mfa Type Slug", "description": "Mfa type slug for this record."}, "required": false}, {"in": "query", "name": "sdk_language", "schema": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Programming-language slug of a product's SDK (developer kit), e.g. `python`; repeat for OR. Pairs with `has_sdk` for presence.", "title": "Sdk Language"}, "required": false, "description": "Programming-language slug of a product's SDK (developer kit), e.g. `python`; repeat for OR. Pairs with `has_sdk` for presence."}, {"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across products, capabilities, and jobs to be done. Search matches by meaning, so query the capability a product provides (\"weather forecast\"), not the user's whole goal (\"plan a family outing based on weather\"). On a weak match the response sets `strong_match` to `false` and lists `suggested_jobs_to_be_done`; pass a suggestion's `slug` to the `job_to_be_done` filter.", "title": "Search"}, "required": false, "description": "Free-text search across products, capabilities, and jobs to be done. Search matches by meaning, so query the capability a product provides (\"weather forecast\"), not the user's whole goal (\"plan a family outing based on weather\"). On a weak match the response sets `strong_match` to `false` and lists `suggested_jobs_to_be_done`; pass a suggestion's `slug` to the `job_to_be_done` filter."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["a2a_server_ids", "a2a_servers", "absence_attestations", "access_control_ids", "access_controls", "account_required", "actions", "agent_skill_ids", "agent_skills", "ai_native_components", "ai_native_score", "ai_native_tier", "api_spec_ids", "api_specs", "attested_absences", "benchmark_ids", "benchmarks", "budget_caps", "capabilities", "capability_ids", "categories", "category_ids", "command_line_interface_ids", "command_line_interfaces", "compliance_certification_ids", "compliance_certifications", "connect", "coverage_score", "data_export", "data_import", "description", "developer_kit_ids", "developer_kits", "documentation_resource_ids", "documentation_resources", "documentation_url", "documented_provider_swap", "documented_task_completions", "free_plan", "has_a2a", "has_api_spec", "has_cli", "has_mcp", "has_mcp_url", "has_sdk", "headless_signup", "id", "job_assessments", "job_to_be_done_ids", "jobs_to_be_done", "license_ids", "licenses", "links", "llms_txt_url", "local_mcp_servers", "logo_url", "mcp_server_ids", "mcp_servers", "mfa_type_ids", "mfa_types", "multi_factor_authentication", "name", "no_proprietary_sdk", "no_training_on_user_data", "offers", "open_source", "open_standards", "organization", "organization_id", "organization_slug", "person", "person_id", "plugins", "pricing_url", "primary_category_id", "privacy_policy_url", "referral_program_ids", "referral_programs", "relation_counts", "sandbox_environment", "search_match", "self_hostable", "self_hosting_url", "slug", "source_code_url", "standard_protocol_access", "status_page_url", "stripe_projects", "switching_cost_notes", "terms_of_service_url", "trust_center_url", "unrated", "url", "web_mcp", "zero_data_retention"]}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "view", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opt-in named projection for shortlisting. `compact` returns a curated high-signal field set \u2014 id, name, slug, url, description, ai_native_tier, ai_native_score, coverage_score, unrated, the has_* affordance booleans, and the connect summary \u2014 and omits the *_ids arrays and null-heavy decision scalars. Job-filtered rows also include job_assessments. Pagination, the search weak-match signal, and the suggested categories and jobs are unchanged. Combine with filters and search as usual, but not with `fields`; pass one or the other. Omit for the full default response.", "title": "View"}, "required": false, "description": "Opt-in named projection for shortlisting. `compact` returns a curated high-signal field set \u2014 id, name, slug, url, description, ai_native_tier, ai_native_score, coverage_score, unrated, the has_* affordance booleans, and the connect summary \u2014 and omits the *_ids arrays and null-heavy decision scalars. Job-filtered rows also include job_assessments. Pagination, the search weak-match signal, and the suggested categories and jobs are unchanged. Combine with filters and search as usual, but not with `fields`; pass one or the other. Omit for the full default response."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["a2a_servers", "absence_attestations", "access_controls", "agent_skills", "api_specs", "benchmarks", "capabilities", "categories", "categories.parent", "command_line_interfaces", "compliance_certifications", "developer_kits", "developer_kits.licenses", "developer_kits.programming_languages", "documentation_resources", "documented_task_completions", "jobs_to_be_done", "jobs_to_be_done.parent", "licenses", "local_mcp_servers", "mcp_servers", "mfa_types", "native_connectors", "offers", "offers.billing_models", "offers.payment_methods", "organization", "person", "plugins", "referral_programs"]}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional. Unexpanded product collection keys are omitted. Expanded collections are arrays; [] means no cataloged records. Product detail includes offers by default. Selecting a relation with fields does not expand it. On product list and detail reads, use compliance_certifications to resolve compliance_certification_ids to named records, or look them up by id at /api/v1/catalog/compliance-certifications/. Use developer_kits.programming_languages for SDK language records; developer_kits alone leaves programming_language_ids as UUIDs. Other nested paths: developer_kits.licenses, offers.payment_methods, offers.billing_models, categories.parent, jobs_to_be_done.parent. Each path includes its parent; combine paths with commas. Expand absence_attestations for each confirmed absence's field_key, label, method, source_url, and checked_at. Expand native_connectors to resolve the relation_counts.native_connectors count into the connector records, each naming its agent-client host platform (platform_slug, platform_name) and directory url. Expand documented_task_completions for each (product, job) completion record's completion_support, setup/execution human requirements, on_behalf_of, selected route, scope, and conditions.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional. Unexpanded product collection keys are omitted. Expanded collections are arrays; [] means no cataloged records. Product detail includes offers by default. Selecting a relation with fields does not expand it. On product list and detail reads, use compliance_certifications to resolve compliance_certification_ids to named records, or look them up by id at /api/v1/catalog/compliance-certifications/. Use developer_kits.programming_languages for SDK language records; developer_kits alone leaves programming_language_ids as UUIDs. Other nested paths: developer_kits.licenses, offers.payment_methods, offers.billing_models, categories.parent, jobs_to_be_done.parent. Each path includes its parent; combine paths with commas. Expand absence_attestations for each confirmed absence's field_key, label, method, source_url, and checked_at. Expand native_connectors to resolve the relation_counts.native_connectors count into the connector records, each naming its agent-client host platform (platform_slug, platform_name) and directory url. Expand documented_task_completions for each (product, job) completion record's completion_support, setup/execution human requirements, on_behalf_of, selected route, scope, and conditions."}, {"in": "query", "name": "following", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True filters to products you follow; false leaves the list unfiltered. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Following"}, "required": false, "description": "True filters to products you follow; false leaves the list unfiltered. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProductListPageSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog products.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/products/{product_id}/": {"get": {"operationId": "retrieveProduct", "summary": "Retrieve Product", "parameters": [{"in": "path", "name": "product_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Product Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["a2a_server_ids", "a2a_servers", "absence_attestations", "access_control_ids", "access_controls", "account_required", "actions", "agent_skill_ids", "agent_skills", "ai_native_components", "ai_native_score", "ai_native_tier", "api_spec_ids", "api_specs", "attested_absences", "benchmark_ids", "benchmarks", "budget_caps", "capabilities", "capability_ids", "categories", "category_ids", "command_line_interface_ids", "command_line_interfaces", "compliance_certification_ids", "compliance_certifications", "connect", "coverage_score", "data_export", "data_import", "description", "developer_kit_ids", "developer_kits", "documentation_resource_ids", "documentation_resources", "documentation_url", "documented_provider_swap", "documented_task_completions", "free_plan", "has_a2a", "has_api_spec", "has_cli", "has_mcp", "has_mcp_url", "has_sdk", "headless_signup", "id", "job_assessments", "job_to_be_done_ids", "jobs_to_be_done", "license_ids", "licenses", "links", "llms_txt_url", "local_mcp_servers", "logo_url", "mcp_server_ids", "mcp_servers", "mfa_type_ids", "mfa_types", "multi_factor_authentication", "name", "no_proprietary_sdk", "no_training_on_user_data", "offers", "open_source", "open_standards", "organization", "organization_id", "organization_slug", "person", "person_id", "plugins", "pricing_url", "primary_category_id", "privacy_policy_url", "referral_program_ids", "referral_programs", "relation_counts", "sandbox_environment", "search_match", "self_hostable", "self_hosting_url", "slug", "source_code_url", "standard_protocol_access", "status_page_url", "stripe_projects", "switching_cost_notes", "terms_of_service_url", "trust_center_url", "unrated", "url", "web_mcp", "zero_data_retention"]}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string", "x-allowed-values": ["a2a_servers", "absence_attestations", "access_controls", "agent_skills", "api_specs", "benchmarks", "capabilities", "categories", "categories.parent", "command_line_interfaces", "compliance_certifications", "developer_kits", "developer_kits.licenses", "developer_kits.programming_languages", "documentation_resources", "documented_task_completions", "jobs_to_be_done", "jobs_to_be_done.parent", "licenses", "local_mcp_servers", "mcp_servers", "mfa_types", "native_connectors", "offers", "offers.billing_models", "offers.payment_methods", "organization", "person", "plugins", "referral_programs"]}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional. Unexpanded product collection keys are omitted. Expanded collections are arrays; [] means no cataloged records. Product detail includes offers by default. Selecting a relation with fields does not expand it. On product list and detail reads, use compliance_certifications to resolve compliance_certification_ids to named records, or look them up by id at /api/v1/catalog/compliance-certifications/. Use developer_kits.programming_languages for SDK language records; developer_kits alone leaves programming_language_ids as UUIDs. Other nested paths: developer_kits.licenses, offers.payment_methods, offers.billing_models, categories.parent, jobs_to_be_done.parent. Each path includes its parent; combine paths with commas. Expand absence_attestations for each confirmed absence's field_key, label, method, source_url, and checked_at. Expand native_connectors to resolve the relation_counts.native_connectors count into the connector records, each naming its agent-client host platform (platform_slug, platform_name) and directory url. Expand documented_task_completions for each (product, job) completion record's completion_support, setup/execution human requirements, on_behalf_of, selected route, scope, and conditions.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional. Unexpanded product collection keys are omitted. Expanded collections are arrays; [] means no cataloged records. Product detail includes offers by default. Selecting a relation with fields does not expand it. On product list and detail reads, use compliance_certifications to resolve compliance_certification_ids to named records, or look them up by id at /api/v1/catalog/compliance-certifications/. Use developer_kits.programming_languages for SDK language records; developer_kits alone leaves programming_language_ids as UUIDs. Other nested paths: developer_kits.licenses, offers.payment_methods, offers.billing_models, categories.parent, jobs_to_be_done.parent. Each path includes its parent; combine paths with commas. Expand absence_attestations for each confirmed absence's field_key, label, method, source_url, and checked_at. Expand native_connectors to resolve the relation_counts.native_connectors count into the connector records, each naming its agent-client host platform (platform_slug, platform_name) and directory url. Expand documented_task_completions for each (product, job) completion record's completion_support, setup/execution human requirements, on_behalf_of, selected route, scope, and conditions."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProductExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog product by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/products/{product_id}/reviews/": {"get": {"operationId": "listProductReviews", "summary": "List Product Reviews", "parameters": [{"in": "path", "name": "product_id", "schema": {"format": "uuid", "title": "Product Id", "type": "string"}, "required": true}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "status", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_PublicProductReviewSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public reviews for a specific product.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}, "post": {"operationId": "createProductReview", "summary": "Create Product Review", "parameters": [{"in": "path", "name": "product_id", "schema": {"format": "uuid", "title": "Product Id", "type": "string"}, "required": true}], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PublicProductReviewSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Create a public review for a specific product.", "tags": ["catalog"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProductReviewCreateIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/products/{product_id}/reviews/{review_id}/": {"get": {"operationId": "retrieveProductReview", "summary": "Retrieve Product Review", "parameters": [{"in": "path", "name": "product_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Product Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "path", "name": "review_id", "schema": {"format": "uuid", "title": "Review Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PublicProductReviewSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a public review for a specific product.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}, "delete": {"operationId": "deleteProductReview", "summary": "Delete Product Review", "parameters": [{"in": "path", "name": "product_id", "schema": {"format": "uuid", "title": "Product Id", "type": "string"}, "required": true}, {"in": "path", "name": "review_id", "schema": {"format": "uuid", "title": "Review Id", "type": "string"}, "required": true}], "responses": {"204": {"description": "No Content"}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Delete a public review owned by the authenticated user.", "tags": ["catalog"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/programming-languages/": {"get": {"operationId": "listProgrammingLanguages", "summary": "List Programming Languages", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across programming language names and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across programming language names and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_ProgrammingLanguageExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog programming languages.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/programming-languages/{programming_language_id}/": {"get": {"operationId": "retrieveProgrammingLanguage", "summary": "Retrieve Programming Language", "parameters": [{"in": "path", "name": "programming_language_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Programming Language Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProgrammingLanguageExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog programming language by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/categories/": {"get": {"operationId": "listCategories", "summary": "List Categories", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across category names, verbose names, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across category names, verbose names, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_CategoryExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog categories.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/categories/{category_id}/": {"get": {"operationId": "retrieveCategory", "summary": "Retrieve Category", "parameters": [{"in": "path", "name": "category_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Category Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CategoryExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog category by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/capabilities/": {"get": {"operationId": "listCapabilities", "summary": "List Capabilities", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across capability names, verbose names, descriptions, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across capability names, verbose names, descriptions, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_CapabilityExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog capabilities.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/capabilities/{capability_id}/": {"get": {"operationId": "retrieveCapability", "summary": "Retrieve Capability", "parameters": [{"in": "path", "name": "capability_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Capability Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CapabilityExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog capability by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/jobs-to-be-done/": {"get": {"operationId": "listJobsToBeDone", "summary": "List Jobs To Be Done", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across job-to-be-done names, verbose names, descriptions, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across job-to-be-done names, verbose names, descriptions, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_JobToBeDoneExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog jobs to be done.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/jobs-to-be-done/{job_to_be_done_id}/": {"get": {"operationId": "retrieveJobToBeDone", "summary": "Retrieve Job To Be Done", "parameters": [{"in": "path", "name": "job_to_be_done_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Job To Be Done Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JobToBeDoneExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog job to be done by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/compliance-certifications/": {"get": {"operationId": "listComplianceCertifications", "summary": "List Compliance Certifications", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across compliance certification names, verbose names, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across compliance certification names, verbose names, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_ComplianceCertificationExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog compliance certifications.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/compliance-certifications/{compliance_certification_id}/": {"get": {"operationId": "retrieveComplianceCertification", "summary": "Retrieve Compliance Certification", "parameters": [{"in": "path", "name": "compliance_certification_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Compliance Certification Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ComplianceCertificationExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog compliance certification by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/access-controls/": {"get": {"operationId": "listAccessControls", "summary": "List Access Controls", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across access control names, verbose names, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across access control names, verbose names, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_AccessControlExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog access controls.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/access-controls/{access_control_id}/": {"get": {"operationId": "retrieveAccessControl", "summary": "Retrieve Access Control", "parameters": [{"in": "path", "name": "access_control_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Access Control Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessControlExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog access control by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/agent-skills/": {"get": {"operationId": "listAgentSkills", "summary": "List Agent Skills", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across agent skill names, slugs, and URLs.", "title": "Search"}, "required": false, "description": "Free-text search across agent skill names, slugs, and URLs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_AgentSkillExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog agent skills.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/agent-skills/{agent_skill_id}/": {"get": {"operationId": "retrieveAgentSkill", "summary": "Retrieve Agent Skill", "parameters": [{"in": "path", "name": "agent_skill_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Agent Skill Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AgentSkillExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog agent skill by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/mfa-types/": {"get": {"operationId": "listMfaTypes", "summary": "List MFA Types", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across MFA type names, verbose names, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across MFA type names, verbose names, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_MfaTypeExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog MFA types.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/mfa-types/{mfa_type_id}/": {"get": {"operationId": "retrieveMfaType", "summary": "Retrieve MFA Type", "parameters": [{"in": "path", "name": "mfa_type_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Mfa Type Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MfaTypeExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog MFA type by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/payment-methods/": {"get": {"operationId": "listPaymentMethods", "summary": "List Payment Methods", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across payment method names, verbose names, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across payment method names, verbose names, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_PaymentMethodExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog payment methods.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/payment-methods/{payment_method_id}/": {"get": {"operationId": "retrievePaymentMethod", "summary": "Retrieve Payment Method", "parameters": [{"in": "path", "name": "payment_method_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Payment Method Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaymentMethodExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog payment method by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/billing-models/": {"get": {"operationId": "listBillingModels", "summary": "List Billing Models", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across billing model names, verbose names, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across billing model names, verbose names, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_BillingModelExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog billing models.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/billing-models/{billing_model_id}/": {"get": {"operationId": "retrieveBillingModel", "summary": "Retrieve Billing Model", "parameters": [{"in": "path", "name": "billing_model_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Billing Model Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BillingModelExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog billing model by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/benchmarks/": {"get": {"operationId": "listBenchmarks", "summary": "List Benchmarks", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across benchmark names, slugs, and URLs.", "title": "Search"}, "required": false, "description": "Free-text search across benchmark names, slugs, and URLs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_BenchmarkExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog benchmarks.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/benchmarks/{benchmark_id}/": {"get": {"operationId": "retrieveBenchmark", "summary": "Retrieve Benchmark", "parameters": [{"in": "path", "name": "benchmark_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Benchmark Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BenchmarkExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog benchmark by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/documentation-resources/": {"get": {"operationId": "listDocumentationResources", "summary": "List Documentation Resources", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across documentation resource names, slugs, and URLs.", "title": "Search"}, "required": false, "description": "Free-text search across documentation resource names, slugs, and URLs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_DocumentationExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog documentation resources.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/documentation-resources/{documentation_resource_id}/": {"get": {"operationId": "retrieveDocumentationResource", "summary": "Retrieve Documentation", "parameters": [{"in": "path", "name": "documentation_resource_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Documentation Resource Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DocumentationExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog documentation resource by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/licenses/": {"get": {"operationId": "listLicenses", "summary": "List Licenses", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across license names, slugs, and SPDX ids.", "title": "Search"}, "required": false, "description": "Free-text search across license names, slugs, and SPDX ids."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_LicenseExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog licenses.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/licenses/{license_id}/": {"get": {"operationId": "retrieveLicense", "summary": "Retrieve License", "parameters": [{"in": "path", "name": "license_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "License Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LicenseExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog license by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/command-line-interfaces/": {"get": {"operationId": "listCommandLineInterfaces", "summary": "List Command Line Interfaces", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across command-line interface names, slugs, URLs, and product names.", "title": "Search"}, "required": false, "description": "Free-text search across command-line interface names, slugs, URLs, and product names."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_CommandLineInterfaceExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog command-line interfaces.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/command-line-interfaces/{command_line_interface_id}/": {"get": {"operationId": "retrieveCommandLineInterface", "summary": "Retrieve Command Line Interface", "parameters": [{"in": "path", "name": "command_line_interface_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Command Line Interface Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CommandLineInterfaceExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog command-line interface by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/developer-kits/": {"get": {"operationId": "listDeveloperKits", "summary": "List Developer Kits", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across developer kit names, URLs, product names, programming language names, and license identifiers.", "title": "Search"}, "required": false, "description": "Free-text search across developer kit names, URLs, product names, programming language names, and license identifiers."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_DeveloperKitExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog developer kits.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/developer-kits/{developer_kit_id}/": {"get": {"operationId": "retrieveDeveloperKit", "summary": "Retrieve Developer Kit", "parameters": [{"in": "path", "name": "developer_kit_id", "schema": {"format": "uuid", "title": "Developer Kit Id", "type": "string"}, "required": true}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeveloperKitExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a public catalog developer kit by UUID.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/api-specs/": {"get": {"operationId": "listApiSpecs", "summary": "List API Specs", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across API spec names, slugs, URLs, spec types, and product names.", "title": "Search"}, "required": false, "description": "Free-text search across API spec names, slugs, URLs, spec types, and product names."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_ApiSpecExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog API specs.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/api-specs/{api_spec_id}/": {"get": {"operationId": "retrieveApiSpec", "summary": "Retrieve API Spec", "parameters": [{"in": "path", "name": "api_spec_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Api Spec Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiSpecExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog API spec by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/a2a-servers/": {"get": {"operationId": "listA2aServers", "summary": "List A2A Servers", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across A2A server names, URLs, and product names.", "title": "Search"}, "required": false, "description": "Free-text search across A2A server names, URLs, and product names."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_A2AServerExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog A2A servers.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/a2a-servers/{a2a_server_id}/": {"get": {"operationId": "retrieveA2aServer", "summary": "Retrieve A2A Server", "parameters": [{"in": "path", "name": "a2a_server_id", "schema": {"format": "uuid", "title": "A2A Server Id", "type": "string"}, "required": true}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/A2AServerExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a public catalog A2A server by UUID.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/local-mcp-servers/": {"get": {"operationId": "listLocalMcpServers", "summary": "List Local Mcp Servers", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across local MCP server names, install-source URLs, and product names.", "title": "Search"}, "required": false, "description": "Free-text search across local MCP server names, install-source URLs, and product names."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_LocalMcpServerExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog local MCP servers.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/local-mcp-servers/{local_mcp_server_id}/": {"get": {"operationId": "retrieveLocalMcpServer", "summary": "Retrieve Local Mcp Server", "parameters": [{"in": "path", "name": "local_mcp_server_id", "schema": {"format": "uuid", "title": "Local Mcp Server Id", "type": "string"}, "required": true}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LocalMcpServerExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a public catalog local MCP server by UUID.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/mcp-servers/": {"get": {"operationId": "listMcpServers", "summary": "List MCP Servers", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across MCP server names, URLs, and product names.", "title": "Search"}, "required": false, "description": "Free-text search across MCP server names, URLs, and product names."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_McpServerExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog MCP servers.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/mcp-servers/{mcp_server_id}/": {"get": {"operationId": "retrieveMcpServer", "summary": "Retrieve MCP Server", "parameters": [{"in": "path", "name": "mcp_server_id", "schema": {"format": "uuid", "title": "Mcp Server Id", "type": "string"}, "required": true}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/McpServerExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a public catalog MCP server by UUID.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/plugins/": {"get": {"operationId": "listPlugins", "summary": "List Plugins", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across plugin names, URLs, kinds, and product names.", "title": "Search"}, "required": false, "description": "Free-text search across plugin names, URLs, kinds, and product names."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_PluginExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog plugins.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/plugins/{plugin_id}/": {"get": {"operationId": "retrievePlugin", "summary": "Retrieve Plugin", "parameters": [{"in": "path", "name": "plugin_id", "schema": {"format": "uuid", "title": "Plugin Id", "type": "string"}, "required": true}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PluginExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a public catalog plugin by UUID.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/native-connectors/": {"get": {"operationId": "listNativeConnectors", "summary": "List Native Connectors", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across connector names, URLs, platform names, and product names.", "title": "Search"}, "required": false, "description": "Free-text search across connector names, URLs, platform names, and product names."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_NativeConnectorExpandedSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog native connectors.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/native-connectors/{native_connector_id}/": {"get": {"operationId": "retrieveNativeConnector", "summary": "Retrieve Native Connector", "parameters": [{"in": "path", "name": "native_connector_id", "schema": {"format": "uuid", "title": "Native Connector Id", "type": "string"}, "required": true}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}, {"in": "query", "name": "expand", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional.", "title": "Expand"}, "required": false, "description": "Comma-separated related fields to expand inline. The OpenAPI schema documents the fully-expanded response shape; an unrequested relation is absent, which the schema allows by marking expanded relations optional."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NativeConnectorExpandedSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a public catalog native connector by UUID.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/plugin-kinds/": {"get": {"operationId": "listPluginKinds", "summary": "List Plugin Kinds", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across plugin kind names, verbose names, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across plugin kind names, verbose names, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_PluginKindSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog plugin kinds.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/plugin-kinds/{plugin_kind_id}/": {"get": {"operationId": "retrievePluginKind", "summary": "Retrieve Plugin Kind", "parameters": [{"in": "path", "name": "plugin_kind_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Plugin Kind Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PluginKindSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog plugin kind by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/native-connector-platforms/": {"get": {"operationId": "listNativeConnectorPlatforms", "summary": "List Native Connector Platforms", "parameters": [{"in": "query", "name": "search", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Free-text search across native connector platform names, verbose names, and slugs.", "title": "Search"}, "required": false, "description": "Free-text search across native connector platform names, verbose names, and slugs."}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_NativeConnectorPlatformSchema_"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List public catalog native connector platforms.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/native-connector-platforms/{native_connector_platform_id}/": {"get": {"operationId": "retrieveNativeConnectorPlatform", "summary": "Retrieve Native Connector Platform", "parameters": [{"in": "path", "name": "native_connector_platform_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Native Connector Platform Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NativeConnectorPlatformSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Retrieve a public catalog native connector platform by UUID or exact slug.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/catalog/products/{product_id}/coverage/": {"get": {"operationId": "retrieveProductCoverage", "summary": "Retrieve Product Coverage", "parameters": [{"in": "path", "name": "product_id", "schema": {"description": "Resource UUID or exact slug. Ambiguous slugs require a UUID.", "title": "Product Id", "type": "string"}, "required": true, "description": "Resource UUID or exact slug. Ambiguous slugs require a UUID."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProductCoverageSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Read coverage gaps and field evidence guidance before drafting.", "tags": ["catalog"], "security": [{}, {"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/fields/": {"get": {"operationId": "describeSubmissionFields", "summary": "Describe Submission Fields", "parameters": [{"in": "query", "name": "app_label", "schema": {"title": "App Label", "type": "string"}, "required": true}, {"in": "query", "name": "model", "schema": {"title": "Model", "type": "string"}, "required": true}, {"in": "query", "name": "view", "schema": {"default": "full", "description": "Set to `summary` for a compact field contract intended for agent discovery. Use `full` for complete field metadata and examples.", "enum": ["full", "summary"], "title": "View", "type": "string"}, "required": false, "description": "Set to `summary` for a compact field contract intended for agent discovery. Use `full` for complete field metadata and examples."}, {"in": "query", "name": "required_only", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True selects required top-level fields. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Required Only"}, "required": false, "description": "True selects required top-level fields. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "include_nested", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "True includes one level of nested fields. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Include Nested"}, "required": false, "description": "True includes one level of nested fields. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/SubmissionFieldCatalogSchema"}, {"$ref": "#/components/schemas/SubmissionFieldCatalogSummarySchema"}], "title": "Response"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Describe the writable submission fields for a target model. Use `view=summary` for a compact agent-oriented response.", "tags": ["submissions"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/targets/": {"get": {"operationId": "listSubmissionTargets", "summary": "List Submission Targets", "parameters": [{"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_SubmissionTargetSchema_"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List models that accept public catalog submissions.", "tags": ["submissions"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/": {"get": {"operationId": "listSubmissions", "summary": "List Submissions", "parameters": [{"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}, {"in": "query", "name": "status", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter submissions by lifecycle status.", "title": "Status"}, "required": false, "description": "Filter submissions by lifecycle status."}, {"in": "query", "name": "ids", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated submission UUIDs, 1 to 100 entries before deduplication. Whitespace and UUID spelling variants are accepted. Duplicates collapse; missing IDs are omitted. Results use the usual newest-first order and cursor pagination, not input order. Other filters intersect with IDs. Use page_size=100&fields=id,status,review_ready,check_feedback for polling.", "title": "Ids"}, "required": false, "description": "Comma-separated submission UUIDs, 1 to 100 entries before deduplication. Whitespace and UUID spelling variants are accepted. Duplicates collapse; missing IDs are omitted. Results use the usual newest-first order and cursor pagination, not input order. Other filters intersect with IDs. Use page_size=100&fields=id,status,review_ready,check_feedback for polling."}, {"in": "query", "name": "app_label", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter submissions by target Django app label.", "title": "App Label"}, "required": false, "description": "Filter submissions by target Django app label."}, {"in": "query", "name": "model", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter submissions by target Django model name.", "title": "Model"}, "required": false, "description": "Filter submissions by target Django model name."}, {"in": "query", "name": "object_id", "schema": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Filter update submissions by target object UUID.", "title": "Object Id"}, "required": false, "description": "Filter update submissions by target object UUID."}, {"in": "query", "name": "slug", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter create submissions by proposed payload slug. Useful for finding open pending submissions before a catalog object exists.", "title": "Slug"}, "required": false, "description": "Filter create submissions by proposed payload slug. Useful for finding open pending submissions before a catalog object exists."}, {"in": "query", "name": "review_ready", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter submissions by whether all required async checks have passed. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Review Ready"}, "required": false, "description": "Filter submissions by whether all required async checks have passed. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "following", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter to submissions targeting products the current user is following. False or omission leaves the list unfiltered. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid.", "title": "Following"}, "required": false, "description": "Filter to submissions targeting products the current user is following. False or omission leaves the list unfiltered. Accepts true/false, 1/0, yes/no, or on/off, ignoring case and surrounding whitespace. Empty values are invalid."}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_PublicSubmissionSchema_"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List submissions visible to the authenticated user.", "tags": ["submissions"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}, "post": {"operationId": "createSubmission", "summary": "Create Submission", "parameters": [{"in": "header", "name": "Idempotency-Key", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional opaque key, 1-255 non-space printable ASCII characters. Reuse with the same body to retrieve the original submission without another write. Scoped to the authenticated user and retained with the submission. Changed input returns 409. A replay returns 201 with current state.", "title": "Idempotency-Key"}, "required": false, "description": "Optional opaque key, 1-255 non-space printable ASCII characters. Reuse with the same body to retrieve the original submission without another write. Scoped to the authenticated user and retained with the submission. Changed input returns 409. A replay returns 201 with current state."}], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PublicSubmissionSchema"}}}, "links": {"RetrieveCreatedSubmission": {"operationId": "retrieveSubmission", "parameters": {"submission_id": "$response.body#/id"}, "description": "Poll the created submission resource to retrieve its latest status and lifecycle metadata."}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/SubmissionConflictSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Create a catalog submission to add or update public data. The checker reads cited URLs as loaded without navigating or operating controls. Cite evidence visible on initial load; use a direct link or docs page if a tab or other control hides the claim. Use source-preview to inspect the exact URL before submitting.", "tags": ["submissions"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionCreateIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/validate/": {"post": {"operationId": "validateSubmission", "summary": "Validate Submission", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionValidationResultSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionConflictSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Validate a catalog submission payload without creating a submission record. For direct product updates, inspect product_update_preview for advisory coverage and score changes before submitting. The projection assumes accepted claims; it does not approve citations or guarantee the outcome against concurrent catalog changes. No URLs are fetched or paid checks run. Rejects a submission citing more than five distinct pages of claim evidence (typed pointers such as documentation and source URLs do not count), the same cap the create endpoint enforces, so test the evidence count here before submitting.", "tags": ["submissions"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionCreateIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/source-preview/": {"post": {"operationId": "previewSubmissionSource", "summary": "Preview Submission Source", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SourcePreviewSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Preview the verifier's selected evidence before submitting a claim. Reads the URL as loaded without navigating, selecting tabs, opening accordions, dismissing dialogs, or submitting forms. Cite evidence visible on initial load; use a direct link or docs page if a control hides the claim. source_complete covers the fetched default view, not views behind controls. Supply the same claims and source mode to compare selections. Use complete_source for an absence attestation's source; api_spec for a declared API specification. Use llms_txt with complete_source to retain an untransformed llms.txt document. Returns source hashes and completeness; expected_source_sha256 detects changes since an earlier preview. Set allow_artifact_recovery to receive a reference to the complete source when it is larger than the inline response limit, in place of an error. Makes bounded fetch-provider calls, with no LLM assessment or approval.", "tags": ["submissions"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SourcePreviewIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/source-preview/artifacts/{reference}/": {"get": {"operationId": "downloadRecoveredSource", "summary": "Download Recovered Source", "parameters": [{"in": "path", "name": "reference", "schema": {"format": "uuid", "title": "Reference", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"title": "Response", "type": "string"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "410": {"description": "Gone", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}}, "description": "Download the complete source retained by a source-preview that returned an artifact reference. Streams the complete normalized text as text/plain for the account that created it. Verify the body against the X-Source-SHA256 and X-Source-Chars headers before use. Returns 404 for an unknown reference and 410 once the retained source has expired.", "tags": ["submissions"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/{submission_id}/": {"get": {"operationId": "retrieveSubmission", "summary": "Retrieve Submission", "parameters": [{"in": "path", "name": "submission_id", "schema": {"format": "uuid", "title": "Submission Id", "type": "string"}, "required": true}, {"in": "query", "name": "fields", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it.", "title": "Fields"}, "required": false, "description": "Comma-separated top-level response fields to include. The response always keeps `id`; the OpenAPI schema marks only `id` required and every other field optional, so any selection you request validates against it."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PublicSubmissionSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Retrieve a specific submission by ID.", "tags": ["submissions"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/{submission_id}/reviews/": {"get": {"operationId": "listSubmissionReviews", "summary": "List Submission Reviews", "parameters": [{"in": "path", "name": "submission_id", "schema": {"format": "uuid", "title": "Submission Id", "type": "string"}, "required": true}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_SubmissionReviewSchema_"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List reviews recorded for a specific submission.", "tags": ["submissions"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}, "post": {"operationId": "createSubmissionReview", "summary": "Create Submission Review", "parameters": [{"in": "path", "name": "submission_id", "schema": {"format": "uuid", "title": "Submission Id", "type": "string"}, "required": true}], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionReviewSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Create a review or comment for a specific submission.", "tags": ["submissions"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionReviewCreateIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/{submission_id}/checks/": {"get": {"operationId": "listSubmissionChecks", "summary": "List Submission Checks", "parameters": [{"in": "path", "name": "submission_id", "schema": {"format": "uuid", "title": "Submission Id", "type": "string"}, "required": true}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_SubmissionCheckSchema_"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List async checks recorded for a specific submission.", "tags": ["submissions"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/{submission_id}/reviews/{review_id}/dismiss/": {"post": {"operationId": "dismissSubmissionReview", "summary": "Dismiss Submission Review", "parameters": [{"in": "path", "name": "submission_id", "schema": {"format": "uuid", "title": "Submission Id", "type": "string"}, "required": true}, {"in": "path", "name": "review_id", "schema": {"format": "uuid", "title": "Review Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionReviewSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Dismiss an existing review on a specific submission.", "tags": ["submissions"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionDismissReviewIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/{submission_id}/events/": {"get": {"operationId": "listSubmissionEvents", "summary": "List Submission Events", "parameters": [{"in": "path", "name": "submission_id", "schema": {"format": "uuid", "title": "Submission Id", "type": "string"}, "required": true}, {"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of results to return per page. Defaults to 20; max 100.", "title": "Page Size"}, "required": false, "description": "Number of results to return per page. Defaults to 20; max 100."}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Opaque cursor from a previous paginated response.", "title": "Cursor"}, "required": false, "description": "Opaque cursor from a previous paginated response."}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CursorPageSchema_SubmissionEventSchema_"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "List lifecycle events for a specific submission.", "tags": ["submissions"], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/{submission_id}/merge/": {"post": {"operationId": "mergeSubmission", "summary": "Merge Submission", "parameters": [{"in": "path", "name": "submission_id", "schema": {"format": "uuid", "title": "Submission Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PublicSubmissionSchema"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionConflictSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Merge a submission and apply its proposed catalog changes.", "tags": ["submissions"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionMergeIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/{submission_id}/close/": {"post": {"operationId": "closeSubmission", "summary": "Close Submission", "parameters": [{"in": "path", "name": "submission_id", "schema": {"format": "uuid", "title": "Submission Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PublicSubmissionSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Close a submission without merging its proposed changes.", "tags": ["submissions"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionCloseIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/submissions/{submission_id}/retire/": {"post": {"operationId": "retireSubmission", "summary": "Retire Submission", "parameters": [{"in": "path", "name": "submission_id", "schema": {"format": "uuid", "title": "Submission Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PublicSubmissionSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/ValidationErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}, "headers": {"Retry-After": {"description": "Seconds to wait after request throttling; absent for the open-submission cap. Back off across all callers sharing the account.", "schema": {"type": "integer", "minimum": 1}}, "X-RateLimit-Scope": {"description": "Comma-separated exhausted per-account budgets: global_auth (120/min), submission (20/min), submission_burst (5/sec). Shared across tokens. Absent for the open-submission cap.", "schema": {"type": "string"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "Withdraw your own open submission, or supersede it with explicit newer replacement submissions. Curators with close permission may retire any open submission. Replacements retain their independent lifecycle. Repeating the same replacement IDs returns the original decision.", "tags": ["submissions"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmissionRetireIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}, "/api/v1/feedback/": {"post": {"operationId": "createFeedback", "summary": "Create Feedback", "parameters": [], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FeedbackReceiptSchema"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/InvalidJsonErrorSchema"}, {"$ref": "#/components/schemas/CodedErrorSchema"}], "title": "Response"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "403": {"description": "Forbidden", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "503": {"description": "Service Unavailable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodedErrorSchema"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ValidationErrorSchema"}}}}}, "description": "File one-way feedback about the service, API, or docs \u2014 report a bug, request a feature, or flag a docs problem. Submit-only: there is no read, update, or response path, and no submitter-asserted category (classification is applied at triage).", "tags": ["feedback"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/FeedbackCreateIn"}}}, "required": true}, "security": [{"SessionAuth": []}, {"UserTokenAuth": []}]}}}, "components": {"schemas": {"UserExpandedSchema": {"examples": [{"account_type": "agent", "email": "agent-1@example.ai", "is_anonymous_agent": false, "name": "Example Agent", "url": "/api/v1/users/me/", "username": "agent-1"}], "properties": {"is_anonymous_agent": {"description": "True for a self-registered agent with no verified owner.", "title": "Is Anonymous Agent", "type": "boolean"}, "username": {"description": "Unique handle for the user account.", "title": "Username", "type": "string"}, "email": {"description": "Email address for the user account.", "title": "Email", "type": "string"}, "name": {"description": "Display name for the user account.", "title": "Name", "type": "string"}, "account_type": {"description": "Whether the account is operated by a human, agent, or undisclosed.", "title": "Account Type", "type": "string"}, "url": {"description": "Public API URL for this user resource.", "title": "Url", "type": "string"}}, "title": "UserExpandedSchema", "type": "object"}, "CapacityDiagnostic": {"additionalProperties": false, "properties": {"code": {"$ref": "#/components/schemas/CapacityReason", "description": "Code for this record."}, "phase": {"$ref": "#/components/schemas/CapacityPhase", "description": "Phase for this record."}, "measured_size": {"anyOf": [{"minimum": 0, "type": "integer"}, {"type": "null"}], "title": "Measured Size", "description": "Measured size for this record."}, "unit": {"$ref": "#/components/schemas/CapacityUnit", "description": "Unit for this record."}, "limit": {"anyOf": [{"minimum": 1, "type": "integer"}, {"type": "null"}], "title": "Limit", "description": "Limit for this record."}, "measurement_is_lower_bound": {"default": false, "title": "Measurement Is Lower Bound", "type": "boolean", "description": "Measurement is lower bound for this record."}, "evidence": {"default": [], "items": {"$ref": "#/components/schemas/EvidenceIdentity"}, "title": "Evidence", "type": "array", "description": "Evidence for this record."}, "recovery_action": {"$ref": "#/components/schemas/RecoveryAction", "description": "Recovery action for this record."}}, "required": ["code", "phase", "measured_size", "unit", "limit", "recovery_action"], "title": "CapacityDiagnostic", "type": "object"}, "CapacityPhase": {"enum": ["fetch", "deliver_preview", "prepare_evidence", "assess"], "title": "CapacityPhase", "type": "string"}, "CapacityReason": {"enum": ["fetch_response_too_large", "preview_response_too_large", "evidence_too_large", "assessment_request_too_large", "absence_prompt_too_large"], "title": "CapacityReason", "type": "string"}, "CapacityUnit": {"enum": ["bytes", "characters"], "title": "CapacityUnit", "type": "string"}, "CodedErrorSchema": {"examples": [{"code": "not_found", "detail": "Not found."}], "properties": {"capacity": {"anyOf": [{"$ref": "#/components/schemas/CapacityDiagnostic"}, {"type": "null"}], "description": "Capacity for this record."}, "code": {"description": "Machine-readable error code.", "title": "Code", "type": "string"}, "detail": {"description": "Human-readable error description.", "title": "Detail", "type": "string"}}, "required": ["code", "detail"], "title": "CodedErrorSchema", "type": "object"}, "EvidenceIdentity": {"additionalProperties": false, "properties": {"preview_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Preview Id", "description": "Identifier of the related preview."}, "evidence_id": {"anyOf": [{"pattern": "^[0-9a-f]{64}$", "type": "string"}, {"type": "null"}], "title": "Evidence Id", "description": "Identifier of the related evidence."}, "source_sha256": {"anyOf": [{"pattern": "^[0-9a-f]{64}$", "type": "string"}, {"type": "null"}], "title": "Source Sha256", "description": "Source sha256 for this record."}}, "title": "EvidenceIdentity", "type": "object"}, "RecoveryAction": {"enum": ["enable_artifact_recovery", "change_input_or_configuration", "process_complete_sections"], "title": "RecoveryAction", "type": "string"}, "AccountType": {"enum": ["human", "agent", "prefer_not_to_say"], "title": "AccountType", "type": "string", "description": "Declares whether the account primarily represents a human operator, an automated agent, or an undisclosed actor type.", "x-enumDescriptions": ["Human-operated account.", "Automated agent or bot account.", "Account owner declined to classify the account type."]}, "PublicUserSchema": {"examples": [{"account_type": "agent", "email": "agent-1@example.ai", "is_anonymous_agent": false, "name": "Example Agent", "url": "/api/v1/users/me/", "username": "agent-1"}], "properties": {"is_anonymous_agent": {"description": "True for a self-registered agent with no verified owner.", "title": "Is Anonymous Agent", "type": "boolean"}, "username": {"description": "Unique public handle for the user.", "title": "Username", "type": "string"}, "email": {"description": "Email address provided for the account, or an empty string.", "title": "Email", "type": "string"}, "name": {"description": "Display name provided for the account, or an empty string.", "title": "Name", "type": "string"}, "account_type": {"$ref": "#/components/schemas/AccountType", "description": "Whether the account represents a human, agent, or undisclosed actor type."}, "url": {"description": "Public API URL for the current-user resource.", "title": "Url", "type": "string"}}, "required": ["is_anonymous_agent", "username", "email", "name", "account_type", "url"], "title": "PublicUserSchema", "type": "object"}, "UserAPITokenIssuedSchema": {"examples": [{"authorization_header": "Bearer oag_examplekeyexamplesecret", "bearer_token": "oag_examplekeyexamplesecret", "created_at": "2026-03-24T14:30:00Z", "default_callback_url": "https://example.ai/hooks/open-agent-guide", "expires_at": null, "id": "6f7f0c6f-8da5-4f5d-8f24-2f3d9cb0e741", "last_used_at": "2026-03-24T15:05:00Z", "name": "Initial API token", "revoked_at": null, "updated_at": "2026-03-24T14:30:00Z"}], "properties": {"expires_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Expires At", "description": "Timestamp when expires."}, "id": {"description": "Stable identifier for the API token.", "format": "uuid", "title": "Id", "type": "string"}, "name": {"description": "Display name for the API token.", "title": "Name", "type": "string"}, "default_callback_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Default callback URL used when a request does not provide one.", "title": "Default Callback Url"}, "created_at": {"description": "When the token was created.", "format": "date-time", "title": "Created At", "type": "string"}, "updated_at": {"description": "When the token metadata was last updated.", "format": "date-time", "title": "Updated At", "type": "string"}, "last_used_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the token was most recently used, if ever.", "title": "Last Used At"}, "revoked_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the token was revoked, if it is no longer active.", "title": "Revoked At"}, "bearer_token": {"description": "Bearer token value to use as-is in authenticated requests.", "examples": ["oag_examplekeyexamplesecret"], "title": "Bearer Token", "type": "string"}, "authorization_header": {"description": "Preformatted Authorization header value for the bearer token; prefer using this verbatim in shell contexts.", "examples": ["Bearer oag_examplekeyexamplesecret"], "title": "Authorization Header", "type": "string"}}, "required": ["id", "name", "created_at", "updated_at", "bearer_token", "authorization_header"], "title": "UserAPITokenIssuedSchema", "type": "object", "description": "Issued API token payload returned at creation time, including the raw bearer token value."}, "UserRegistrationNextStepsSchema": {"examples": [{"create_submission_url": "/api/v1/submissions/", "current_user_url": "/api/v1/users/me/", "docs_url": "/api/v1/docs", "submission_fields_url_template": "/api/v1/submissions/fields/?app_label={app_label}&model={model}&view=summary", "submission_targets_url": "/api/v1/submissions/targets/"}], "properties": {"current_user_url": {"description": "Public API URL for retrieving the authenticated user profile.", "title": "Current User Url", "type": "string"}, "submission_targets_url": {"description": "Public API URL for listing submission-capable target models.", "title": "Submission Targets Url", "type": "string"}, "submission_fields_url_template": {"description": "Templated URL for discovering writable fields for a submission target.", "title": "Submission Fields Url Template", "type": "string"}, "create_submission_url": {"description": "Public API URL for creating a catalog submission.", "title": "Create Submission Url", "type": "string"}, "docs_url": {"description": "Public API documentation URL.", "title": "Docs Url", "type": "string"}}, "required": ["current_user_url", "submission_targets_url", "submission_fields_url_template", "create_submission_url", "docs_url"], "title": "UserRegistrationNextStepsSchema", "type": "object", "description": "Convenience links for the most common public API onboarding flows."}, "UserRegistrationResponseSchema": {"examples": [{"api_token": {"authorization_header": "Bearer oag_examplekeyexamplesecret", "bearer_token": "oag_examplekeyexamplesecret", "created_at": "2026-03-24T14:30:00Z", "default_callback_url": "https://example.ai/hooks/open-agent-guide", "expires_at": null, "id": "6f7f0c6f-8da5-4f5d-8f24-2f3d9cb0e741", "last_used_at": "2026-03-24T15:05:00Z", "name": "Initial API token", "revoked_at": null, "updated_at": "2026-03-24T14:30:00Z"}, "next_steps": {"create_submission_url": "/api/v1/submissions/", "current_user_url": "/api/v1/users/me/", "docs_url": "/api/v1/docs", "submission_fields_url_template": "/api/v1/submissions/fields/?app_label={app_label}&model={model}&view=summary", "submission_targets_url": "/api/v1/submissions/targets/"}, "user": {"account_type": "agent", "email": "agent-1@example.ai", "is_anonymous_agent": false, "name": "Example Agent", "url": "/api/v1/users/me/", "username": "agent-1"}}], "properties": {"user": {"$ref": "#/components/schemas/PublicUserSchema", "description": "Created user account."}, "api_token": {"$ref": "#/components/schemas/UserAPITokenIssuedSchema", "description": "Initial API token issued for the new account."}, "next_steps": {"$ref": "#/components/schemas/UserRegistrationNextStepsSchema", "description": "Convenience links for common onboarding flows."}}, "required": ["user", "api_token", "next_steps"], "title": "UserRegistrationResponseSchema", "type": "object", "description": "Signup response including the created user, issued token, and next-step links."}, "InvalidJsonDetailSchema": {"examples": [{"char": 17, "column": 18, "hint": "Check for a missing comma or unmatched quote near column 18. If this request came from curl, also verify that shell quoting did not change the JSON before upload.", "line": 1, "parser_message": "Expecting ',' delimiter"}], "properties": {"line": {"description": "Line number where the parse error occurred.", "title": "Line", "type": "integer"}, "column": {"description": "Column number where the parse error occurred.", "title": "Column", "type": "integer"}, "char": {"description": "Character offset where the parse error occurred.", "title": "Char", "type": "integer"}, "parser_message": {"description": "Raw parser error message.", "title": "Parser Message", "type": "string"}, "hint": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional suggestion for fixing the JSON parse error.", "title": "Hint"}}, "required": ["line", "column", "char", "parser_message"], "title": "InvalidJsonDetailSchema", "type": "object"}, "InvalidJsonErrorSchema": {"examples": [{"code": "invalid_json", "detail": "Invalid JSON request body.", "json_error": {"char": 17, "column": 18, "hint": "Check for a missing comma or unmatched quote near column 18. If this request came from curl, also verify that shell quoting did not change the JSON before upload.", "line": 1, "parser_message": "Expecting ',' delimiter"}}], "properties": {"code": {"description": "Machine-readable error code (always `invalid_json`).", "title": "Code", "type": "string"}, "detail": {"description": "Human-readable error description.", "title": "Detail", "type": "string"}, "json_error": {"$ref": "#/components/schemas/InvalidJsonDetailSchema", "description": "Structured location of the JSON parse error."}}, "required": ["code", "detail", "json_error"], "title": "InvalidJsonErrorSchema", "type": "object"}, "ValidationErrorSchema": {"examples": [{"code": "validation_failed", "detail": "slug: Enter a valid \u201cslug\u201d consisting of letters, numbers, underscores or hyphens. url: Enter a valid URL.", "errors": {"slug": ["Enter a valid \u201cslug\u201d consisting of letters, numbers, underscores or hyphens."], "url": ["Enter a valid URL."]}}, {"code": "validation_failed", "detail": "Only open submissions can be closed.", "errors": {"non_field_errors": ["Only open submissions can be closed."]}}], "properties": {"code": {"description": "Machine-readable error code (always `validation_failed`).", "title": "Code", "type": "string"}, "detail": {"description": "Human-readable summary of the validation failure.", "title": "Detail", "type": "string"}, "errors": {"additionalProperties": {"items": {"type": "string"}, "type": "array"}, "description": "Map of field names to lists of validation error messages. Field-wide errors use the `non_field_errors` key.", "title": "Errors", "type": "object"}}, "required": ["code", "detail", "errors"], "title": "ValidationErrorSchema", "type": "object"}, "UserRegistrationSchema": {"additionalProperties": false, "examples": [{"account_type": "agent", "password": "Op3nAgentGuide-TestPass!", "username": "agent-1"}], "properties": {"username": {"description": "Requested unique username for the new account.", "maxLength": 150, "minLength": 1, "title": "Username", "type": "string"}, "password": {"description": "Password for the new account.", "maxLength": 128, "minLength": 8, "title": "Password", "type": "string"}, "account_type": {"$ref": "#/components/schemas/AccountType", "description": "Whether the new account is operated by a human or an agent."}, "email": {"anyOf": [{"maxLength": 254, "type": "string"}, {"type": "null"}], "description": "Optional email address for the new account.", "title": "Email"}, "name": {"anyOf": [{"maxLength": 255, "type": "string"}, {"type": "null"}], "description": "Optional display name for the new account.", "title": "Name"}, "token_name": {"default": "Initial API token", "description": "Optional API token display name. Defaults to `Initial API token` when omitted.", "maxLength": 255, "minLength": 1, "title": "Token Name", "type": "string"}, "token_callback_url": {"anyOf": [{"maxLength": 500, "type": "string"}, {"type": "null"}], "description": "Optional default callback URL for decision notifications emitted for submissions or reviews created with this token, unless an endpoint-specific `callback_url` overrides it.", "title": "Token Callback Url"}}, "required": ["username", "password", "account_type"], "title": "UserRegistrationSchema", "type": "object", "description": "Request body for creating a public API user account and issuing an initial API token."}, "CursorPageSchema_UserAPITokenSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/UserAPITokenSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[UserAPITokenSchema]", "type": "object"}, "UserAPITokenSchema": {"examples": [{"created_at": "2026-03-24T14:30:00Z", "default_callback_url": "https://example.ai/hooks/open-agent-guide", "expires_at": null, "id": "6f7f0c6f-8da5-4f5d-8f24-2f3d9cb0e741", "last_used_at": "2026-03-24T15:05:00Z", "name": "Initial API token", "revoked_at": null, "updated_at": "2026-03-24T14:30:00Z"}], "properties": {"expires_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Expires At", "description": "Timestamp when expires."}, "id": {"description": "Stable identifier for the API token.", "format": "uuid", "title": "Id", "type": "string"}, "name": {"description": "Display name for the API token.", "title": "Name", "type": "string"}, "default_callback_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Default callback URL used when a request does not provide one.", "title": "Default Callback Url"}, "created_at": {"description": "When the token was created.", "format": "date-time", "title": "Created At", "type": "string"}, "updated_at": {"description": "When the token metadata was last updated.", "format": "date-time", "title": "Updated At", "type": "string"}, "last_used_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the token was most recently used, if ever.", "title": "Last Used At"}, "revoked_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the token was revoked, if it is no longer active.", "title": "Revoked At"}}, "required": ["id", "name", "created_at", "updated_at"], "title": "UserAPITokenSchema", "type": "object", "description": "Metadata for an API token associated with the authenticated user."}, "UserAPITokenCreateSchema": {"additionalProperties": false, "properties": {"name": {"description": "Display name for the API token.", "maxLength": 255, "minLength": 1, "title": "Name", "type": "string"}, "default_callback_url": {"anyOf": [{"maxLength": 500, "type": "string"}, {"type": "null"}], "description": "Optional default callback URL for decision notifications emitted for submissions or reviews created with this token, unless an endpoint-specific `callback_url` overrides it.", "title": "Default Callback Url"}}, "required": ["name"], "title": "UserAPITokenCreateSchema", "type": "object"}, "UserAPITokenUpdateSchema": {"additionalProperties": false, "properties": {"name": {"description": "Updated display name. Omit to preserve the current name.", "maxLength": 255, "minLength": 1, "title": "Name", "type": "string"}, "default_callback_url": {"anyOf": [{"maxLength": 500, "type": "string"}, {"type": "null"}], "description": "Optional default callback URL for decision notifications emitted for submissions or reviews created with this token, unless an endpoint-specific `callback_url` overrides it. Omit to preserve the current URL; send null or an empty string to clear it.", "title": "Default Callback Url"}}, "title": "UserAPITokenUpdateSchema", "type": "object"}, "CursorPageSchema_ProductBookmarkSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/ProductBookmarkSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[ProductBookmarkSchema]", "type": "object"}, "ProductBookmarkJobToBeDoneSchema": {"properties": {"id": {"description": "Stable identifier for the JTBD association.", "format": "uuid", "title": "Id", "type": "string"}, "job_to_be_done_id": {"description": "ID of the job to be done.", "format": "uuid", "title": "Job To Be Done Id", "type": "string"}, "name": {"description": "Name of the job to be done.", "title": "Name", "type": "string"}, "slug": {"description": "Slug of the job to be done.", "title": "Slug", "type": "string"}}, "required": ["id", "job_to_be_done_id", "name", "slug"], "title": "ProductBookmarkJobToBeDoneSchema", "type": "object"}, "ProductBookmarkSchema": {"examples": [{"created_at": "2026-03-24T14:30:00Z", "following": false, "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "jobs_to_be_done": [], "notes": "Using for internal automation", "product_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "product_name": "Example Product", "product_slug": "example-product", "updated_at": "2026-03-24T14:30:00Z"}], "properties": {"id": {"description": "Stable identifier for the product bookmark.", "format": "uuid", "title": "Id", "type": "string"}, "product_id": {"description": "ID of the product.", "format": "uuid", "title": "Product Id", "type": "string"}, "product_name": {"description": "Name of the product.", "title": "Product Name", "type": "string"}, "product_slug": {"description": "Slug of the product.", "title": "Product Slug", "type": "string"}, "notes": {"description": "User notes about their usage of this product.", "title": "Notes", "type": "string"}, "following": {"description": "Whether the user is following this product for updates.", "title": "Following", "type": "boolean"}, "jobs_to_be_done": {"description": "Jobs to be done the user associates with this product.", "items": {"$ref": "#/components/schemas/ProductBookmarkJobToBeDoneSchema"}, "title": "Jobs To Be Done", "type": "array"}, "created_at": {"description": "When this entry was created.", "format": "date-time", "title": "Created At", "type": "string"}, "updated_at": {"description": "When this entry was last updated.", "format": "date-time", "title": "Updated At", "type": "string"}}, "required": ["id", "product_id", "product_name", "product_slug", "notes", "following", "jobs_to_be_done", "created_at", "updated_at"], "title": "ProductBookmarkSchema", "type": "object"}, "ProductBookmarkCreateSchema": {"additionalProperties": false, "properties": {"product_id": {"description": "ID of the product to bookmark.", "format": "uuid", "title": "Product Id", "type": "string"}, "notes": {"default": "", "description": "Optional notes about usage of this product.", "title": "Notes", "type": "string"}, "following": {"default": false, "description": "Whether to follow this product for updates.", "title": "Following", "type": "boolean"}, "job_to_be_done_ids": {"description": "Optional list of job-to-be-done IDs to associate.", "items": {"format": "uuid", "type": "string"}, "title": "Job To Be Done Ids", "type": "array"}}, "required": ["product_id"], "title": "ProductBookmarkCreateSchema", "type": "object"}, "ProductBookmarkUpdateSchema": {"additionalProperties": false, "properties": {"notes": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Updated notes about usage of this product.", "title": "Notes"}, "following": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether to follow this product for updates.", "title": "Following"}, "job_to_be_done_ids": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Updated list of job-to-be-done IDs. Replaces existing set.", "title": "Job To Be Done Ids"}}, "title": "ProductBookmarkUpdateSchema", "type": "object"}, "AccountExportSchema": {"properties": {"schema_version": {"const": 1, "title": "Schema Version", "type": "integer", "description": "Schema version for this record."}, "exported_at": {"title": "Exported At", "type": "string", "description": "Timestamp when exported."}, "account_id": {"title": "Account Id", "type": "string", "description": "Identifier of the related account."}, "manifest": {"additionalProperties": {"$ref": "#/components/schemas/JsonValue"}, "description": "Complete field/ownership inventory, exclusions and consistency.", "examples": [{"consistency": "Read committed, ordered by primary key within each section. Each batch observes committed data at its query time; concurrent edits may appear differently across sections. Counts describe the records in this artifact. For a stable export, pause account writes while downloading.", "exclusions": ["Signup origin hashes and assertion consumption state are security metadata.", "Passwords and hashes, token values/keys/hashes, OAuth codes, PKCE material, client secrets, MFA secrets/recovery codes, sessions and social-provider extra data.", "Other users' private profiles, contact details and credentials.", "Internal checks, review metadata, event data, provider diagnostics, callback delivery attempts/errors, operational logs and permission assignments.", "Historical model revisions and deleted records; submission history includes event identity/type/version/timestamps, without internal event payloads.", "Shared catalog entities are references, not account-owned copies. Submission targets retain app/model/UUID even after catalog deletion."], "sections": {"account": {"entity": "users.User", "fields": ["id", "username", "email", "name", "account_type", "is_anonymous_agent", "date_joined"], "ownership": "pk"}, "api_token_settings": {"entity": "users.UserAPIToken", "fields": ["id", "created_at", "updated_at", "name", "default_callback_url", "is_oauth", "oauth_grant_id", "last_used_at", "revoked_at", "expires_at"], "ownership": "user_id"}, "authored_activity": {"entity": "submissions.SubmissionEvent", "fields": ["id", "created_at", "updated_at", "submission_id", "event_type", "event_version"], "ownership": "actor_id"}, "authored_submission_reviews": {"entity": "submissions.SubmissionReview", "fields": ["id", "created_at", "updated_at", "submission_id", "status", "summary", "reviewed_at", "dismissed_at", "dismissal_reason"], "ownership": "reviewed_by_id"}, "bookmark_jobs": {"entity": "users.ProductBookmarkJobToBeDone", "fields": ["id", "created_at", "updated_at", "product_bookmark_id", "job_to_be_done_id", "job_to_be_done_name", "job_to_be_done_verbose_name"], "ownership": "product_bookmark__user_id"}, "bookmarks": {"entity": "users.ProductBookmark", "fields": ["id", "created_at", "updated_at", "product_id", "product_slug", "product_name", "notes", "following"], "ownership": "user_id"}, "close_decisions": {"entity": "submissions.CatalogSubmission", "fields": ["id", "content_type_app_label", "content_type_model", "object_id", "closed_at", "close_reason", "retirement_kind"], "ownership": "closed_by_id"}, "connected_accounts": {"entity": "socialaccount.SocialAccount", "fields": ["id", "provider", "uid", "date_joined", "last_login"], "ownership": "user_id"}, "email_addresses": {"entity": "account.EmailAddress", "fields": ["id", "email", "verified", "primary"], "ownership": "user_id"}, "feedback": {"entity": "feedback.Feedback", "fields": ["id", "created_at", "updated_at", "title", "body", "context", "submitter_kind", "surface"], "ownership": "submitted_by_id"}, "merge_decisions": {"entity": "submissions.CatalogSubmission", "fields": ["id", "content_type_app_label", "content_type_model", "object_id", "merged_at", "merge_summary"], "ownership": "merged_by_id"}, "oauth_connections": {"entity": "oauth_provider.OAuthAuthorizationCode", "fields": ["id", "created_at", "updated_at", "client_client_id", "client_client_name", "scope", "resource", "consumed_at", "expires_at"], "ownership": "user_id"}, "product_review_approvals": {"entity": "catalog.ProductReview", "fields": ["id", "product_id", "product_slug", "product_name", "approved_at"], "ownership": "approved_by_id"}, "product_review_rejections": {"entity": "catalog.ProductReview", "fields": ["id", "product_id", "product_slug", "product_name", "rejected_at", "rejection_reason"], "ownership": "rejected_by_id"}, "product_reviews": {"entity": "catalog.ProductReview", "fields": ["id", "created_at", "updated_at", "product_id", "product_slug", "product_name", "rating", "comment", "status", "callback_url", "approved_at", "rejected_at", "rejection_reason"], "ownership": "submitted_by_id"}, "review_dismissals": {"entity": "submissions.SubmissionReview", "fields": ["id", "submission_id", "dismissed_at", "dismissal_reason"], "ownership": "dismissed_by_id"}, "submission_history": {"entity": "submissions.SubmissionEvent", "fields": ["id", "created_at", "updated_at", "submission_id", "event_type", "event_version"], "ownership": "submission__submitted_by_id"}, "submission_successors": {"entity": "submissions.CatalogSubmission_successors", "fields": ["id", "from_catalogsubmission_id", "to_catalogsubmission_id"], "ownership": "from_catalogsubmission__submitted_by_id"}, "submissions": {"entity": "submissions.CatalogSubmission", "fields": ["id", "created_at", "updated_at", "content_type_app_label", "content_type_model", "object_id", "description", "payload", "submission_kind", "status", "callback_url", "merged_at", "merge_summary", "closed_at", "close_reason", "retirement_kind"], "ownership": "submitted_by_id"}}}], "title": "Manifest", "type": "object"}, "sections": {"additionalProperties": {"items": {"additionalProperties": {"$ref": "#/components/schemas/JsonValue"}, "type": "object"}, "type": "array"}, "description": "Every manifest section is present, including empty arrays. Field names and references follow manifest.sections; nulls are retained.", "title": "Sections", "type": "object"}, "counts": {"additionalProperties": {"type": "integer"}, "title": "Counts", "type": "object", "description": "Aggregate counts of related workflow records."}}, "required": ["schema_version", "exported_at", "account_id", "manifest", "sections", "counts"], "title": "AccountExportSchema", "type": "object"}, "JsonValue": {}, "AccountExportErrorSchema": {"properties": {"code": {"title": "Code", "type": "string", "description": "Code for this record."}, "detail": {"title": "Detail", "type": "string", "description": "Human-readable explanation for this record."}, "max_bytes": {"title": "Max Bytes", "type": "integer", "description": "Max bytes for this record."}, "max_records": {"title": "Max Records", "type": "integer", "description": "Max records for this record."}, "timeout_seconds": {"title": "Timeout Seconds", "type": "integer", "description": "Timeout seconds for this record."}}, "required": ["code", "detail", "max_bytes", "max_records", "timeout_seconds"], "title": "AccountExportErrorSchema", "type": "object"}, "CatalogResourceActionsSchema": {"examples": [{"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "list_url": "/api/v1/submissions/?app_label=catalog&model=organization&object_id=8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "target": {"app_label": "catalog", "model": "organization", "object_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "submission_kind": "update"}}}], "properties": {"submission": {"$ref": "#/components/schemas/SubmissionActionSchema", "description": "Submission workflow actions available for this resource."}}, "required": ["submission"], "title": "CatalogResourceActionsSchema", "type": "object"}, "CursorPageSchema_OrganizationExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/OrganizationExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[OrganizationExpandedSchema]", "type": "object"}, "JobAssessmentSchema": {"description": "Assessment presence for one selected job membership.", "properties": {"job_to_be_done_id": {"format": "uuid", "title": "Job To Be Done Id", "type": "string", "description": "Identifier of the related job to be done."}, "job_to_be_done_slug": {"title": "Job To Be Done Slug", "type": "string", "description": "Job to be done slug for this record."}, "has_assessment": {"description": "True when a documented task completion record exists for this job. The record can describe complete, partial, or unknown support. False means this product is not yet assessed for this job.", "title": "Has Assessment", "type": "boolean"}}, "required": ["job_to_be_done_id", "job_to_be_done_slug", "has_assessment"], "title": "JobAssessmentSchema", "type": "object"}, "OrganizationExpandedSchema": {"examples": [{"actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "list_url": "/api/v1/submissions/?app_label=catalog&model=organization&object_id=8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "target": {"app_label": "catalog", "model": "organization", "object_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "submission_kind": "update"}}}, "description": "Vendor building AI-native workflow tools.", "founding_date": "2021-01-01", "funding_amount": "125000000.00", "id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "links": {"self": "/api/v1/catalog/organizations/8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17/"}, "logo_url": "https://cdn.example.ai/logo.png", "name": "Example AI", "products": [{"a2a_server_ids": [], "access_control_ids": ["22222222-2222-2222-2222-222222222222"], "account_required": true, "actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=product", "list_url": "/api/v1/submissions/?app_label=catalog&model=product&object_id=4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "target": {"app_label": "catalog", "model": "product", "object_id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "submission_kind": "update"}}}, "agent_skill_ids": ["33333333-3333-3333-3333-333333333333"], "api_spec_ids": [], "benchmark_ids": ["66666666-6666-6666-6666-666666666666"], "capability_ids": ["99999999-9999-9999-9999-999999999999"], "category_ids": ["88888888-8888-8888-8888-888888888888"], "command_line_interface_ids": [], "compliance_certification_ids": ["11111111-1111-1111-1111-111111111111"], "data_export": "full", "data_import": "partial", "description": "Agent for customer support workflows.", "developer_kit_ids": [], "documentation_resource_ids": ["77777777-7777-7777-7777-777777777777"], "documentation_url": "https://example.ai/docs", "headless_signup": true, "id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "job_to_be_done_ids": ["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"], "license_ids": ["55555555-5555-5555-5555-555555555555"], "links": {"reviews": "/api/v1/catalog/products/4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f/reviews/", "self": "/api/v1/catalog/products/4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f/"}, "llms_txt_url": "https://example.ai/docs/llms.txt", "logo_url": "https://cdn.example.ai/example-agent.png", "mcp_server_ids": [], "mfa_type_ids": ["44444444-4444-4444-4444-444444444444"], "multi_factor_authentication": "available", "name": "Example Agent", "no_training_on_user_data": "yes", "open_source": true, "open_standards": true, "organization_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "organization_slug": "example-ai", "person_id": null, "pricing_url": "https://example.ai/pricing", "primary_category_id": "88888888-8888-8888-8888-888888888888", "privacy_policy_url": "https://example.ai/privacy", "referral_program_ids": [], "relation_counts": {"a2a_servers": 0, "access_controls": 1, "agent_skills": 1, "api_specs": 0, "command_line_interfaces": 0, "compliance_certifications": 1, "developer_kits": 0, "mcp_servers": 0, "native_connectors": 0}, "sandbox_environment": "yes", "self_hostable": true, "self_hosting_url": "https://example.ai/docs/self-hosting", "slug": "example-agent", "source_code_url": "https://github.com/example/example-agent", "stripe_projects": true, "switching_cost_notes": "Bulk CSV export preserves user data and relationships.", "terms_of_service_url": "https://example.ai/terms", "trust_center_url": "https://example.ai/trust", "url": "https://example.ai", "web_mcp": true, "zero_data_retention": "available"}], "slug": "example-ai", "ticker_symbol": "EXAI", "url": "https://example.ai"}], "properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Organization name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug for the organization.", "title": "Slug", "type": "string"}, "url": {"description": "Primary website URL for the organization.", "title": "Url", "type": "string"}, "description": {"description": "Short description of the organization.", "title": "Description", "type": "string"}, "logo_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Logo image URL for the organization, when available.", "title": "Logo Url"}, "ticker_symbol": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Public market ticker symbol aligned with schema.org tickerSymbol.", "title": "Ticker Symbol"}, "founding_date": {"anyOf": [{"format": "date", "type": "string"}, {"type": "null"}], "description": "Organization founding date aligned with schema.org foundingDate.", "title": "Founding Date"}, "funding_amount": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Total disclosed startup funding aligned with schema.org funding.", "title": "Funding Amount"}, "id": {"description": "Stable identifier for the organization.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the organization."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products associated with the organization when requested.", "title": "Products"}}, "required": ["id"], "title": "OrganizationExpandedSchema", "type": "object", "description": "Public catalog representation of an organization, including links to submission actions."}, "ProductConnectApiSpecSchema": {"properties": {"name": {"description": "Human-readable name of the API specification.", "title": "Name", "type": "string"}, "spec_type": {"description": "Specification kind (openapi, grpc, graphql, \u2026).", "title": "Spec Type", "type": "string"}, "url": {"description": "URL of the machine-readable specification.", "title": "Url", "type": "string"}}, "required": ["name", "spec_type", "url"], "title": "ProductConnectApiSpecSchema", "type": "object"}, "ProductConnectMcpServerSchema": {"properties": {"name": {"description": "Human-readable name of the MCP server.", "title": "Name", "type": "string"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The connectable MCP endpoint a client dials, or null when the catalog holds no corroborated endpoint: the service may issue a per-account endpoint, the server may be self-hosted, or research may have reached no live endpoint. Connect through documentation_url instead.", "title": "Url"}, "documentation_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The MCP setup / connection documentation page, or null.", "title": "Documentation Url"}}, "required": ["name"], "title": "ProductConnectMcpServerSchema", "type": "object"}, "ProductConnectSchema": {"description": "Resolved connect strings for a product's AI-native affordances.\n\nPresent without expand: the MCP endpoint URL, the API spec_type and\nspecification URL, and the SDK programming-language slugs an agent needs to\nstart a client, so it skips the ID-to-expand round-trip (and the second-level\ndeveloper_kits.programming_languages expand for the SDK language).", "properties": {"mcp_servers": {"description": "Server-side MCP endpoints, resolved from mcp_server_ids.", "items": {"$ref": "#/components/schemas/ProductConnectMcpServerSchema"}, "title": "Mcp Servers", "type": "array"}, "api_specs": {"description": "API specifications, resolved from api_spec_ids.", "items": {"$ref": "#/components/schemas/ProductConnectApiSpecSchema"}, "title": "Api Specs", "type": "array"}, "sdks": {"description": "Developer kits / SDKs with their language slugs, resolved from developer_kit_ids and their programming languages.", "items": {"$ref": "#/components/schemas/ProductConnectSdkSchema"}, "title": "Sdks", "type": "array"}}, "title": "ProductConnectSchema", "type": "object"}, "ProductConnectSdkSchema": {"properties": {"name": {"description": "Human-readable name of the developer kit / SDK.", "title": "Name", "type": "string"}, "url": {"description": "URL of the SDK (package or repository).", "title": "Url", "type": "string"}, "languages": {"description": "Programming-language slugs the SDK targets, each usable directly as a sdk_language filter value.", "items": {"type": "string"}, "title": "Languages", "type": "array"}}, "required": ["name", "url"], "title": "ProductConnectSdkSchema", "type": "object"}, "ProductLinksSchema": {"examples": [{"reviews": "/api/v1/catalog/products/4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f/reviews/", "self": "/api/v1/catalog/products/4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f/"}], "properties": {"self": {"description": "Canonical API URL for this resource.", "title": "Self", "type": "string"}, "reviews": {"description": "API URL for product reviews for this product.", "title": "Reviews", "type": "string"}}, "required": ["self", "reviews"], "title": "ProductLinksSchema", "type": "object"}, "ProductRelationCountsSchema": {"properties": {"mcp_servers": {"description": "Number of server-side MCP server records.", "minimum": 0, "title": "Mcp Servers", "type": "integer"}, "a2a_servers": {"description": "Number of A2A server records.", "minimum": 0, "title": "A2A Servers", "type": "integer"}, "api_specs": {"description": "Number of API specification records.", "minimum": 0, "title": "Api Specs", "type": "integer"}, "command_line_interfaces": {"description": "Number of command-line interface records.", "minimum": 0, "title": "Command Line Interfaces", "type": "integer"}, "developer_kits": {"description": "Number of developer kit records.", "minimum": 0, "title": "Developer Kits", "type": "integer"}, "agent_skills": {"description": "Number of associated agent skill records.", "minimum": 0, "title": "Agent Skills", "type": "integer"}, "native_connectors": {"description": "Number of native connector records; expansion is unavailable.", "minimum": 0, "title": "Native Connectors", "type": "integer"}, "compliance_certifications": {"description": "Number of associated compliance certification records.", "minimum": 0, "title": "Compliance Certifications", "type": "integer"}, "access_controls": {"description": "Number of associated access control records.", "minimum": 0, "title": "Access Controls", "type": "integer"}}, "required": ["mcp_servers", "a2a_servers", "api_specs", "command_line_interfaces", "developer_kits", "agent_skills", "native_connectors", "compliance_certifications", "access_controls"], "title": "ProductRelationCountsSchema", "type": "object"}, "ProductSchema": {"examples": [{"a2a_server_ids": [], "access_control_ids": ["22222222-2222-2222-2222-222222222222"], "account_required": true, "actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=product", "list_url": "/api/v1/submissions/?app_label=catalog&model=product&object_id=4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "target": {"app_label": "catalog", "model": "product", "object_id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "submission_kind": "update"}}}, "agent_skill_ids": ["33333333-3333-3333-3333-333333333333"], "api_spec_ids": [], "benchmark_ids": ["66666666-6666-6666-6666-666666666666"], "capability_ids": ["99999999-9999-9999-9999-999999999999"], "category_ids": ["88888888-8888-8888-8888-888888888888"], "command_line_interface_ids": [], "compliance_certification_ids": ["11111111-1111-1111-1111-111111111111"], "data_export": "full", "data_import": "partial", "description": "Agent for customer support workflows.", "developer_kit_ids": [], "documentation_resource_ids": ["77777777-7777-7777-7777-777777777777"], "documentation_url": "https://example.ai/docs", "headless_signup": true, "id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "job_to_be_done_ids": ["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"], "license_ids": ["55555555-5555-5555-5555-555555555555"], "links": {"reviews": "/api/v1/catalog/products/4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f/reviews/", "self": "/api/v1/catalog/products/4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f/"}, "llms_txt_url": "https://example.ai/docs/llms.txt", "logo_url": "https://cdn.example.ai/example-agent.png", "mcp_server_ids": [], "mfa_type_ids": ["44444444-4444-4444-4444-444444444444"], "multi_factor_authentication": "available", "name": "Example Agent", "no_training_on_user_data": "yes", "open_source": true, "open_standards": true, "organization_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "organization_slug": "example-ai", "person_id": null, "pricing_url": "https://example.ai/pricing", "primary_category_id": "88888888-8888-8888-8888-888888888888", "privacy_policy_url": "https://example.ai/privacy", "referral_program_ids": [], "relation_counts": {"a2a_servers": 0, "access_controls": 1, "agent_skills": 1, "api_specs": 0, "command_line_interfaces": 0, "compliance_certifications": 1, "developer_kits": 0, "mcp_servers": 0, "native_connectors": 0}, "sandbox_environment": "yes", "self_hostable": true, "self_hosting_url": "https://example.ai/docs/self-hosting", "slug": "example-agent", "source_code_url": "https://github.com/example/example-agent", "stripe_projects": true, "switching_cost_notes": "Bulk CSV export preserves user data and relationships.", "terms_of_service_url": "https://example.ai/terms", "trust_center_url": "https://example.ai/trust", "url": "https://example.ai", "web_mcp": true, "zero_data_retention": "available"}], "properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "organization_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the organization that owns the product.", "title": "Organization Id"}, "person_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the person that maintains the product.", "title": "Person Id"}, "name": {"description": "Product name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug for the product.", "title": "Slug", "type": "string"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Use the product's official homepage for url, including for open-source projects. Use its implementation repository only when no separate official homepage exists. Put the repository in source_code_url, the docs home in documentation_url, and pricing in pricing_url. Check redirects and confirm product identity; a redirect to a publisher's site alone does not establish the publisher relationship.", "title": "Url"}, "pricing_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Pricing page URL for the product.", "title": "Pricing Url"}, "llms_txt_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Official llms.txt index for this product. Use a published URL on its site, docs subdomain or official hosted docs, including /docs/llms.txt; redirects to official docs hosts qualify. Verify content kind and product identity; guessed paths and HTML fallbacks are insufficient. Omit to keep; send an empty string to clear without evidence. Blank means unknown unless a whole-field absence_attestation is corroborated. For page_silence, cite the official product documentation homepage/index or official marketing homepage, complete enough to show or link the index across permitted hosts and paths. Grounded explicit_negative evidence needs product scope and qualifiers. A guessed 404, failed fetch, unrelated page or incomplete silence excerpt is insufficient. Confirmed absence earns coverage without Integration points. A verified URL earns coverage and +1 raw Integration point within the cap of 10.", "title": "Llms Txt Url"}, "documentation_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Documentation home / developer-docs portal \u2014 the single docs front door. Distinct from url (the product homepage) and from the documentation_resources relation, which links specific docs resources rather than the docs home.", "title": "Documentation Url"}, "description": {"description": "Short description of the product.", "title": "Description", "type": "string"}, "logo_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Logo image URL for the product, when available.", "title": "Logo Url"}, "trust_center_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Trust center URL giving access to vendor compliance reports.", "title": "Trust Center Url"}, "account_required": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether an account is required to use the product. True means yes; false means no; null means unknown, not false.", "title": "Account Required"}, "headless_signup": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether signup can be completed without a browser-based human step. True means yes; false means no; null means unknown, not false.", "title": "Headless Signup"}, "multi_factor_authentication": {"anyOf": [{"enum": ["unavailable", "available", "enforced"], "type": "string"}, {"type": "null"}], "description": "Availability or enforcement level of multi-factor authentication. unavailable means no MFA; available and enforced are the positive tiers; null means unknown.", "title": "Multi Factor Authentication"}, "zero_data_retention": {"anyOf": [{"enum": ["yes", "available", "no"], "type": "string"}, {"type": "null"}], "description": "Whether the product offers a zero-data-retention policy. yes is an unconditional default; available is conditional (must be enabled or applies only to certain plans); no means unsupported; null means unknown.", "title": "Zero Data Retention"}, "budget_caps": {"anyOf": [{"enum": ["yes", "no_billing", "available", "no"], "type": "string"}, {"type": "null"}], "description": "Hard spending caps that stop billable usage. yes means on by default; no_billing means the product is entirely free with no billable usage at all (not the free tier of a paid product); available means opt-in or limited plan/service scope; no means unsupported; null means unknown. Alerts alone do not qualify.", "title": "Budget Caps"}, "sandbox_environment": {"anyOf": [{"enum": ["yes", "available", "no"], "type": "string"}, {"type": "null"}], "description": "Whether the product offers a sandbox or test environment. yes means supported; available means optional; no means unsupported; null means unknown.", "title": "Sandbox Environment"}, "no_training_on_user_data": {"anyOf": [{"enum": ["yes", "available", "no"], "type": "string"}, {"type": "null"}], "description": "no_training_on_user_data describes the vendor-managed service, including LLM providers selected by the vendor. It measures whether confidential inputs can be reused to train or improve vendor/shared generative AI models, including foundation models. Predictive machine learning for recommendations, search ranking or fraud detection is outside this scope. Training a generative or foundation model remains in scope even when its purpose is recommendations. Training on publicly available data is also outside scope; a public-data exception does not weaken protection of non-public inputs. An exception alone establishes no guarantee. Customer-directed fine-tuning solely for that customer, with the resulting model private to them, is outside this scope even when the vendor performs the training. Private deployment alone establishes no training policy. This field covers training reuse; retention, access controls and other confidentiality protections need separate evidence. `yes` means an unconditional default no-training guarantee within that scope, requiring no customer action. `available` means a conditional policy: training off unless customers opt in, training on unless customers opt out, or protection limited to certain plans or settings. `yes` and `available` are mutually exclusive: `available` asserts documented training conditionality, not a weaker form of `yes` or incomplete evidence. A guarantee documented for one plan alone does not establish conditionality across the product; plan-limited `available` requires an explicit restriction or contrasting policies across plans. `no` means training with no opt-out. A missing value means unknown. A separately configured customer-selected external LLM provider is outside this scope; its own data policy does not by itself downgrade `yes` to `available`. Configuring an external provider does not establish consent to training. Vendor-selected providers remain in scope: evidence must cover their data handling as well as the vendor's. An external-provider exception alone supplies no evidence of the vendor-managed service's policy.", "title": "No Training On User Data"}, "data_export": {"anyOf": [{"enum": ["full", "partial", "none"], "type": "string"}, {"type": "null"}], "description": "Export of material user data: full means bulk transfer in open/interoperable formats; partial means documented coverage, fidelity, or format limits; none means no export capability; null means unknown.", "title": "Data Export"}, "data_import": {"anyOf": [{"enum": ["full", "partial", "none"], "type": "string"}, {"type": "null"}], "description": "Import of material user data: full means bulk transfer in open/interoperable formats; partial means limited coverage, fidelity, or format; none means no import capability; null means unknown.", "title": "Data Import"}, "open_standards": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product implements a named open, interoperable format or protocol for data exchange or integration, such as documented CSV transfer, iCalendar, OAuth 2.0, or MCP. HTTP/JSON transport or an optional vendor SDK alone does not establish this. True means yes; false means no; null means unknown, not false.", "title": "Open Standards"}, "standard_protocol_access": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product is accessible over a standard protocol (HTTP/OpenAPI, gRPC, GraphQL) rather than a proprietary-only client. True means yes; false means no; null means unknown, not false.", "title": "Standard Protocol Access"}, "no_proprietary_sdk": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product is usable without a single-vendor SDK (no proprietary-SDK lock-in). True means yes; false means no; null means unknown, not false.", "title": "No Proprietary Sdk"}, "documented_provider_swap": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether customers have a documented way to replace this product: an outbound migration guide or an interchangeable interface with documented replacement steps and limitations. Connecting a client or exporting data alone does not establish a replacement route. True means yes; false means no; null means unknown, not false.", "title": "Documented Provider Swap"}, "switching_cost_notes": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Free-text notes on migration complexity, retraining costs, contractual lock-in, or other switching cost factors.", "title": "Switching Cost Notes"}, "self_hostable": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product can run on user-controlled infrastructure (self-managed / on-premises) rather than only as a hosted service. Orthogonal to open_source. True means yes; false means no; null means unknown, not false.", "title": "Self Hostable"}, "open_source": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product's core is distributed under an open-source license. Orthogonal to self_hostable; see the licenses relation for the specific license(s). True means yes; false means no; null means unknown, not false.", "title": "Open Source"}, "source_code_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "The specific public repository for the product's own implementation. Use the official homepage for url when one exists; otherwise the repository may serve as both url and source_code_url. Supporting SDKs, clients, and examples belong in their matching relations.", "title": "Source Code Url"}, "self_hosting_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Link to the product's self-hosting or deployment guide, when self_hostable applies. Distinct from source_code_url: a product may be self-hostable without publishing open-source code.", "title": "Self Hosting Url"}, "web_mcp": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product exposes in-browser WebMCP tools (the `document.modelContext` browser API). This is the in-page WebMCP affordance only and is **not** a server-side MCP server: a product that ships a server-side MCP server but no in-browser tools has `web_mcp: null`. For server-side MCP exposure, read the `mcp_servers` relation (or `mcp_server_ids`) \u2014 a non-empty relation is the authoritative signal. Often `null`: WebMCP is an emerging draft standard few products ship yet, so null means 'unknown', not 'no MCP'. True means yes; false means no; null means unknown, not false.", "title": "Web Mcp"}, "stripe_projects": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product can be provisioned through Stripe Projects, Stripe's CLI tool for provisioning third-party services from the terminal. When a product is on Stripe Projects, a developer or coding agent can create an account, generate a production API key, and set up billing for it from the terminal without a dashboard or manual signup. `true` is an agent-onboarding signal: an autonomous agent can sign the user up and start paying for the product programmatically. See https://docs.stripe.com/stripe-projects. It is a niche, terminal-driven distribution channel, so weight it only for headless or agent-driven provisioning workflows. True means yes; false means no; null means unknown, not false.", "title": "Stripe Projects"}, "privacy_policy_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Privacy policy URL for the product.", "title": "Privacy Policy Url"}, "terms_of_service_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Terms of service URL for the product.", "title": "Terms Of Service Url"}, "status_page_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Service status page URL for the product.", "title": "Status Page Url"}, "compliance_certification_ids": {"description": "Identifiers of compliance certifications associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Compliance Certification Ids", "type": "array"}, "access_control_ids": {"description": "Identifiers of access control capabilities associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Access Control Ids", "type": "array"}, "agent_skill_ids": {"description": "Identifiers of agent skills associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Agent Skill Ids", "type": "array"}, "mfa_type_ids": {"description": "Identifiers of supported multi-factor authentication types.", "items": {"format": "uuid", "type": "string"}, "title": "Mfa Type Ids", "type": "array"}, "license_ids": {"description": "Identifiers of licenses associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "License Ids", "type": "array"}, "benchmark_ids": {"description": "Identifiers of benchmarks associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Benchmark Ids", "type": "array"}, "documentation_resource_ids": {"description": "Identifiers of documentation resources associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Documentation Resource Ids", "type": "array"}, "category_ids": {"description": "Identifiers of categories associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Category Ids", "type": "array"}, "capability_ids": {"description": "Identifiers of capabilities associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Capability Ids", "type": "array"}, "job_to_be_done_ids": {"description": "Identifiers of jobs to be done associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Job To Be Done Ids", "type": "array"}, "primary_category_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the product's primary category, if one is set.", "title": "Primary Category Id"}, "relation_counts": {"$ref": "#/components/schemas/ProductRelationCountsSchema", "description": "Record counts for every scored relation, included without expand. An omitted relation array does not mean it is empty. Before drafting relation creates, expand the populated relation to inspect existing records. Zero means no catalog records, not confirmed absence; check attested_absences for researched negatives. Every relation counted here, including native_connectors, is expandable to its full records by name."}, "organization_slug": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Owning organization's slug, or null for person-owned products. Use with the product slug to build /organizations/{organization_slug}/products/{slug}.md.", "title": "Organization Slug"}, "job_assessments": {"anyOf": [{"items": {"$ref": "#/components/schemas/JobAssessmentSchema"}, "type": "array"}, {"type": "null"}], "description": "Assessment presence for each selected job this product belongs to. Present only on job-filtered product lists. Repeated filters return one entry per matching membership. Expand documented_task_completions to read the assessments, scope, and conditions.", "title": "Job Assessments"}, "search_match": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "How this row matched the `search` term, present only on the product list endpoint when searching (absent on detail reads and unfiltered lists). `lexical`: the product's own text matched the query (full-text or substring) \u2014 a direct hit. `semantic`: the product surfaced only through meaning-similarity recall and may match the overall intent without satisfying every literal constraint of a compound query \u2014 verify it against your specific requirements before treating it as a match. Results are ordered by name-match tier (exact, then prefix, then substring, then other), then by name \u2014 not by a relevance score.", "title": "Search Match"}, "api_spec_ids": {"description": "Identifiers of API specifications for the product.", "items": {"format": "uuid", "type": "string"}, "title": "Api Spec Ids", "type": "array"}, "mcp_server_ids": {"description": "Identifiers of the product's server-side MCP servers. A non-empty list is the authoritative signal that the product exposes MCP server-side; this is the field to read for 'does it have MCP', not `web_mcp` (which tracks the separate in-browser WebMCP affordance). Expand `mcp_servers` for the full server records.", "items": {"format": "uuid", "type": "string"}, "title": "Mcp Server Ids", "type": "array"}, "a2a_server_ids": {"description": "Identifiers of A2A servers for the product.", "items": {"format": "uuid", "type": "string"}, "title": "A2A Server Ids", "type": "array"}, "developer_kit_ids": {"description": "Identifiers of developer kits for the product.", "items": {"format": "uuid", "type": "string"}, "title": "Developer Kit Ids", "type": "array"}, "command_line_interface_ids": {"description": "Identifiers of command-line interfaces for the product.", "items": {"format": "uuid", "type": "string"}, "title": "Command Line Interface Ids", "type": "array"}, "referral_program_ids": {"description": "Identifiers of referral programs for the product.", "items": {"format": "uuid", "type": "string"}, "title": "Referral Program Ids", "type": "array"}, "has_mcp": {"description": "True when the product has at least one cataloged server-side MCP server (a non-empty mcp_server_ids). This reads back the has_mcp search filter, so the affordance you filter on is the one you read. It reports catalog records, not confirmed absence: false means no MCP server is cataloged, so check attested_absences for a researched negative. Distinct from the web_mcp flag (in-browser WebMCP).", "title": "Has Mcp", "type": "boolean"}, "has_mcp_url": {"description": "True when at least one cataloged MCP server has a corroborated dialable endpoint url (it passed the submission handshake probe). Refines has_mcp, which also counts a server carrying only a documentation_url; false here means no dialable endpoint is cataloged, not a confirmed absence. Reads back the has_mcp_url filter; read connect.mcp_servers for the per-server url and documentation_url.", "title": "Has Mcp Url", "type": "boolean"}, "has_a2a": {"description": "True when the product has at least one cataloged A2A server (a non-empty a2a_server_ids). Reads back the has_a2a filter; false means none is cataloged, not confirmed absence (see attested_absences).", "title": "Has A2A", "type": "boolean"}, "has_api_spec": {"description": "True when the product has at least one cataloged API specification (a non-empty api_spec_ids). Reads back the has_api_spec filter; false means none is cataloged, not confirmed absence. Filter spec_type to require a particular kind (openapi, grpc, graphql).", "title": "Has Api Spec", "type": "boolean"}, "has_cli": {"description": "True when the product has at least one cataloged command-line interface (a non-empty command_line_interface_ids). Reads back the has_cli filter; false means none is cataloged, not confirmed absence.", "title": "Has Cli", "type": "boolean"}, "has_sdk": {"description": "True when the product has at least one cataloged developer kit / SDK (a non-empty developer_kit_ids). Reads back the has_sdk filter; false means none is cataloged, not confirmed absence. Filter sdk_language to require a kit in a particular programming language.", "title": "Has Sdk", "type": "boolean"}, "connect": {"$ref": "#/components/schemas/ProductConnectSchema", "description": "Resolved connect strings for the product's AI-native affordances, included without expand: the MCP endpoint url, the API spec_type and specification url, and each SDK's programming-language slugs. Skips the ID-to-expand round-trip (and the second-level developer_kits.programming_languages expand for the SDK language). Expand mcp_servers / api_specs / developer_kits for the full records."}, "id": {"description": "Stable identifier for the product, and the canonical dereferenceable key: fetch this record over the JSON API at /api/v1/catalog/products/{id}/ using this id. The slug is a display/URL value, not an API lookup key.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ProductLinksSchema", "description": "Canonical API links for the product."}, "ai_native_score": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Auto-computed AI-native score (0-100). Computed over the applicable dimensions only; not-applicable dimensions are excluded and the remaining weights renormalize (see ai_native_components).", "title": "Ai Native Score"}, "ai_native_tier": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Tier derived from the AI-native score (S/A/B/C/D).", "title": "Ai Native Tier"}, "coverage_score": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Research-coverage score (0-100): the share of scored decision fields (scalars and scored relations) that carry a known value rather than being unresearched. A second axis beside ai_native_score \u2014 it tells you how thoroughly the product was researched before you trust its grade, not how AI-native it is.", "title": "Coverage Score"}, "unrated": {"default": false, "description": "True when coverage_score is below the research threshold: research coverage is too low to assign a letter grade, so present the product as 'Unrated / needs research' in place of ai_native_tier. Derived from coverage_score (not stored).", "title": "Unrated", "type": "boolean"}, "ai_native_components": {"description": "Per-dimension score breakdown with effective + nominal weights and any not-applicable declarations.", "items": {"$ref": "#/components/schemas/ProductScoreComponentSchema"}, "title": "Ai Native Components", "type": "array"}, "attested_absences": {"description": "Scored fields confirmed absent by an attested check, so you can tell a researched 'no'/'false' from an unresearched gap. Each entry is a field_key, or 'field_key:label' for a negative scoped inside a relation (e.g. 'compliance_certifications:soc-2') \u2014 split on the first ':' since the field_key never contains one and the label is a reference-vocab slug. Expand absence_attestations for the full dated evidence behind each.", "items": {"type": "string"}, "title": "Attested Absences", "type": "array"}}, "required": ["actions", "name", "slug", "description", "relation_counts", "has_mcp", "has_mcp_url", "has_a2a", "has_api_spec", "has_cli", "has_sdk", "connect", "id", "links"], "title": "ProductSchema", "type": "object"}, "ProductScoreComponentSchema": {"description": "Score contribution with effective and nominal weights.\n\nExcluded dimensions carry a curator reason and zero effective weight.", "properties": {"label": {"description": "Human-readable dimension name.", "title": "Label", "type": "string"}, "anchor": {"description": "Stable anchor slug for the dimension.", "title": "Anchor", "type": "string"}, "raw": {"description": "Unweighted points earned, out of max_points.", "title": "Raw", "type": "integer"}, "max_points": {"description": "Maximum unweighted points for the dimension.", "title": "Max Points", "type": "integer"}, "weight": {"description": "Effective (renormalized) weight of the dimension in the composite; 0 when the dimension is not applicable.", "title": "Weight", "type": "number"}, "nominal_weight": {"description": "Fixed pre-renormalization weight of the dimension.", "title": "Nominal Weight", "type": "number"}, "weighted_contribution": {"description": "Points this dimension contributes to the 0-100 composite.", "title": "Weighted Contribution", "type": "number"}, "applicable": {"description": "False when the dimension is excluded as not applicable.", "title": "Applicable", "type": "boolean"}, "not_applicable_reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Curator justification when the dimension is not applicable.", "title": "Not Applicable Reason"}, "signals_fired": {"description": "Human-readable signals that contributed points.", "items": {"type": "string"}, "title": "Signals Fired", "type": "array"}}, "required": ["label", "anchor", "raw", "max_points", "weight", "nominal_weight", "weighted_contribution", "applicable"], "title": "ProductScoreComponentSchema", "type": "object"}, "ResourceLinksSchema": {"examples": [{"self": "/api/v1/catalog/organizations/8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17/"}], "properties": {"self": {"description": "Canonical API URL for this resource.", "title": "Self", "type": "string"}}, "required": ["self"], "title": "ResourceLinksSchema", "type": "object"}, "SubmissionActionSchema": {"examples": [{"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "list_url": "/api/v1/submissions/?app_label=catalog&model=organization&object_id=8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "target": {"app_label": "catalog", "model": "organization", "object_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "submission_kind": "update"}}], "properties": {"create_url": {"description": "API URL for creating a submission.", "title": "Create Url", "type": "string"}, "fields_url": {"description": "API URL for describing writable submission fields.", "title": "Fields Url", "type": "string"}, "list_url": {"description": "API URL for listing submissions for this target.", "title": "List Url", "type": "string"}, "target": {"$ref": "#/components/schemas/SubmissionTargetSchema", "description": "Submission target metadata for this resource."}}, "required": ["create_url", "fields_url", "list_url", "target"], "title": "SubmissionActionSchema", "type": "object"}, "SubmissionTargetSchema": {"examples": [{"app_label": "catalog", "create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "label": "Catalog organization", "model": "organization"}], "properties": {"app_label": {"description": "Django app label for the submission target.", "title": "App Label", "type": "string"}, "model": {"description": "Django model name for the submission target.", "title": "Model", "type": "string"}, "label": {"description": "Human-readable label for the submission target.", "title": "Label", "type": "string"}, "fields_url": {"description": "API URL for discovering writable fields for this target.", "title": "Fields Url", "type": "string"}, "create_url": {"description": "API URL for creating submissions for this target.", "title": "Create Url", "type": "string"}}, "required": ["app_label", "model", "label", "fields_url", "create_url"], "title": "SubmissionTargetSchema", "type": "object", "description": "Submission-capable model exposed by the public API."}, "PersonFilterSchema": {"properties": {"name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter by exact person name (case-insensitive).", "title": "Name"}, "slug": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter by person slug.", "title": "Slug"}, "affiliation_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Filter by organization affiliation identifier.", "title": "Affiliation Id"}}, "title": "PersonFilterSchema", "type": "object"}, "CursorPageSchema_PersonExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/PersonExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[PersonExpandedSchema]", "type": "object"}, "PersonExpandedSchema": {"examples": [{"actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "list_url": "/api/v1/submissions/?app_label=catalog&model=organization&object_id=8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "target": {"app_label": "catalog", "model": "organization", "object_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "submission_kind": "update"}}}, "affiliation_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "blog_url": "https://janedoe.dev/blog", "description": "Open source developer and AI tooling contributor.", "github_url": "https://github.com/janedoe", "id": "c3d4e5f6-a1b2-4c3d-8e5f-6a7b8c9d0e1f", "linkedin_url": "https://linkedin.com/in/janedoe", "links": {"self": "/api/v1/catalog/people/c3d4e5f6-a1b2-4c3d-8e5f-6a7b8c9d0e1f/"}, "logo_url": "https://janedoe.dev/avatar.png", "name": "Jane Doe", "orcid": "0000-0002-1825-0097", "products": [{"id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "name": "Example Tool", "organization_id": null, "organization_slug": null, "person_id": "c3d4e5f6-a1b2-4c3d-8e5f-6a7b8c9d0e1f", "slug": "example-tool"}], "slug": "jane-doe", "twitter_url": "https://x.com/janedoe", "url": "https://janedoe.dev"}], "properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Person name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug for the person.", "title": "Slug", "type": "string"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Personal website URL.", "title": "Url"}, "description": {"description": "Short description of the person.", "title": "Description", "type": "string"}, "logo_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Avatar or photo URL for the person.", "title": "Logo Url"}, "affiliation_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the organization the person is affiliated with.", "title": "Affiliation Id"}, "linkedin_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "LinkedIn profile URL.", "title": "Linkedin Url"}, "github_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "GitHub profile URL.", "title": "Github Url"}, "twitter_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Twitter/X profile URL.", "title": "Twitter Url"}, "blog_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Blog or newsletter URL.", "title": "Blog Url"}, "orcid": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "ORCID identifier (e.g. 0000-0002-1825-0097).", "title": "Orcid"}, "id": {"description": "Stable identifier for the person.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the person."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products maintained by this person when requested.", "title": "Products"}}, "required": ["id"], "title": "PersonExpandedSchema", "type": "object"}, "CompletionSupport": {"description": "Whether documentation shows the job completes end to end on the route.", "enum": ["", "documented_complete", "documented_partial"], "title": "CompletionSupport", "type": "string"}, "HumanRequirement": {"description": "Whether a human is required in one phase (setup or execution).", "enum": ["", "none", "required", "conditional"], "title": "HumanRequirement", "type": "string"}, "OnBehalfOf": {"description": "Whether documentation permits an agent to act for a principal on the route.", "enum": ["", "supported", "conditional", "prohibited"], "title": "OnBehalfOf", "type": "string"}, "RouteKind": {"description": "The one assessed route's interface kind.\n\nReuses the affordance vocabulary and adds ``web`` (the product's web UI\noperated through browser/computer use) and ``prose`` (a documented route with\nno published spec). ``web``, ``webmcp``, and ``prose`` carry no interface\nreference; the other kinds may reference the cataloged interface record.", "enum": ["api", "mcp", "a2a", "cli", "sdk", "webmcp", "agent_skill", "native_connector", "web", "prose"], "title": "RouteKind", "type": "string"}, "A2AServerSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "A2A server display name.", "title": "Name", "type": "string"}, "url": {"description": "Primary URL for the A2A server.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the A2A server.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the A2A server."}}, "required": ["actions", "product_id", "name", "url", "id", "links"], "title": "A2A Server", "type": "object"}, "AbsenceAttestationSchema": {"description": "Reproducible evidence of confirmed absence.\n\nBlank labels cover the whole field; non-blank labels scope a relation.\nThe submitter remains internal provenance.", "properties": {"field_key": {"$ref": "#/components/schemas/AbsenceFieldKey", "description": "The scored field confirmed absent. The value is the product's own scalar or relation name (as reported by the coverage endpoint); a filter for the same field can differ, e.g. a2a_servers filters on has_a2a."}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Reference-vocab value scoping the negative inside a relation (e.g. a compliance-cert slug); blank for a whole-scalar/whole-relation absence.", "title": "Label"}, "method": {"description": "The scoped check that confirmed the absence.", "title": "Method", "type": "string"}, "source_url": {"description": "The page that would carry the value if it were present.", "title": "Source Url", "type": "string"}, "checked_at": {"description": "When the scoped check was performed, dating the finding for later re-checking. It is not an expiry: the confirmed absence stands until superseded, so a past date does not revert the negative to unknown.", "format": "date-time", "title": "Checked At", "type": "string"}}, "required": ["field_key", "method", "source_url", "checked_at"], "title": "AbsenceAttestationSchema", "type": "object"}, "AbsenceFieldKey": {"description": "Which scored decision field an ``AbsenceAttestation`` records as absent.\n\nOne member per scored decision-axis scalar **and** scored relation, so a\nscalar (``web_mcp``) and its relation sibling (``mcp_servers``) are\ndistinct keys. The values are the model field names, which is exactly the\ncoverage denominator set in ``catalog/coverage.py`` \u2014 a test asserts the two\nstay in lockstep. Scalars are backed here only as the evidence of record for a\n``no``/``false`` value; a relation key with a blank label is a whole-relation\n\"confirmed none\" that an empty relation alone cannot express.", "enum": ["open_source", "self_hostable", "web_mcp", "headless_signup", "open_standards", "standard_protocol_access", "no_proprietary_sdk", "documented_provider_swap", "zero_data_retention", "no_training_on_user_data", "budget_caps", "sandbox_environment", "data_export", "data_import", "multi_factor_authentication", "trust_center_url", "llms_txt_url", "mcp_servers", "a2a_servers", "api_specs", "command_line_interfaces", "developer_kits", "agent_skills", "native_connectors", "compliance_certifications", "access_controls"], "title": "AbsenceFieldKey", "type": "string"}, "AccessControlSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "id": {"description": "Stable identifier for the access control.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the access control."}}, "required": ["actions", "slug", "name", "verbose_name", "id", "links"], "title": "AccessControlSchema", "type": "object"}, "AgentSkillSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "url": {"description": "Primary URL for the agent skill.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the agent skill.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the agent skill."}}, "required": ["actions", "slug", "name", "verbose_name", "url", "id", "links"], "title": "AgentSkillSchema", "type": "object"}, "ApiSpecSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "API spec display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "url": {"description": "Primary URL for the API spec.", "title": "Url", "type": "string"}, "spec_type": {"description": "API spec type such as openapi, graphql, or grpc.", "title": "Spec Type", "type": "string"}, "id": {"description": "Stable identifier for the API spec.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the API spec."}}, "required": ["actions", "product_id", "name", "slug", "url", "spec_type", "id", "links"], "title": "API Spec", "type": "object"}, "BenchmarkSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "url": {"description": "Primary URL for the benchmark.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the benchmark.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the benchmark."}}, "required": ["actions", "name", "slug", "verbose_name", "url", "id", "links"], "title": "BenchmarkSchema", "type": "object"}, "BillingModelSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "id": {"description": "Stable identifier for the billing model.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the billing model."}}, "required": ["actions", "slug", "name", "verbose_name", "id", "links"], "title": "BillingModelSchema", "type": "object"}, "CapabilitySchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Short description of the capability.", "title": "Description"}, "id": {"description": "Stable identifier for the capability.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the capability."}}, "required": ["actions", "slug", "name", "verbose_name", "id", "links"], "title": "CapabilitySchema", "type": "object"}, "CategoryExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "parent_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the parent category, if any.", "title": "Parent Id"}, "id": {"description": "Stable identifier for the category.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the category."}, "parent": {"anyOf": [{"$ref": "#/components/schemas/CategorySchema"}, {"type": "null"}], "description": "Expanded parent category when requested."}}, "required": ["id"], "title": "CategoryExpandedSchema", "type": "object"}, "CategorySchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "parent_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the parent category, if any.", "title": "Parent Id"}, "id": {"description": "Stable identifier for the category.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the category."}}, "required": ["actions", "slug", "name", "verbose_name", "id", "links"], "title": "CategorySchema", "type": "object"}, "CommandLineInterfaceSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "CLI display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "url": {"description": "Primary URL for the CLI.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the CLI.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the CLI."}}, "required": ["actions", "product_id", "name", "slug", "url", "id", "links"], "title": "CommandLineInterfaceSchema", "type": "object"}, "ComplianceCertificationSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "id": {"description": "Stable identifier for the compliance certification.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the compliance certification."}}, "required": ["actions", "name", "verbose_name", "slug", "id", "links"], "title": "ComplianceCertificationSchema", "type": "object"}, "DeveloperKitExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "Developer kit display name.", "title": "Name", "type": "string"}, "programming_language_ids": {"description": "Identifiers of programming languages for this developer kit.", "items": {"format": "uuid", "type": "string"}, "title": "Programming Language Ids", "type": "array"}, "license_ids": {"description": "Identifiers of licenses for this developer kit.", "items": {"format": "uuid", "type": "string"}, "title": "License Ids", "type": "array"}, "url": {"description": "Primary URL for the developer kit.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the developer kit.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the developer kit."}, "product": {"anyOf": [{"$ref": "#/components/schemas/ProductSchema"}, {"type": "null"}], "description": "Expanded product when requested."}, "programming_languages": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProgrammingLanguageSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded programming languages when requested.", "title": "Programming Languages"}, "licenses": {"anyOf": [{"items": {"$ref": "#/components/schemas/LicenseSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded licenses when requested.", "title": "Licenses"}}, "required": ["id"], "title": "DeveloperKitExpandedSchema", "type": "object"}, "DocumentationSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "url": {"description": "Primary URL for the documentation resource.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the documentation resource.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the documentation resource."}}, "required": ["actions", "name", "slug", "verbose_name", "url", "id", "links"], "title": "DocumentationSchema", "type": "object"}, "DocumentedTaskCompletionSchema": {"description": "Whether an agent can finish one job through the product on one route.\n\nAsserted from cited provider documentation, never an observed\nrun. The four assessments describe the one selected route (the coherent-path\nrule); a blank assessment is unknown and renders as null.", "properties": {"id": {"description": "The documented task completion record's id.", "title": "Id", "type": "string"}, "job_to_be_done_id": {"description": "The job this record assesses the product against.", "title": "Job To Be Done Id", "type": "string"}, "job_to_be_done_slug": {"description": "The assessed job's slug.", "title": "Job To Be Done Slug", "type": "string"}, "completion_support": {"anyOf": [{"enum": ["documented_complete", "documented_partial"], "type": "string"}, {"type": "null"}], "description": "Whether documentation shows the linked job completes by and large on the selected route: documented_complete, documented_partial, or null (unknown). Complete preserves the job's essential outcome; scope may limit cases or prerequisites, but a preliminary step alone is partial.", "title": "Completion Support"}, "setup_human_requirement": {"anyOf": [{"enum": ["none", "required", "conditional"], "type": "string"}, {"type": "null"}], "description": "Whether a person must perform a one-time setup step (login, account approval) before the agent operates: none, required, conditional, or null (unknown).", "title": "Setup Human Requirement"}, "execution_human_requirement": {"anyOf": [{"enum": ["none", "required", "conditional"], "type": "string"}, {"type": "null"}], "description": "Whether a person is needed on every task run (per-task confirmation, CAPTCHA): none, required, conditional, or null (unknown).", "title": "Execution Human Requirement"}, "on_behalf_of": {"anyOf": [{"enum": ["supported", "conditional", "prohibited"], "type": "string"}, {"type": "null"}], "description": "Whether documentation permits an agent to act for a principal on the selected route: supported, conditional, prohibited, or null (unknown).", "title": "On Behalf Of"}, "verdict": {"description": "Completion summary shared with HTML and Markdown. Finishes end to end requires documented_complete, execution_human_requirement=none, and on_behalf_of=supported. For documented_complete, conditional or prohibited delegation reads Finishes, delegation limited when no per-task human step is established. Read scope and conditions with this summary.", "title": "Verdict", "type": "string"}, "route_kind": {"$ref": "#/components/schemas/RouteKind", "description": "The interface kind of the one route assessed for this job. Product affordances such as has_mcp describe the product's recorded interfaces; they do not establish completion of this job through those interfaces. web is the product's web UI operated through browser/computer use; prose is a documented route with no published spec."}, "route_interface": {"anyOf": [{"$ref": "#/components/schemas/RouteInterfaceReferenceSchema"}, {"type": "null"}], "description": "The specific cataloged interface linked to this assessment. Null means no interface record is linked, including for web, webmcp, and prose routes. Read route_kind, scope, and conditions for the assessed workflow. Do not infer a link from the product's other interface records."}, "scope": {"description": "The record's scope: principal, exact outcome, prerequisites, the setup/execution boundary, and read limits.", "title": "Scope", "type": "string"}, "conditions": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "The cited handoff reason for a documented_partial or the cited trigger for a conditional requirement; null when no condition applies.", "title": "Conditions"}}, "required": ["id", "job_to_be_done_id", "job_to_be_done_slug", "verdict", "route_kind", "scope"], "title": "DocumentedTaskCompletionSchema", "type": "object"}, "FilterBreakdownSchema": {"description": "How an evidence-based filter partitions the products it faced.\n\nCounts over the leave-one-out candidate set \u2014 the list with search and every\n*other* active filter applied, the reported one lifted \u2014 so the three buckets\nalways sum to that candidate total.", "properties": {"matched": {"description": "Products the filter returned (the field holds the asked value).", "minimum": 0, "title": "Matched", "type": "integer"}, "recorded_nonmatch": {"description": "Products with recorded evidence that excludes the requested value.", "minimum": 0, "title": "Recorded Nonmatch", "type": "integer"}, "recorded_negative": {"anyOf": [{"minimum": 0, "type": "integer"}, {"type": "null"}], "deprecated": true, "description": "Compatibility alias of recorded_nonmatch for previously covered positive requests. Omitted for newly covered requests. Retained in /v1/.", "title": "Recorded Negative"}, "unknown": {"description": "Products whose requested value has neither a match nor a recorded negative. A different relation member does not prove absence. A high count indicates incomplete research for the requested value.", "minimum": 0, "title": "Unknown", "type": "integer"}}, "required": ["matched", "recorded_nonmatch", "unknown"], "title": "FilterBreakdownSchema", "type": "object"}, "JobToBeDoneExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Short description of the job to be done.", "title": "Description"}, "parent_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the parent job to be done, if any.", "title": "Parent Id"}, "product_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "On job lists, the number of products directly assigned to this job. Counts exclude child jobs.", "title": "Product Count"}, "assessment_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "On job lists, the number of products with a documented task completion record for this job, including partial and unknown assessments. Counts exclude child jobs.", "title": "Assessment Count"}, "id": {"description": "Stable identifier for the job to be done.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the job to be done."}, "parent": {"anyOf": [{"$ref": "#/components/schemas/JobToBeDoneSchema"}, {"type": "null"}], "description": "Expanded parent job to be done when requested."}}, "required": ["id"], "title": "Job To Be Done", "type": "object"}, "JobToBeDoneSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Short description of the job to be done.", "title": "Description"}, "parent_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the parent job to be done, if any.", "title": "Parent Id"}, "product_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "On job lists, the number of products directly assigned to this job. Counts exclude child jobs.", "title": "Product Count"}, "assessment_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "On job lists, the number of products with a documented task completion record for this job, including partial and unknown assessments. Counts exclude child jobs.", "title": "Assessment Count"}, "id": {"description": "Stable identifier for the job to be done.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the job to be done."}}, "required": ["actions", "slug", "name", "verbose_name", "id", "links"], "title": "Job To Be Done", "type": "object"}, "LicenseSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "spdx_id": {"description": "SPDX license identifier.", "title": "Spdx Id", "type": "string"}, "name": {"description": "License display name.", "title": "Name", "type": "string"}, "fsf_free_libre": {"default": false, "description": "Whether the license is FSF Free/Libre.", "title": "Fsf Free Libre", "type": "boolean"}, "osi_approved": {"default": false, "description": "Whether the license is OSI Approved.", "title": "Osi Approved", "type": "boolean"}, "id": {"description": "Stable identifier for the license.", "format": "uuid", "title": "Id", "type": "string"}, "slug": {"description": "Stable URL slug (the SPDX id lowercased).", "title": "Slug", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the license."}}, "required": ["actions", "spdx_id", "name", "id", "slug", "links"], "title": "LicenseSchema", "type": "object"}, "LocalMcpServerSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "Local MCP server display name.", "title": "Name", "type": "string"}, "url": {"description": "Install source for the local MCP server \u2014 the npm package page or source repository you install from, not a connection endpoint.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the local MCP server.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the local MCP server."}}, "required": ["actions", "product_id", "name", "url", "id", "links"], "title": "Local MCP Server", "type": "object"}, "McpServerSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "MCP server display name.", "title": "Name", "type": "string"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "The connectable MCP endpoint a client dials for this product: the base JSON-RPC URL. The submission check probes it with an MCP initialize handshake and accepts either a server response or an authentication challenge; it rejects an ordinary web page such as a setup guide. Put the setup or how-to-connect page in documentation_url. Remote endpoints may require authentication, so an unauthenticated success is not required. Supply only a concrete address that is safe to publish, without credentials; the schema cannot represent URL templates or local stdio commands. When the product publishes no single connectable endpoint, such as a per-account URL template, leave this empty and supply documentation_url on its own. Omitting the endpoint does not establish that the product lacks MCP support.", "examples": ["https://mcp.example.ai/mcp"], "title": "Url"}, "documentation_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "The page documenting how to connect to this MCP server. Supply it alongside the endpoint, or on its own when the product publishes no single connectable endpoint. The submission check confirms the page reads as MCP setup or connection documentation.", "examples": ["https://docs.example.ai/mcp"], "title": "Documentation Url"}, "id": {"description": "Stable identifier for the MCP server.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the MCP server."}}, "required": ["actions", "product_id", "name", "id", "links"], "title": "MCP Server", "type": "object"}, "MfaTypeSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "id": {"description": "Stable identifier for the MFA type.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the MFA type."}}, "required": ["actions", "slug", "name", "verbose_name", "id", "links"], "title": "MFA Type", "type": "object"}, "OrganizationSchema": {"examples": [{"actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "list_url": "/api/v1/submissions/?app_label=catalog&model=organization&object_id=8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "target": {"app_label": "catalog", "model": "organization", "object_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "submission_kind": "update"}}}, "description": "Vendor building AI-native workflow tools.", "founding_date": "2021-01-01", "funding_amount": "125000000.00", "id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "links": {"self": "/api/v1/catalog/organizations/8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17/"}, "logo_url": "https://cdn.example.ai/logo.png", "name": "Example AI", "slug": "example-ai", "ticker_symbol": "EXAI", "url": "https://example.ai"}], "properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Organization name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug for the organization.", "title": "Slug", "type": "string"}, "url": {"description": "Primary website URL for the organization.", "title": "Url", "type": "string"}, "description": {"description": "Short description of the organization.", "title": "Description", "type": "string"}, "logo_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Logo image URL for the organization, when available.", "title": "Logo Url"}, "ticker_symbol": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Public market ticker symbol aligned with schema.org tickerSymbol.", "title": "Ticker Symbol"}, "founding_date": {"anyOf": [{"format": "date", "type": "string"}, {"type": "null"}], "description": "Organization founding date aligned with schema.org foundingDate.", "title": "Founding Date"}, "funding_amount": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Total disclosed startup funding aligned with schema.org funding.", "title": "Funding Amount"}, "id": {"description": "Stable identifier for the organization.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the organization."}}, "required": ["actions", "name", "slug", "url", "description", "id", "links"], "title": "OrganizationSchema", "type": "object"}, "PaymentMethodSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug for the payment method.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name for the payment method.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name for the payment method.", "title": "Verbose Name", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Short explanation of what the payment method or protocol is.", "title": "Description"}, "id": {"description": "Stable identifier for the payment method.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the payment method."}}, "required": ["actions", "slug", "name", "verbose_name", "id", "links"], "title": "PaymentMethodSchema", "type": "object"}, "PersonSchema": {"examples": [{"actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "list_url": "/api/v1/submissions/?app_label=catalog&model=organization&object_id=8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "target": {"app_label": "catalog", "model": "organization", "object_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "submission_kind": "update"}}}, "affiliation_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "blog_url": "https://janedoe.dev/blog", "description": "Open source developer and AI tooling contributor.", "github_url": "https://github.com/janedoe", "id": "c3d4e5f6-a1b2-4c3d-8e5f-6a7b8c9d0e1f", "linkedin_url": "https://linkedin.com/in/janedoe", "links": {"self": "/api/v1/catalog/people/c3d4e5f6-a1b2-4c3d-8e5f-6a7b8c9d0e1f/"}, "logo_url": "https://janedoe.dev/avatar.png", "name": "Jane Doe", "orcid": "0000-0002-1825-0097", "slug": "jane-doe", "twitter_url": "https://x.com/janedoe", "url": "https://janedoe.dev"}], "properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Person name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug for the person.", "title": "Slug", "type": "string"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Personal website URL.", "title": "Url"}, "description": {"description": "Short description of the person.", "title": "Description", "type": "string"}, "logo_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Avatar or photo URL for the person.", "title": "Logo Url"}, "affiliation_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the organization the person is affiliated with.", "title": "Affiliation Id"}, "linkedin_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "LinkedIn profile URL.", "title": "Linkedin Url"}, "github_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "GitHub profile URL.", "title": "Github Url"}, "twitter_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Twitter/X profile URL.", "title": "Twitter Url"}, "blog_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Blog or newsletter URL.", "title": "Blog Url"}, "orcid": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "ORCID identifier (e.g. 0000-0002-1825-0097).", "title": "Orcid"}, "id": {"description": "Stable identifier for the person.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the person."}}, "required": ["actions", "name", "slug", "description", "id", "links"], "title": "PersonSchema", "type": "object"}, "PluginSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "id": {"description": "Stable identifier for the plugin.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the plugin."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "kind": {"description": "Plugin kind slug.", "title": "Kind", "type": "string"}, "name": {"description": "Plugin display name.", "title": "Name", "type": "string"}, "url": {"description": "Primary URL for the plugin.", "title": "Url", "type": "string"}}, "required": ["actions", "id", "links", "product_id", "kind", "name", "url"], "title": "Plugin", "type": "object"}, "PricingOption": {"additionalProperties": false, "properties": {"key": {"maxLength": 80, "minLength": 1, "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$", "title": "Key", "type": "string", "description": "Key for this record."}, "label": {"default": "", "maxLength": 120, "title": "Label", "type": "string", "description": "Human-readable label for this record."}, "price_kind": {"enum": ["fixed", "usage", "free", "custom", "unknown"], "title": "Price Kind", "type": "string", "description": "Price kind for this record."}, "amount": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Exact source amount; free normalizes omitted/null/zero to zero. Null for custom or unknown pricing.", "title": "Amount"}, "currency": {"default": "", "description": "Required for fixed/usage; free normalizes currency to blank.", "title": "Currency", "type": "string"}, "price_basis": {"default": "charge", "enum": ["charge", "monthly_equivalent"], "title": "Price Basis", "type": "string", "description": "Price basis for this record."}, "period": {"anyOf": [{"enum": ["hour", "day", "week", "month", "year", "one_time"], "type": "string"}, {"type": "null"}], "description": "Price denominator, independent of payment cadence.", "title": "Period"}, "unit": {"default": "", "maxLength": 80, "title": "Unit", "type": "string", "description": "Unit for this record."}, "unit_quantity": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Unit Quantity", "description": "Unit quantity for this record."}, "payment_cadence": {"anyOf": [{"enum": ["hourly", "daily", "weekly", "monthly", "quarterly", "yearly", "one_time", "on_use"], "type": "string"}, {"type": "null"}], "title": "Payment Cadence", "description": "Payment cadence for this record."}, "commitment_months": {"anyOf": [{"maximum": 1200, "minimum": 0, "type": "integer"}, {"type": "null"}], "description": "Minimum term in months; null unknown, zero no minimum.", "title": "Commitment Months"}, "description": {"default": "", "maxLength": 2000, "title": "Description", "type": "string", "description": "Human-readable description for this record."}}, "required": ["key", "price_kind"], "title": "PricingOption", "type": "object"}, "ProductExpandedSchema": {"description": "Product discovery metadata, review links, and optional inline relations.\n\nCollection keys are omitted until expanded (offers are included on detail\nreads). Expanded collections are arrays; [] means no cataloged records.\nUse expand to load omitted collections; fields alone does not load them.\nScalar null values keep their field-specific unknown or absent meaning.", "examples": [{"a2a_server_ids": [], "access_control_ids": ["22222222-2222-2222-2222-222222222222"], "account_required": true, "actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=product", "list_url": "/api/v1/submissions/?app_label=catalog&model=product&object_id=4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "target": {"app_label": "catalog", "model": "product", "object_id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "submission_kind": "update"}}}, "agent_skill_ids": ["33333333-3333-3333-3333-333333333333"], "api_spec_ids": [], "benchmark_ids": ["66666666-6666-6666-6666-666666666666"], "capability_ids": ["99999999-9999-9999-9999-999999999999"], "category_ids": ["88888888-8888-8888-8888-888888888888"], "command_line_interface_ids": [], "compliance_certification_ids": ["11111111-1111-1111-1111-111111111111"], "compliance_certifications": [{"actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "list_url": "/api/v1/submissions/?app_label=catalog&model=organization&object_id=8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "target": {"app_label": "catalog", "model": "organization", "object_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "submission_kind": "update"}}}, "id": "11111111-1111-1111-1111-111111111111", "links": {"self": "/api/v1/catalog/compliance-certifications/11111111-1111-1111-1111-111111111111/"}, "name": "SOC 2 Type II", "slug": "soc-2-type-ii", "verbose_name": "SOC 2 Type II"}], "data_export": "full", "data_import": "partial", "description": "Agent for customer support workflows.", "developer_kit_ids": [], "documentation_resource_ids": ["77777777-7777-7777-7777-777777777777"], "documentation_url": "https://example.ai/docs", "headless_signup": true, "id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "job_to_be_done_ids": ["aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"], "license_ids": ["55555555-5555-5555-5555-555555555555"], "links": {"reviews": "/api/v1/catalog/products/4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f/reviews/", "self": "/api/v1/catalog/products/4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f/"}, "llms_txt_url": "https://example.ai/docs/llms.txt", "logo_url": "https://cdn.example.ai/example-agent.png", "mcp_server_ids": [], "mcp_servers": [], "mfa_type_ids": ["44444444-4444-4444-4444-444444444444"], "multi_factor_authentication": "available", "name": "Example Agent", "no_training_on_user_data": "yes", "offers": [], "open_source": true, "open_standards": true, "organization": {"actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "list_url": "/api/v1/submissions/?app_label=catalog&model=organization&object_id=8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "target": {"app_label": "catalog", "model": "organization", "object_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "submission_kind": "update"}}}, "description": "Vendor building AI-native workflow tools.", "founding_date": "2021-01-01", "funding_amount": "125000000.00", "id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "links": {"self": "/api/v1/catalog/organizations/8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17/"}, "logo_url": "https://cdn.example.ai/logo.png", "name": "Example AI", "slug": "example-ai", "ticker_symbol": "EXAI", "url": "https://example.ai"}, "organization_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "organization_slug": "example-ai", "person_id": null, "pricing_url": "https://example.ai/pricing", "primary_category_id": "88888888-8888-8888-8888-888888888888", "privacy_policy_url": "https://example.ai/privacy", "referral_program_ids": [], "relation_counts": {"a2a_servers": 0, "access_controls": 1, "agent_skills": 1, "api_specs": 0, "command_line_interfaces": 0, "compliance_certifications": 1, "developer_kits": 0, "mcp_servers": 0, "native_connectors": 0}, "sandbox_environment": "yes", "self_hostable": true, "self_hosting_url": "https://example.ai/docs/self-hosting", "slug": "example-agent", "source_code_url": "https://github.com/example/example-agent", "stripe_projects": true, "switching_cost_notes": "Bulk CSV export preserves user data and relationships.", "terms_of_service_url": "https://example.ai/terms", "trust_center_url": "https://example.ai/trust", "url": "https://example.ai", "web_mcp": true, "zero_data_retention": "available"}], "properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "organization_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the organization that owns the product.", "title": "Organization Id"}, "person_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the person that maintains the product.", "title": "Person Id"}, "name": {"description": "Product name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug for the product.", "title": "Slug", "type": "string"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Use the product's official homepage for url, including for open-source projects. Use its implementation repository only when no separate official homepage exists. Put the repository in source_code_url, the docs home in documentation_url, and pricing in pricing_url. Check redirects and confirm product identity; a redirect to a publisher's site alone does not establish the publisher relationship.", "title": "Url"}, "pricing_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Pricing page URL for the product.", "title": "Pricing Url"}, "llms_txt_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Official llms.txt index for this product. Use a published URL on its site, docs subdomain or official hosted docs, including /docs/llms.txt; redirects to official docs hosts qualify. Verify content kind and product identity; guessed paths and HTML fallbacks are insufficient. Omit to keep; send an empty string to clear without evidence. Blank means unknown unless a whole-field absence_attestation is corroborated. For page_silence, cite the official product documentation homepage/index or official marketing homepage, complete enough to show or link the index across permitted hosts and paths. Grounded explicit_negative evidence needs product scope and qualifiers. A guessed 404, failed fetch, unrelated page or incomplete silence excerpt is insufficient. Confirmed absence earns coverage without Integration points. A verified URL earns coverage and +1 raw Integration point within the cap of 10.", "title": "Llms Txt Url"}, "documentation_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Documentation home / developer-docs portal \u2014 the single docs front door. Distinct from url (the product homepage) and from the documentation_resources relation, which links specific docs resources rather than the docs home.", "title": "Documentation Url"}, "description": {"description": "Short description of the product.", "title": "Description", "type": "string"}, "logo_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Logo image URL for the product, when available.", "title": "Logo Url"}, "trust_center_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Trust center URL giving access to vendor compliance reports.", "title": "Trust Center Url"}, "account_required": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether an account is required to use the product. True means yes; false means no; null means unknown, not false.", "title": "Account Required"}, "headless_signup": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether signup can be completed without a browser-based human step. True means yes; false means no; null means unknown, not false.", "title": "Headless Signup"}, "multi_factor_authentication": {"anyOf": [{"enum": ["unavailable", "available", "enforced"], "type": "string"}, {"type": "null"}], "description": "Availability or enforcement level of multi-factor authentication. unavailable means no MFA; available and enforced are the positive tiers; null means unknown.", "title": "Multi Factor Authentication"}, "zero_data_retention": {"anyOf": [{"enum": ["yes", "available", "no"], "type": "string"}, {"type": "null"}], "description": "Whether the product offers a zero-data-retention policy. yes is an unconditional default; available is conditional (must be enabled or applies only to certain plans); no means unsupported; null means unknown.", "title": "Zero Data Retention"}, "budget_caps": {"anyOf": [{"enum": ["yes", "no_billing", "available", "no"], "type": "string"}, {"type": "null"}], "description": "Hard spending caps that stop billable usage. yes means on by default; no_billing means the product is entirely free with no billable usage at all (not the free tier of a paid product); available means opt-in or limited plan/service scope; no means unsupported; null means unknown. Alerts alone do not qualify.", "title": "Budget Caps"}, "sandbox_environment": {"anyOf": [{"enum": ["yes", "available", "no"], "type": "string"}, {"type": "null"}], "description": "Whether the product offers a sandbox or test environment. yes means supported; available means optional; no means unsupported; null means unknown.", "title": "Sandbox Environment"}, "no_training_on_user_data": {"anyOf": [{"enum": ["yes", "available", "no"], "type": "string"}, {"type": "null"}], "description": "no_training_on_user_data describes the vendor-managed service, including LLM providers selected by the vendor. It measures whether confidential inputs can be reused to train or improve vendor/shared generative AI models, including foundation models. Predictive machine learning for recommendations, search ranking or fraud detection is outside this scope. Training a generative or foundation model remains in scope even when its purpose is recommendations. Training on publicly available data is also outside scope; a public-data exception does not weaken protection of non-public inputs. An exception alone establishes no guarantee. Customer-directed fine-tuning solely for that customer, with the resulting model private to them, is outside this scope even when the vendor performs the training. Private deployment alone establishes no training policy. This field covers training reuse; retention, access controls and other confidentiality protections need separate evidence. `yes` means an unconditional default no-training guarantee within that scope, requiring no customer action. `available` means a conditional policy: training off unless customers opt in, training on unless customers opt out, or protection limited to certain plans or settings. `yes` and `available` are mutually exclusive: `available` asserts documented training conditionality, not a weaker form of `yes` or incomplete evidence. A guarantee documented for one plan alone does not establish conditionality across the product; plan-limited `available` requires an explicit restriction or contrasting policies across plans. `no` means training with no opt-out. A missing value means unknown. A separately configured customer-selected external LLM provider is outside this scope; its own data policy does not by itself downgrade `yes` to `available`. Configuring an external provider does not establish consent to training. Vendor-selected providers remain in scope: evidence must cover their data handling as well as the vendor's. An external-provider exception alone supplies no evidence of the vendor-managed service's policy.", "title": "No Training On User Data"}, "data_export": {"anyOf": [{"enum": ["full", "partial", "none"], "type": "string"}, {"type": "null"}], "description": "Export of material user data: full means bulk transfer in open/interoperable formats; partial means documented coverage, fidelity, or format limits; none means no export capability; null means unknown.", "title": "Data Export"}, "data_import": {"anyOf": [{"enum": ["full", "partial", "none"], "type": "string"}, {"type": "null"}], "description": "Import of material user data: full means bulk transfer in open/interoperable formats; partial means limited coverage, fidelity, or format; none means no import capability; null means unknown.", "title": "Data Import"}, "open_standards": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product implements a named open, interoperable format or protocol for data exchange or integration, such as documented CSV transfer, iCalendar, OAuth 2.0, or MCP. HTTP/JSON transport or an optional vendor SDK alone does not establish this. True means yes; false means no; null means unknown, not false.", "title": "Open Standards"}, "standard_protocol_access": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product is accessible over a standard protocol (HTTP/OpenAPI, gRPC, GraphQL) rather than a proprietary-only client. True means yes; false means no; null means unknown, not false.", "title": "Standard Protocol Access"}, "no_proprietary_sdk": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product is usable without a single-vendor SDK (no proprietary-SDK lock-in). True means yes; false means no; null means unknown, not false.", "title": "No Proprietary Sdk"}, "documented_provider_swap": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether customers have a documented way to replace this product: an outbound migration guide or an interchangeable interface with documented replacement steps and limitations. Connecting a client or exporting data alone does not establish a replacement route. True means yes; false means no; null means unknown, not false.", "title": "Documented Provider Swap"}, "switching_cost_notes": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Free-text notes on migration complexity, retraining costs, contractual lock-in, or other switching cost factors.", "title": "Switching Cost Notes"}, "self_hostable": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product can run on user-controlled infrastructure (self-managed / on-premises) rather than only as a hosted service. Orthogonal to open_source. True means yes; false means no; null means unknown, not false.", "title": "Self Hostable"}, "open_source": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product's core is distributed under an open-source license. Orthogonal to self_hostable; see the licenses relation for the specific license(s). True means yes; false means no; null means unknown, not false.", "title": "Open Source"}, "source_code_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "The specific public repository for the product's own implementation. Use the official homepage for url when one exists; otherwise the repository may serve as both url and source_code_url. Supporting SDKs, clients, and examples belong in their matching relations.", "title": "Source Code Url"}, "self_hosting_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Link to the product's self-hosting or deployment guide, when self_hostable applies. Distinct from source_code_url: a product may be self-hostable without publishing open-source code.", "title": "Self Hosting Url"}, "web_mcp": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product exposes in-browser WebMCP tools (the `document.modelContext` browser API). This is the in-page WebMCP affordance only and is **not** a server-side MCP server: a product that ships a server-side MCP server but no in-browser tools has `web_mcp: null`. For server-side MCP exposure, read the `mcp_servers` relation (or `mcp_server_ids`) \u2014 a non-empty relation is the authoritative signal. Often `null`: WebMCP is an emerging draft standard few products ship yet, so null means 'unknown', not 'no MCP'. True means yes; false means no; null means unknown, not false.", "title": "Web Mcp"}, "stripe_projects": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the product can be provisioned through Stripe Projects, Stripe's CLI tool for provisioning third-party services from the terminal. When a product is on Stripe Projects, a developer or coding agent can create an account, generate a production API key, and set up billing for it from the terminal without a dashboard or manual signup. `true` is an agent-onboarding signal: an autonomous agent can sign the user up and start paying for the product programmatically. See https://docs.stripe.com/stripe-projects. It is a niche, terminal-driven distribution channel, so weight it only for headless or agent-driven provisioning workflows. True means yes; false means no; null means unknown, not false.", "title": "Stripe Projects"}, "privacy_policy_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Privacy policy URL for the product.", "title": "Privacy Policy Url"}, "terms_of_service_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Terms of service URL for the product.", "title": "Terms Of Service Url"}, "status_page_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Service status page URL for the product.", "title": "Status Page Url"}, "compliance_certification_ids": {"description": "Identifiers of compliance certifications associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Compliance Certification Ids", "type": "array"}, "access_control_ids": {"description": "Identifiers of access control capabilities associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Access Control Ids", "type": "array"}, "agent_skill_ids": {"description": "Identifiers of agent skills associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Agent Skill Ids", "type": "array"}, "mfa_type_ids": {"description": "Identifiers of supported multi-factor authentication types.", "items": {"format": "uuid", "type": "string"}, "title": "Mfa Type Ids", "type": "array"}, "license_ids": {"description": "Identifiers of licenses associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "License Ids", "type": "array"}, "benchmark_ids": {"description": "Identifiers of benchmarks associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Benchmark Ids", "type": "array"}, "documentation_resource_ids": {"description": "Identifiers of documentation resources associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Documentation Resource Ids", "type": "array"}, "category_ids": {"description": "Identifiers of categories associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Category Ids", "type": "array"}, "capability_ids": {"description": "Identifiers of capabilities associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Capability Ids", "type": "array"}, "job_to_be_done_ids": {"description": "Identifiers of jobs to be done associated with the product.", "items": {"format": "uuid", "type": "string"}, "title": "Job To Be Done Ids", "type": "array"}, "primary_category_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the product's primary category, if one is set.", "title": "Primary Category Id"}, "relation_counts": {"$ref": "#/components/schemas/ProductRelationCountsSchema", "description": "Record counts for every scored relation, included without expand. An omitted relation array does not mean it is empty. Before drafting relation creates, expand the populated relation to inspect existing records. Zero means no catalog records, not confirmed absence; check attested_absences for researched negatives. Every relation counted here, including native_connectors, is expandable to its full records by name."}, "organization_slug": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Owning organization's slug, or null for person-owned products. Use with the product slug to build /organizations/{organization_slug}/products/{slug}.md.", "title": "Organization Slug"}, "job_assessments": {"anyOf": [{"items": {"$ref": "#/components/schemas/JobAssessmentSchema"}, "type": "array"}, {"type": "null"}], "description": "Assessment presence for each selected job this product belongs to. Present only on job-filtered product lists. Repeated filters return one entry per matching membership. Expand documented_task_completions to read the assessments, scope, and conditions.", "title": "Job Assessments"}, "search_match": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "How this row matched the `search` term, present only on the product list endpoint when searching (absent on detail reads and unfiltered lists). `lexical`: the product's own text matched the query (full-text or substring) \u2014 a direct hit. `semantic`: the product surfaced only through meaning-similarity recall and may match the overall intent without satisfying every literal constraint of a compound query \u2014 verify it against your specific requirements before treating it as a match. Results are ordered by name-match tier (exact, then prefix, then substring, then other), then by name \u2014 not by a relevance score.", "title": "Search Match"}, "api_spec_ids": {"description": "Identifiers of API specifications for the product.", "items": {"format": "uuid", "type": "string"}, "title": "Api Spec Ids", "type": "array"}, "mcp_server_ids": {"description": "Identifiers of the product's server-side MCP servers. A non-empty list is the authoritative signal that the product exposes MCP server-side; this is the field to read for 'does it have MCP', not `web_mcp` (which tracks the separate in-browser WebMCP affordance). Expand `mcp_servers` for the full server records.", "items": {"format": "uuid", "type": "string"}, "title": "Mcp Server Ids", "type": "array"}, "a2a_server_ids": {"description": "Identifiers of A2A servers for the product.", "items": {"format": "uuid", "type": "string"}, "title": "A2A Server Ids", "type": "array"}, "developer_kit_ids": {"description": "Identifiers of developer kits for the product.", "items": {"format": "uuid", "type": "string"}, "title": "Developer Kit Ids", "type": "array"}, "command_line_interface_ids": {"description": "Identifiers of command-line interfaces for the product.", "items": {"format": "uuid", "type": "string"}, "title": "Command Line Interface Ids", "type": "array"}, "referral_program_ids": {"description": "Identifiers of referral programs for the product.", "items": {"format": "uuid", "type": "string"}, "title": "Referral Program Ids", "type": "array"}, "has_mcp": {"description": "True when the product has at least one cataloged server-side MCP server (a non-empty mcp_server_ids). This reads back the has_mcp search filter, so the affordance you filter on is the one you read. It reports catalog records, not confirmed absence: false means no MCP server is cataloged, so check attested_absences for a researched negative. Distinct from the web_mcp flag (in-browser WebMCP).", "title": "Has Mcp", "type": "boolean"}, "has_mcp_url": {"description": "True when at least one cataloged MCP server has a corroborated dialable endpoint url (it passed the submission handshake probe). Refines has_mcp, which also counts a server carrying only a documentation_url; false here means no dialable endpoint is cataloged, not a confirmed absence. Reads back the has_mcp_url filter; read connect.mcp_servers for the per-server url and documentation_url.", "title": "Has Mcp Url", "type": "boolean"}, "has_a2a": {"description": "True when the product has at least one cataloged A2A server (a non-empty a2a_server_ids). Reads back the has_a2a filter; false means none is cataloged, not confirmed absence (see attested_absences).", "title": "Has A2A", "type": "boolean"}, "has_api_spec": {"description": "True when the product has at least one cataloged API specification (a non-empty api_spec_ids). Reads back the has_api_spec filter; false means none is cataloged, not confirmed absence. Filter spec_type to require a particular kind (openapi, grpc, graphql).", "title": "Has Api Spec", "type": "boolean"}, "has_cli": {"description": "True when the product has at least one cataloged command-line interface (a non-empty command_line_interface_ids). Reads back the has_cli filter; false means none is cataloged, not confirmed absence.", "title": "Has Cli", "type": "boolean"}, "has_sdk": {"description": "True when the product has at least one cataloged developer kit / SDK (a non-empty developer_kit_ids). Reads back the has_sdk filter; false means none is cataloged, not confirmed absence. Filter sdk_language to require a kit in a particular programming language.", "title": "Has Sdk", "type": "boolean"}, "connect": {"$ref": "#/components/schemas/ProductConnectSchema", "description": "Resolved connect strings for the product's AI-native affordances, included without expand: the MCP endpoint url, the API spec_type and specification url, and each SDK's programming-language slugs. Skips the ID-to-expand round-trip (and the second-level developer_kits.programming_languages expand for the SDK language). Expand mcp_servers / api_specs / developer_kits for the full records."}, "id": {"description": "Stable identifier for the product, and the canonical dereferenceable key: fetch this record over the JSON API at /api/v1/catalog/products/{id}/ using this id. The slug is a display/URL value, not an API lookup key.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ProductLinksSchema", "description": "Canonical API links for the product."}, "ai_native_score": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Auto-computed AI-native score (0-100). Computed over the applicable dimensions only; not-applicable dimensions are excluded and the remaining weights renormalize (see ai_native_components).", "title": "Ai Native Score"}, "ai_native_tier": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Tier derived from the AI-native score (S/A/B/C/D).", "title": "Ai Native Tier"}, "coverage_score": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Research-coverage score (0-100): the share of scored decision fields (scalars and scored relations) that carry a known value rather than being unresearched. A second axis beside ai_native_score \u2014 it tells you how thoroughly the product was researched before you trust its grade, not how AI-native it is.", "title": "Coverage Score"}, "unrated": {"default": false, "description": "True when coverage_score is below the research threshold: research coverage is too low to assign a letter grade, so present the product as 'Unrated / needs research' in place of ai_native_tier. Derived from coverage_score (not stored).", "title": "Unrated", "type": "boolean"}, "ai_native_components": {"description": "Per-dimension score breakdown with effective + nominal weights and any not-applicable declarations.", "items": {"$ref": "#/components/schemas/ProductScoreComponentSchema"}, "title": "Ai Native Components", "type": "array"}, "attested_absences": {"description": "Scored fields confirmed absent by an attested check, so you can tell a researched 'no'/'false' from an unresearched gap. Each entry is a field_key, or 'field_key:label' for a negative scoped inside a relation (e.g. 'compliance_certifications:soc-2') \u2014 split on the first ':' since the field_key never contains one and the label is a reference-vocab slug. Expand absence_attestations for the full dated evidence behind each.", "items": {"type": "string"}, "title": "Attested Absences", "type": "array"}, "free_plan": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "True when the product has an active offer with a structured free pricing option (price_kind: free), so you can rank a shortlist by cost without opening each product. Reads back the free_plan filter. Null means unknown \u2014 offers carry no absence-attestation, so a product with no recorded free offer is unresearched, not a confirmed 'no free tier'; the value is therefore never false. A free tier can still carry quotas, eligibility, or noncommercial terms, so expand offers and read the terms before relying on it.", "title": "Free Plan"}, "organization": {"anyOf": [{"$ref": "#/components/schemas/OrganizationSchema"}, {"type": "null"}], "description": "Expanded organization associated with the product when requested."}, "person": {"anyOf": [{"$ref": "#/components/schemas/PersonSchema"}, {"type": "null"}], "description": "Expanded person associated with the product when requested."}, "compliance_certifications": {"anyOf": [{"items": {"$ref": "#/components/schemas/ComplianceCertificationSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded compliance certifications for the product when requested.", "title": "Compliance Certifications"}, "access_controls": {"anyOf": [{"items": {"$ref": "#/components/schemas/AccessControlSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded access controls for the product when requested.", "title": "Access Controls"}, "agent_skills": {"anyOf": [{"items": {"$ref": "#/components/schemas/AgentSkillSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded agent skills for the product when requested.", "title": "Agent Skills"}, "mfa_types": {"anyOf": [{"items": {"$ref": "#/components/schemas/MfaTypeSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded MFA types for the product when requested.", "title": "Mfa Types"}, "licenses": {"anyOf": [{"items": {"$ref": "#/components/schemas/LicenseSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded licenses for the product when requested.", "title": "Licenses"}, "benchmarks": {"anyOf": [{"items": {"$ref": "#/components/schemas/BenchmarkSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded benchmarks for the product when requested.", "title": "Benchmarks"}, "documentation_resources": {"anyOf": [{"items": {"$ref": "#/components/schemas/DocumentationSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded documentation resources for the product when requested.", "title": "Documentation Resources"}, "categories": {"anyOf": [{"items": {"$ref": "#/components/schemas/CategoryExpandedSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded categories for the product when requested.", "title": "Categories"}, "capabilities": {"anyOf": [{"items": {"$ref": "#/components/schemas/CapabilitySchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded capabilities for the product when requested.", "title": "Capabilities"}, "jobs_to_be_done": {"anyOf": [{"items": {"$ref": "#/components/schemas/JobToBeDoneExpandedSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded jobs to be done for the product when requested.", "title": "Jobs To Be Done"}, "offers": {"anyOf": [{"items": {"$ref": "#/components/schemas/PublicOfferExpandedSchema"}, "type": "array"}, {"type": "null"}], "description": "Structured offers, included by default on product detail responses unless excluded by fields. Empty when no offers are catalogued. Product lists include offers only with expand=offers.", "title": "Offers"}, "api_specs": {"anyOf": [{"items": {"$ref": "#/components/schemas/ApiSpecSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded API specs for the product when requested.", "title": "Api Specs"}, "mcp_servers": {"anyOf": [{"items": {"$ref": "#/components/schemas/McpServerSchema"}, "type": "array"}, {"type": "null"}], "description": "Server-side MCP records included with expand=mcp_servers; the key is omitted otherwise. An expanded empty array means no cataloged MCP servers. Read has_mcp, relation_counts.mcp_servers, or mcp_server_ids for presence without expansion. The web_mcp flag describes the separate in-browser WebMCP affordance.", "title": "Mcp Servers"}, "local_mcp_servers": {"anyOf": [{"items": {"$ref": "#/components/schemas/LocalMcpServerSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded local MCP server records, present only with `expand=local_mcp_servers`. Each is a package or source repository you install and run yourself (stdio transport), distinct from the remote endpoints in `mcp_servers`.", "title": "Local Mcp Servers"}, "a2a_servers": {"anyOf": [{"items": {"$ref": "#/components/schemas/A2AServerSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded A2A servers for the product when requested.", "title": "A2A Servers"}, "command_line_interfaces": {"anyOf": [{"items": {"$ref": "#/components/schemas/CommandLineInterfaceSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded command-line interfaces for the product when requested.", "title": "Command Line Interfaces"}, "developer_kits": {"anyOf": [{"items": {"$ref": "#/components/schemas/DeveloperKitExpandedSchema"}, "type": "array"}, {"type": "null"}], "description": "Developer kits included with expand=developer_kits. Request developer_kits.programming_languages or developer_kits.licenses to include those named records alongside their IDs.", "title": "Developer Kits"}, "referral_programs": {"anyOf": [{"items": {"$ref": "#/components/schemas/PublicReferralProgramSchema"}, "type": "array"}, {"type": "null"}], "description": "Public referral-program details for the product when requested.", "title": "Referral Programs"}, "plugins": {"anyOf": [{"items": {"$ref": "#/components/schemas/PluginSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded plugins for the product when requested.", "title": "Plugins"}, "absence_attestations": {"anyOf": [{"items": {"$ref": "#/components/schemas/AbsenceAttestationSchema"}, "type": "array"}, {"type": "null"}], "description": "Full confirmed-absence records for the product when requested with expand=absence_attestations. Each record carries field_key (the scored field confirmed absent), label (the reference-vocab value when the absence is scoped inside a relation, blank for a whole-field absence), and the dated evidence behind the finding: method, source_url, and checked_at. The always-present attested_absences field lists which fields are attested without expanding.", "title": "Absence Attestations"}, "documented_task_completions": {"anyOf": [{"items": {"$ref": "#/components/schemas/DocumentedTaskCompletionSchema"}, "type": "array"}, {"type": "null"}], "description": "Documented task completion records for the product when requested with expand=documented_task_completions. Each record is one (product, job) pair asserting, from cited provider documentation, whether an agent can finish that job end to end on one selected route, and which steps require a human or pre-delegated authority. Completion is a separate axis from the AI-native affordance score. Job filters preserve all records. Match job_to_be_done_slug or job_to_be_done_id to each selected job. Display its scope and conditions with its assessment. No matching record means unassessed, not unable to complete the job.", "title": "Documented Task Completions"}}, "required": ["id"], "title": "ProductExpandedSchema", "type": "object"}, "ProductListPageSchema": {"description": "Product list page with the weak-match signal and taxonomy routing.\n\nAdds three response-level fields to the shared page envelope, present only\nwhen a `search` term is applied (absent on unfiltered lists). They let a\nconsumer read match quality from the response instead of inspecting every\nrow's `search_match` label, and recover a task-shaped query that landed no\ndirect hit by switching to exact taxonomy membership. The same fields surface\nthrough MCP/WebMCP `search_products`. The `filter_breakdown` field\nis present only when an evidence-based filter is applied.", "properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/ProductExpandedSchema"}, "title": "Results", "type": "array"}, "strong_match": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "`true` when at least one returned product is a direct match: the product's own name or text matched the query (`search_match: lexical`). `false` when every returned product surfaced only through approximate meaning-similarity (`search_match: semantic`), or there were no results. On `false`, narrow the search with the suggested taxonomy below before relying on a result. The field is present only when a `search` term is applied; the key is absent otherwise.", "title": "Strong Match"}, "suggested_categories": {"anyOf": [{"items": {"$ref": "#/components/schemas/TaxonomySuggestionSchema"}, "type": "array"}, {"type": "null"}], "description": "Up to five categories whose name, verbose name, or slug matches the query, most-populated first (each carries a `product_count`). Pass a suggestion's `slug` to the `category` filter to switch from free-text search to exact membership. The key is present only when a `search` term is applied and `strong_match` is `false`; it is absent otherwise. An empty list means no category label contained the query words. Taxonomy matching is literal, so an empty list does not prove the catalog has no relevant category: retry with a shorter query (a single keyword) or browse the full `/categories/` list.", "title": "Suggested Categories"}, "suggested_jobs_to_be_done": {"anyOf": [{"items": {"$ref": "#/components/schemas/TaxonomySuggestionSchema"}, "type": "array"}, {"type": "null"}], "description": "Up to five jobs-to-be-done whose name, verbose name, description, or slug matches the query, most-populated first \u2014 the counterpart to `suggested_categories`. Pass a suggestion's `slug` to the `job_to_be_done` filter to switch from free-text search to exact membership. The key is present only when a `search` term is applied and `strong_match` is `false`; it is absent otherwise. An empty list carries the same meaning as for `suggested_categories`: the query words matched no job-to-be-done label, not that no relevant job exists. Retry with a shorter query or browse the full `/jobs-to-be-done/` list.", "title": "Suggested Jobs To Be Done"}, "filter_breakdown": {"anyOf": [{"additionalProperties": {"$ref": "#/components/schemas/FilterBreakdownSchema"}, "type": "object"}, {"type": "null"}], "description": "Counts for each supported filter over products that satisfy all other filters. Each entry reports matched, recorded_nonmatch, and unknown counts. Use these counts to distinguish confirmed absence from incomplete research without a second request. Reports both directions of affordance, boolean, policy, offer, and completion filters. Also reports spec_type, sdk_language, has_mcp_url, data_export requests including none, and certification, access-control, or agent-skill membership filters. Relation refinements use whole-relation absence as the recorded negative. A different member remains unknown for the requested value. Certification slug aliases share one OR group and report identical counts. The key is absent without a supported filter.", "title": "Filter Breakdown"}}, "required": ["count", "next", "previous", "results"], "title": "ProductListPageSchema", "type": "object"}, "ProgrammingLanguageSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Programming language name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "id": {"description": "Stable identifier for the programming language.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the programming language."}}, "required": ["actions", "name", "slug", "id", "links"], "title": "ProgrammingLanguageSchema", "type": "object"}, "PublicOfferExpandedSchema": {"examples": [{"billing_model_ids": ["dddddddd-dddd-dddd-dddd-dddddddddddd"], "description": "Production plan for support teams.", "lifecycle_status": "active", "name": "Pro", "payment_method_ids": ["cccccccc-cccc-cccc-cccc-cccccccccccc"], "price_description": "Per seat per month.", "pricing_options": [{"amount": "49.00", "currency": "EUR", "key": "pro-monthly", "period": "month", "price_kind": "fixed"}], "product_id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "slug": "pro", "sunset_at": null, "url": "https://example.ai/pricing#pro", "valid_from": "2026-01-01T00:00:00Z", "valid_through": null}, {"billing_model_ids": ["dddddddd-dddd-dddd-dddd-dddddddddddd"], "description": "Card processing fees for online payments.", "lifecycle_status": "deprecated", "name": "Standard Processing", "payment_method_ids": ["cccccccc-cccc-cccc-cccc-cccccccccccc"], "price_description": "2.9% + $0.30 per successful card charge.", "product_id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "slug": "standard-processing", "sunset_at": "2026-06-30T00:00:00Z", "url": "https://example.ai/pricing#standard-processing", "valid_from": "2026-01-01T00:00:00Z", "valid_through": null}], "properties": {"product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "Offer display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug for the offer.", "title": "Slug", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Short description of the offer.", "title": "Description"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "URL for the offer page.", "title": "Url"}, "pricing_options": {"description": "Pricing choices for one published plan; amounts are exact decimal strings. Empty means the pricing is carried in price_description.", "items": {"$ref": "#/components/schemas/PricingOption"}, "title": "Pricing Options", "type": "array"}, "price_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Concise human-readable pricing summary. Prefer this for percentage-based, mixed, quoted, tiered, or vendor-specific pricing such as `2.9% + $0.30 per successful card charge`.", "title": "Price Description"}, "lifecycle_status": {"default": "active", "description": "Lifecycle status of the offer.", "title": "Lifecycle Status", "type": "string"}, "sunset_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the offer was or will be sunset, if applicable.", "title": "Sunset At"}, "valid_from": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "Start of the offer validity period, if applicable.", "title": "Valid From"}, "valid_through": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "End of the offer validity period, if applicable.", "title": "Valid Through"}, "payment_method_ids": {"description": "Identifiers of payment methods accepted for this offer.", "items": {"format": "uuid", "type": "string"}, "title": "Payment Method Ids", "type": "array"}, "billing_model_ids": {"description": "Identifiers of billing models for this offer.", "items": {"format": "uuid", "type": "string"}, "title": "Billing Model Ids", "type": "array"}, "id": {"description": "Stable identifier for the offer.", "format": "uuid", "title": "Id", "type": "string"}, "payment_methods": {"anyOf": [{"items": {"$ref": "#/components/schemas/PaymentMethodSchema"}, "type": "array"}, {"type": "null"}], "description": "Payment methods included with expand=offers.payment_methods.", "title": "Payment Methods"}, "billing_models": {"anyOf": [{"items": {"$ref": "#/components/schemas/BillingModelSchema"}, "type": "array"}, {"type": "null"}], "description": "Billing models included with expand=offers.billing_models.", "title": "Billing Models"}}, "required": ["product_id", "name", "slug", "id"], "title": "PublicOfferExpandedSchema", "type": "object"}, "PublicReferralProgramSchema": {"description": "Embedded referral details without internal notes or affiliate tracking.", "properties": {"id": {"description": "Stable identifier for the referral program.", "format": "uuid", "title": "Id", "type": "string"}, "product_id": {"description": "Product associated with the program.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "Referral program name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug for the referral program.", "title": "Slug", "type": "string"}, "program_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "URL for the referral program page.", "title": "Program Url"}, "status": {"description": "Referral program status.", "title": "Status", "type": "string"}}, "required": ["id", "product_id", "name", "slug", "program_url", "status"], "title": "PublicReferralProgramSchema", "type": "object"}, "RouteInterfaceReferenceSchema": {"description": "The cataloged interface a programmatic selected route points at.\n\nPresent only when the route references an existing interface record; ``web``,\n``webmcp``, and ``prose`` routes carry no reference and omit it.", "properties": {"type": {"description": "The referenced interface's record type, e.g. mcpserver or apispec.", "title": "Type", "type": "string"}, "id": {"description": "The referenced interface record's id.", "title": "Id", "type": "string"}}, "required": ["type", "id"], "title": "RouteInterfaceReferenceSchema", "type": "object"}, "TaxonomySuggestionSchema": {"description": "One suggested category or job-to-be-done on a weak product search.\n\nA lightweight pointer, not a full taxonomy record: enough to show the term and\nto switch from recall to exact membership. Pass ``slug`` to ``search_products``\n(``?category=<slug>`` or ``?job_to_be_done=<slug>``) to filter by it.", "properties": {"id": {"description": "Stable identifier for the taxonomy term.", "format": "uuid", "title": "Id", "type": "string"}, "slug": {"description": "Stable URL slug. Pass to the product list `category` or `job_to_be_done` filter to retrieve members of this term.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "product_count": {"description": "Number of catalogued products under this term. Suggestions are returned most-populated first, so the first entry is the one most likely to return members when you filter by its slug.", "minimum": 0, "title": "Product Count", "type": "integer"}, "match_kind": {"default": "lexical", "description": "How this term was matched. `lexical` means the term's name, verbose name, slug, or description contained the query wording. `semantic` means the wording matched no label, so the term was surfaced as an embedding neighbour of the query's intent \u2014 a close fit worth checking, not a literal match. Lexical suggestions are listed before semantic ones.", "enum": ["lexical", "semantic"], "title": "Match Kind", "type": "string"}}, "required": ["id", "slug", "name", "verbose_name", "product_count"], "title": "TaxonomySuggestionSchema", "type": "object"}, "CursorPageSchema_PublicProductReviewSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/PublicProductReviewSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[PublicProductReviewSchema]", "type": "object"}, "PublicProductReviewSchema": {"examples": [{"approved_at": "2026-03-24T13:00:00Z", "comment": "Fast setup and strong API ergonomics.", "created_at": "2026-03-24T12:00:00Z", "id": "e5b5b1dc-6853-4ec4-bbc4-5959d2d5488f", "links": {"self": "/api/v1/catalog/products/4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f/reviews/e5b5b1dc-6853-4ec4-bbc4-5959d2d5488f/"}, "product_id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "rating": 5, "rejected_at": null, "rejection_reason": "", "status": "approved", "submitted_by_id": "a2f0f7f1-03b2-44d8-9d7e-cfac5c7f5720", "updated_at": "2026-03-24T13:00:00Z"}], "properties": {"id": {"description": "Stable identifier for the public product review.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the review."}, "product_id": {"description": "Identifier of the reviewed product.", "format": "uuid", "title": "Product Id", "type": "string"}, "rating": {"description": "Overall product rating from 1 to 5.", "title": "Rating", "type": "integer"}, "comment": {"description": "Submitted review comment.", "title": "Comment", "type": "string"}, "status": {"description": "Public moderation status for the review.", "title": "Status", "type": "string"}, "submitted_by_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the submitting user, if the review is attributed.", "title": "Submitted By Id"}, "created_at": {"description": "Timestamp when the review was created.", "title": "Created At", "type": "string"}, "updated_at": {"description": "Timestamp when the review was last updated.", "title": "Updated At", "type": "string"}, "approved_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Timestamp when the review was approved, if applicable.", "title": "Approved At"}, "rejected_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Timestamp when the review was rejected, if applicable.", "title": "Rejected At"}, "rejection_reason": {"description": "Reason the review was rejected, if applicable.", "title": "Rejection Reason", "type": "string"}}, "required": ["id", "links", "product_id", "rating", "comment", "status", "created_at", "updated_at", "rejection_reason"], "title": "PublicProductReviewSchema", "type": "object", "description": "Public product review record visible through the catalog API."}, "ProductReviewCreateIn": {"additionalProperties": false, "properties": {"rating": {"description": "Overall product rating from 1 to 5.", "maximum": 5, "minimum": 1, "title": "Rating", "type": "integer"}, "comment": {"description": "Review comment describing the product experience.", "title": "Comment", "type": "string"}, "callback_url": {"anyOf": [{"maxLength": 500, "type": "string"}, {"type": "null"}], "description": "Optional callback URL to receive an approval or rejection decision for this review.", "title": "Callback Url"}}, "required": ["rating", "comment"], "title": "ProductReviewCreateIn", "type": "object", "description": "Request body for creating a public product review for a specific product."}, "CursorPageSchema_ProgrammingLanguageExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/ProgrammingLanguageExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[ProgrammingLanguageExpandedSchema]", "type": "object"}, "DeveloperKitSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "Developer kit display name.", "title": "Name", "type": "string"}, "programming_language_ids": {"description": "Identifiers of programming languages for this developer kit.", "items": {"format": "uuid", "type": "string"}, "title": "Programming Language Ids", "type": "array"}, "license_ids": {"description": "Identifiers of licenses for this developer kit.", "items": {"format": "uuid", "type": "string"}, "title": "License Ids", "type": "array"}, "url": {"description": "Primary URL for the developer kit.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the developer kit.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the developer kit."}}, "required": ["actions", "product_id", "name", "programming_language_ids", "url", "id", "links"], "title": "DeveloperKitSchema", "type": "object"}, "ProgrammingLanguageExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Programming language name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "id": {"description": "Stable identifier for the programming language.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the programming language."}, "developer_kits": {"anyOf": [{"items": {"$ref": "#/components/schemas/DeveloperKitSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded developer kits when requested.", "title": "Developer Kits"}}, "required": ["id"], "title": "ProgrammingLanguageExpandedSchema", "type": "object"}, "CursorPageSchema_CategoryExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/CategoryExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[CategoryExpandedSchema]", "type": "object"}, "CapabilityExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Short description of the capability.", "title": "Description"}, "id": {"description": "Stable identifier for the capability.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the capability."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products when requested.", "title": "Products"}}, "required": ["id"], "title": "CapabilityExpandedSchema", "type": "object"}, "CursorPageSchema_CapabilityExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/CapabilityExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[CapabilityExpandedSchema]", "type": "object"}, "CursorPageSchema_JobToBeDoneExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/JobToBeDoneExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[JobToBeDoneExpandedSchema]", "type": "object"}, "ComplianceCertificationExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "id": {"description": "Stable identifier for the compliance certification.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the compliance certification."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products when requested.", "title": "Products"}}, "required": ["id"], "title": "ComplianceCertificationExpandedSchema", "type": "object"}, "CursorPageSchema_ComplianceCertificationExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/ComplianceCertificationExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[ComplianceCertificationExpandedSchema]", "type": "object"}, "AccessControlExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "id": {"description": "Stable identifier for the access control.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the access control."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products when requested.", "title": "Products"}}, "required": ["id"], "title": "AccessControlExpandedSchema", "type": "object"}, "CursorPageSchema_AccessControlExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/AccessControlExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[AccessControlExpandedSchema]", "type": "object"}, "AgentSkillExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "url": {"description": "Primary URL for the agent skill.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the agent skill.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the agent skill."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products when requested.", "title": "Products"}}, "required": ["id"], "title": "AgentSkillExpandedSchema", "type": "object"}, "CursorPageSchema_AgentSkillExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/AgentSkillExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[AgentSkillExpandedSchema]", "type": "object"}, "CursorPageSchema_MfaTypeExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/MfaTypeExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[MfaTypeExpandedSchema]", "type": "object"}, "MfaTypeExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "id": {"description": "Stable identifier for the MFA type.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the MFA type."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products when requested.", "title": "Products"}}, "required": ["id"], "title": "MFA Type", "type": "object"}, "CursorPageSchema_PaymentMethodExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/PaymentMethodExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[PaymentMethodExpandedSchema]", "type": "object"}, "OfferSchema": {"examples": [{"actions": {"submission": {"create_url": "/api/v1/submissions/", "fields_url": "/api/v1/submissions/fields/?app_label=catalog&model=organization", "list_url": "/api/v1/submissions/?app_label=catalog&model=organization&object_id=8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "target": {"app_label": "catalog", "model": "organization", "object_id": "8a658f4f-ec9a-4f57-8b93-0f8c6fce4b17", "submission_kind": "update"}}}, "billing_model_ids": ["dddddddd-dddd-dddd-dddd-dddddddddddd"], "description": "Production plan for support teams.", "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "lifecycle_status": "active", "links": {"self": "/api/v1/catalog/offers/bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb/"}, "name": "Pro", "payment_method_ids": ["cccccccc-cccc-cccc-cccc-cccccccccccc"], "price_description": "Per seat per month.", "pricing_options": [{"amount": "49.00", "currency": "EUR", "key": "pro-monthly", "period": "month", "price_kind": "fixed"}], "product_id": "4184ca00-b5e4-4b1b-bf14-b65dce9c5f2f", "slug": "pro", "sunset_at": null, "url": "https://example.ai/pricing#pro", "valid_from": "2026-01-01T00:00:00Z", "valid_through": null}], "properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "Offer display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug for the offer.", "title": "Slug", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Short description of the offer.", "title": "Description"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "URL for the offer page.", "title": "Url"}, "pricing_options": {"description": "Pricing choices for one published plan; amounts are exact decimal strings. Empty means the pricing is carried in price_description.", "items": {"$ref": "#/components/schemas/PricingOption"}, "title": "Pricing Options", "type": "array"}, "price_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Concise human-readable pricing summary. Prefer this for percentage-based, mixed, quoted, tiered, or vendor-specific pricing such as `2.9% + $0.30 per successful card charge`.", "title": "Price Description"}, "lifecycle_status": {"default": "active", "description": "Lifecycle status of the offer.", "title": "Lifecycle Status", "type": "string"}, "sunset_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the offer was or will be sunset, if applicable.", "title": "Sunset At"}, "valid_from": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "Start of the offer validity period, if applicable.", "title": "Valid From"}, "valid_through": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "End of the offer validity period, if applicable.", "title": "Valid Through"}, "payment_method_ids": {"description": "Identifiers of payment methods accepted for this offer.", "items": {"format": "uuid", "type": "string"}, "title": "Payment Method Ids", "type": "array"}, "billing_model_ids": {"description": "Identifiers of billing models for this offer.", "items": {"format": "uuid", "type": "string"}, "title": "Billing Model Ids", "type": "array"}, "id": {"description": "Stable identifier for the offer.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the offer."}}, "required": ["actions", "product_id", "name", "slug", "id", "links"], "title": "OfferSchema", "type": "object"}, "PaymentMethodExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug for the payment method.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name for the payment method.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name for the payment method.", "title": "Verbose Name", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "Short explanation of what the payment method or protocol is.", "title": "Description"}, "id": {"description": "Stable identifier for the payment method.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the payment method."}, "offers": {"anyOf": [{"items": {"$ref": "#/components/schemas/OfferSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded offers when requested.", "title": "Offers"}}, "required": ["id"], "title": "PaymentMethodExpandedSchema", "type": "object"}, "BillingModelExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "id": {"description": "Stable identifier for the billing model.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the billing model."}, "offers": {"anyOf": [{"items": {"$ref": "#/components/schemas/OfferSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded offers when requested.", "title": "Offers"}}, "required": ["id"], "title": "BillingModelExpandedSchema", "type": "object"}, "CursorPageSchema_BillingModelExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/BillingModelExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[BillingModelExpandedSchema]", "type": "object"}, "BenchmarkExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "url": {"description": "Primary URL for the benchmark.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the benchmark.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the benchmark."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products when requested.", "title": "Products"}}, "required": ["id"], "title": "BenchmarkExpandedSchema", "type": "object"}, "CursorPageSchema_BenchmarkExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/BenchmarkExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[BenchmarkExpandedSchema]", "type": "object"}, "CursorPageSchema_DocumentationExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/DocumentationExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[DocumentationExpandedSchema]", "type": "object"}, "DocumentationExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}, "url": {"description": "Primary URL for the documentation resource.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the documentation resource.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the documentation resource."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products when requested.", "title": "Products"}}, "required": ["id"], "title": "DocumentationExpandedSchema", "type": "object"}, "CursorPageSchema_LicenseExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/LicenseExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[LicenseExpandedSchema]", "type": "object"}, "LicenseExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "spdx_id": {"description": "SPDX license identifier.", "title": "Spdx Id", "type": "string"}, "name": {"description": "License display name.", "title": "Name", "type": "string"}, "fsf_free_libre": {"default": false, "description": "Whether the license is FSF Free/Libre.", "title": "Fsf Free Libre", "type": "boolean"}, "osi_approved": {"default": false, "description": "Whether the license is OSI Approved.", "title": "Osi Approved", "type": "boolean"}, "id": {"description": "Stable identifier for the license.", "format": "uuid", "title": "Id", "type": "string"}, "slug": {"description": "Stable URL slug (the SPDX id lowercased).", "title": "Slug", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the license."}, "products": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProductSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded products when requested.", "title": "Products"}, "developer_kits": {"anyOf": [{"items": {"$ref": "#/components/schemas/DeveloperKitSchema"}, "type": "array"}, {"type": "null"}], "description": "Expanded developer kits when requested.", "title": "Developer Kits"}}, "required": ["id"], "title": "LicenseExpandedSchema", "type": "object"}, "CommandLineInterfaceExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "CLI display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "url": {"description": "Primary URL for the CLI.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the CLI.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the CLI."}, "product": {"anyOf": [{"$ref": "#/components/schemas/ProductSchema"}, {"type": "null"}], "description": "Expanded product when requested."}}, "required": ["id"], "title": "CommandLineInterfaceExpandedSchema", "type": "object"}, "CursorPageSchema_CommandLineInterfaceExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/CommandLineInterfaceExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[CommandLineInterfaceExpandedSchema]", "type": "object"}, "CursorPageSchema_DeveloperKitExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/DeveloperKitExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[DeveloperKitExpandedSchema]", "type": "object"}, "ApiSpecExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "API spec display name.", "title": "Name", "type": "string"}, "slug": {"description": "Stable URL slug.", "title": "Slug", "type": "string"}, "url": {"description": "Primary URL for the API spec.", "title": "Url", "type": "string"}, "spec_type": {"description": "API spec type such as openapi, graphql, or grpc.", "title": "Spec Type", "type": "string"}, "id": {"description": "Stable identifier for the API spec.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the API spec."}, "product": {"anyOf": [{"$ref": "#/components/schemas/ProductSchema"}, {"type": "null"}], "description": "Expanded product when requested."}}, "required": ["id"], "title": "API Spec", "type": "object"}, "CursorPageSchema_ApiSpecExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/ApiSpecExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[ApiSpecExpandedSchema]", "type": "object"}, "A2AServerExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "A2A server display name.", "title": "Name", "type": "string"}, "url": {"description": "Primary URL for the A2A server.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the A2A server.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the A2A server."}, "product": {"anyOf": [{"$ref": "#/components/schemas/ProductSchema"}, {"type": "null"}], "description": "Expanded product when requested."}}, "required": ["id"], "title": "A2A Server", "type": "object"}, "CursorPageSchema_A2AServerExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/A2AServerExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[A2AServerExpandedSchema]", "type": "object"}, "CursorPageSchema_LocalMcpServerExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/LocalMcpServerExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[LocalMcpServerExpandedSchema]", "type": "object"}, "LocalMcpServerExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "Local MCP server display name.", "title": "Name", "type": "string"}, "url": {"description": "Install source for the local MCP server \u2014 the npm package page or source repository you install from, not a connection endpoint.", "title": "Url", "type": "string"}, "id": {"description": "Stable identifier for the local MCP server.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the local MCP server."}, "product": {"anyOf": [{"$ref": "#/components/schemas/ProductSchema"}, {"type": "null"}], "description": "Expanded product when requested."}}, "required": ["id"], "title": "Local MCP Server", "type": "object"}, "CursorPageSchema_McpServerExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/McpServerExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[McpServerExpandedSchema]", "type": "object"}, "McpServerExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "name": {"description": "MCP server display name.", "title": "Name", "type": "string"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "The connectable MCP endpoint a client dials for this product: the base JSON-RPC URL. The submission check probes it with an MCP initialize handshake and accepts either a server response or an authentication challenge; it rejects an ordinary web page such as a setup guide. Put the setup or how-to-connect page in documentation_url. Remote endpoints may require authentication, so an unauthenticated success is not required. Supply only a concrete address that is safe to publish, without credentials; the schema cannot represent URL templates or local stdio commands. When the product publishes no single connectable endpoint, such as a per-account URL template, leave this empty and supply documentation_url on its own. Omitting the endpoint does not establish that the product lacks MCP support.", "examples": ["https://mcp.example.ai/mcp"], "title": "Url"}, "documentation_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "description": "The page documenting how to connect to this MCP server. Supply it alongside the endpoint, or on its own when the product publishes no single connectable endpoint. The submission check confirms the page reads as MCP setup or connection documentation.", "examples": ["https://docs.example.ai/mcp"], "title": "Documentation Url"}, "id": {"description": "Stable identifier for the MCP server.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the MCP server."}, "product": {"anyOf": [{"$ref": "#/components/schemas/ProductSchema"}, {"type": "null"}], "description": "Expanded product when requested."}}, "required": ["id"], "title": "MCP Server", "type": "object"}, "CursorPageSchema_PluginExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/PluginExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[PluginExpandedSchema]", "type": "object"}, "PluginExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "id": {"description": "Stable identifier for the plugin.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the plugin."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "kind": {"description": "Plugin kind slug.", "title": "Kind", "type": "string"}, "name": {"description": "Plugin display name.", "title": "Name", "type": "string"}, "url": {"description": "Primary URL for the plugin.", "title": "Url", "type": "string"}, "product": {"anyOf": [{"$ref": "#/components/schemas/ProductSchema"}, {"type": "null"}], "description": "Expanded product when requested."}}, "required": ["id"], "title": "Plugin", "type": "object"}, "CursorPageSchema_NativeConnectorExpandedSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/NativeConnectorExpandedSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[NativeConnectorExpandedSchema]", "type": "object"}, "NativeConnectorExpandedSchema": {"properties": {"actions": {"$ref": "#/components/schemas/CatalogResourceActionsSchema", "description": "Submission-workflow actions for this resource. Returned for authenticated callers, who can act on them; omitted from anonymous reads, which cannot propose a change."}, "id": {"description": "Stable identifier for the native connector.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the native connector."}, "product_id": {"description": "Identifier of the associated product.", "format": "uuid", "title": "Product Id", "type": "string"}, "platform_slug": {"description": "Slug of the agent-client host platform that reaches the product through this connector (e.g. `claude`).", "title": "Platform Slug", "type": "string"}, "platform_name": {"description": "Agent-client host platform name.", "title": "Platform Name", "type": "string"}, "name": {"description": "Connector display name on the host platform.", "title": "Name", "type": "string"}, "url": {"description": "Optional URL to the connector's directory or setup page on the host platform.", "title": "Url", "type": "string"}, "product": {"anyOf": [{"$ref": "#/components/schemas/ProductSchema"}, {"type": "null"}], "description": "Expanded product when requested."}}, "required": ["id"], "title": "Native Connector", "type": "object"}, "CursorPageSchema_PluginKindSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/PluginKindSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[PluginKindSchema]", "type": "object"}, "PluginKindSchema": {"properties": {"id": {"description": "Stable identifier for the plugin kind.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the plugin kind."}, "slug": {"description": "Stable slug accepted by `plugins[].kind`.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}}, "required": ["id"], "title": "Plugin Kind", "type": "object"}, "CursorPageSchema_NativeConnectorPlatformSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/NativeConnectorPlatformSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[NativeConnectorPlatformSchema]", "type": "object"}, "NativeConnectorPlatformSchema": {"properties": {"id": {"description": "Stable identifier for the native connector platform.", "format": "uuid", "title": "Id", "type": "string"}, "links": {"$ref": "#/components/schemas/ResourceLinksSchema", "description": "Canonical API links for the native connector platform."}, "slug": {"description": "Stable slug accepted by `native_connectors[].platform`.", "title": "Slug", "type": "string"}, "name": {"description": "Short display name.", "title": "Name", "type": "string"}, "verbose_name": {"description": "Expanded human-readable name.", "title": "Verbose Name", "type": "string"}}, "required": ["id"], "title": "Native Connector Platform", "type": "object"}, "CoverageGapSchema": {"properties": {"field": {"title": "Field", "type": "string", "description": "Field for this record."}, "semantics": {"title": "Semantics", "type": "string", "description": "Semantics for this record."}, "schema_url": {"title": "Schema Url", "type": "string", "description": "URL for schema."}, "absence_page_class": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Absence Page Class", "description": "Absence page class for this record."}}, "required": ["field", "semantics", "schema_url", "absence_page_class"], "title": "CoverageGapSchema", "type": "object"}, "ProductCoverageSchema": {"properties": {"product_id": {"format": "uuid", "title": "Product Id", "type": "string", "description": "Identifier of the related product."}, "coverage_score": {"title": "Coverage Score", "type": "integer", "description": "Coverage score for this record."}, "denominator": {"title": "Denominator", "type": "integer", "description": "Denominator for this record."}, "known_count": {"title": "Known Count", "type": "integer", "description": "Known count for this record."}, "rated_threshold": {"title": "Rated Threshold", "type": "integer", "description": "Rated threshold for this record."}, "known_fields": {"items": {"type": "string"}, "title": "Known Fields", "type": "array", "description": "Known fields for this record."}, "supported_fields": {"items": {"type": "string"}, "title": "Supported Fields", "type": "array", "description": "Supported fields for this record."}, "confirmed_absent_fields": {"items": {"type": "string"}, "title": "Confirmed Absent Fields", "type": "array", "description": "Confirmed absent fields for this record."}, "uncorroborated_negative_fields": {"items": {"type": "string"}, "title": "Uncorroborated Negative Fields", "type": "array", "description": "Uncorroborated negative fields for this record."}, "missing_fields": {"items": {"type": "string"}, "title": "Missing Fields", "type": "array", "description": "Missing fields for this record."}, "gaps": {"items": {"$ref": "#/components/schemas/CoverageGapSchema"}, "title": "Gaps", "type": "array", "description": "Gaps for this record."}, "source_requirement": {"title": "Source Requirement", "type": "string", "description": "Source requirement for this record."}, "absence_guidance": {"title": "Absence Guidance", "type": "string", "description": "Absence guidance for this record."}, "advisory": {"title": "Advisory", "type": "string", "description": "Advisory for this record."}, "status": {"enum": ["rated", "unrated"], "title": "Status", "type": "string", "description": "Lifecycle or moderation status for this record."}}, "required": ["product_id", "coverage_score", "denominator", "known_count", "rated_threshold", "known_fields", "supported_fields", "confirmed_absent_fields", "uncorroborated_negative_fields", "missing_fields", "gaps", "source_requirement", "absence_guidance", "advisory", "status"], "title": "ProductCoverageSchema", "type": "object"}, "SubmissionFieldCatalogSchema": {"examples": [{"app_label": "catalog", "fields": [{"choices": null, "data_type": "string", "help_text": "Stable URL slug for the organization.", "implicit_on_nested_create": false, "label": "Slug", "name": "slug", "nested_create_note": null, "nullable": false, "operations": null, "payload_example": {"slug": "example-ai"}, "payload_examples": null, "payload_shape_description": "Provide a lowercase slug for the organization.", "related_model": null, "relation": false, "relation_kind": null, "required": true, "submission_kind": "scalar", "through_model": null, "validation": {"allow_blank": false, "decimal_places": null, "description": "Use lowercase letters, numbers, and hyphens only.", "format": null, "max_digits": null, "max_length": 255, "maximum": null, "min_length": 1, "minimum": null, "pattern": "^[a-z0-9-]+$", "plain_text_only": true}}], "model": "organization", "submission_payload_description": "Provide top-level organization fields and nested relation operations.", "submission_payload_example": {"description": "AI workflow platform.", "name": "Example AI", "slug": "example-ai", "url": "https://example.ai"}}], "properties": {"special_payload_fields": {"description": "Workflow payload members, separate from model fields.", "items": {"$ref": "#/components/schemas/SubmissionFieldSchema"}, "title": "Special Payload Fields", "type": "array"}, "app_label": {"description": "Django app label for the submission target.", "title": "App Label", "type": "string"}, "model": {"description": "Django model name for the submission target.", "title": "Model", "type": "string"}, "fields": {"description": "Writable fields available for submission payloads against this target.", "items": {"$ref": "#/components/schemas/SubmissionFieldSchema"}, "title": "Fields", "type": "array"}, "submission_payload_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Narrative guidance for the overall payload shape.", "title": "Submission Payload Description"}, "submission_payload_example": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "description": "Example submission payload for this target model.", "title": "Submission Payload Example"}}, "required": ["app_label", "model", "fields"], "title": "SubmissionFieldCatalogSchema", "type": "object", "description": "Catalog of writable fields for a submission target, including payload shape guidance."}, "SubmissionFieldCatalogSummarySchema": {"examples": [{"app_label": "catalog", "fields": [{"choices": null, "data_type": "string", "name": "slug", "nullable": false, "operations": null, "payload_shape_summary": "Provide a lowercase slug for the organization.", "related_fields_url": null, "relation": false, "required": true, "validation_summary": ["Plain text only.", "Maximum length: 255.", "Pattern: ^[a-z0-9-]+$."]}], "model": "organization", "submission_payload_summary": "Provide top-level organization fields and nested relation operations."}], "properties": {"special_payload_fields": {"description": "Workflow payload members, separate from model fields.", "items": {"$ref": "#/components/schemas/SubmissionFieldSchema"}, "title": "Special Payload Fields", "type": "array"}, "app_label": {"description": "Django app label for the submission target.", "title": "App Label", "type": "string"}, "model": {"description": "Django model name for the submission target.", "title": "Model", "type": "string"}, "fields": {"description": "Compact writable field summary for a submission target.", "items": {"$ref": "#/components/schemas/SubmissionFieldSummarySchema"}, "title": "Fields", "type": "array"}, "submission_payload_summary": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Short summary of the overall payload shape.", "title": "Submission Payload Summary"}}, "required": ["app_label", "model", "fields"], "title": "SubmissionFieldCatalogSummarySchema", "type": "object", "description": "Compact catalog of writable fields for a submission target."}, "SubmissionFieldSchema": {"examples": [{"choices": null, "data_type": "string", "help_text": "Stable URL slug for the organization.", "implicit_on_nested_create": false, "label": "Slug", "name": "slug", "nested_create_note": null, "nullable": false, "operations": null, "payload_example": {"slug": "example-ai"}, "payload_examples": null, "payload_shape_description": "Provide a lowercase slug for the organization.", "related_model": null, "relation": false, "relation_kind": null, "required": true, "submission_kind": "scalar", "through_model": null, "validation": {"allow_blank": false, "decimal_places": null, "description": "Use lowercase letters, numbers, and hyphens only.", "format": null, "max_digits": null, "max_length": 255, "maximum": null, "min_length": 1, "minimum": null, "pattern": "^[a-z0-9-]+$", "plain_text_only": true}}], "properties": {"name": {"description": "Field name expected in the submission payload.", "title": "Name", "type": "string"}, "label": {"description": "Human-readable label for the field.", "title": "Label", "type": "string"}, "data_type": {"description": "Primitive or composite data type for the field.", "title": "Data Type", "type": "string"}, "required": {"description": "Whether the field is required in the payload.", "title": "Required", "type": "boolean"}, "nullable": {"description": "Whether the field accepts a null value.", "title": "Nullable", "type": "boolean"}, "relation": {"description": "Whether the field targets another model.", "title": "Relation", "type": "boolean"}, "relation_kind": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Relationship type such as foreign key or many-to-many.", "title": "Relation Kind"}, "related_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Related Django model name when this field is relational.", "title": "Related Model"}, "related_fields_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "API URL for discovering the related model's writable submission fields when available.", "title": "Related Fields Url"}, "through_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Through model used for many-to-many relations when applicable.", "title": "Through Model"}, "submission_kind": {"default": "scalar", "description": "Payload shape category for this field, such as scalar or nested operation envelope.", "title": "Submission Kind", "type": "string"}, "operations": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Supported relation operations such as add, remove, create, or propose.", "title": "Operations"}, "help_text": {"default": "", "description": "Additional helper text for filling this field correctly.", "title": "Help Text", "type": "string"}, "choices": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Enumerated choices accepted for this field, when restricted.", "title": "Choices"}, "payload_shape_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Narrative explanation of the expected payload shape.", "title": "Payload Shape Description"}, "payload_example": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "description": "Example payload fragment for this field.", "title": "Payload Example"}, "payload_examples": {"anyOf": [{"items": {"$ref": "#/components/schemas/SubmissionPayloadTemplateSchema"}, "type": "array"}, {"type": "null"}], "description": "Alternative ready-to-fill payload templates for this field, one per common shape, when a single example cannot cover them.", "title": "Payload Examples"}, "nested_fields": {"anyOf": [{"items": {"$ref": "#/components/schemas/SubmissionFieldSchema"}, "type": "array"}, {"type": "null"}], "description": "Optional one-level inline field catalog for nested create or update relations.", "title": "Nested Fields"}, "implicit_on_nested_create": {"default": false, "description": "Whether the server supplies this field automatically during nested create operations.", "title": "Implicit On Nested Create", "type": "boolean"}, "nested_create_note": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Extra note about nested create behavior for this field.", "title": "Nested Create Note"}, "validation": {"anyOf": [{"$ref": "#/components/schemas/SubmissionFieldValidationSchema"}, {"type": "null"}], "description": "Validation constraints clients should satisfy for this field."}}, "required": ["name", "label", "data_type", "required", "nullable", "relation"], "title": "SubmissionFieldSchema", "type": "object", "description": "Description of a writable submission payload field for a target model."}, "SubmissionFieldSummarySchema": {"examples": [{"choices": null, "data_type": "string", "name": "slug", "nullable": false, "operations": null, "payload_shape_summary": "Provide a lowercase slug for the organization.", "related_fields_url": null, "relation": false, "required": true, "validation_summary": ["Plain text only.", "Maximum length: 255.", "Pattern: ^[a-z0-9-]+$."]}], "properties": {"name": {"description": "Field name expected in the submission payload.", "title": "Name", "type": "string"}, "required": {"description": "Whether the field is required in the payload.", "title": "Required", "type": "boolean"}, "nullable": {"description": "Whether the field accepts a null value.", "title": "Nullable", "type": "boolean"}, "data_type": {"description": "Primitive or composite data type for the field.", "title": "Data Type", "type": "string"}, "relation": {"description": "Whether the field targets another model.", "title": "Relation", "type": "boolean"}, "operations": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Supported relation operations such as add, remove, create, or propose.", "title": "Operations"}, "choices": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Enumerated choices accepted for this field, when restricted.", "title": "Choices"}, "related_fields_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "API URL for discovering the related model's writable submission fields when available.", "title": "Related Fields Url"}, "payload_shape_summary": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Short summary of the expected payload shape for this field.", "title": "Payload Shape Summary"}, "validation_summary": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "description": "Short validation hints clients should satisfy for this field.", "title": "Validation Summary"}}, "required": ["name", "required", "nullable", "data_type", "relation"], "title": "SubmissionFieldSummarySchema", "type": "object", "description": "Compact summary of a writable submission payload field for agent-first discovery."}, "SubmissionFieldValidationSchema": {"examples": [{"allow_blank": false, "decimal_places": null, "description": "Use lowercase letters, numbers, and hyphens only.", "format": null, "max_digits": null, "max_length": 255, "maximum": null, "min_length": 1, "minimum": null, "pattern": "^[a-z0-9-]+$", "plain_text_only": true}], "properties": {"allow_blank": {"description": "Whether an empty string is allowed.", "title": "Allow Blank", "type": "boolean"}, "plain_text_only": {"description": "Whether rich text or markup should be avoided.", "title": "Plain Text Only", "type": "boolean"}, "max_length": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Maximum allowed string length, if constrained.", "title": "Max Length"}, "min_length": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Minimum allowed string length, if constrained.", "title": "Min Length"}, "pattern": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Regular expression pattern the value must match, if any.", "title": "Pattern"}, "format": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Expected semantic format such as uri or email, if any.", "title": "Format"}, "minimum": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "description": "Minimum numeric value allowed, if constrained.", "title": "Minimum"}, "maximum": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "description": "Maximum numeric value allowed, if constrained.", "title": "Maximum"}, "max_digits": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Maximum total digits allowed for decimal values, if constrained.", "title": "Max Digits"}, "decimal_places": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Maximum decimal places allowed for decimal values, if constrained.", "title": "Decimal Places"}, "value_schema": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "description": "Validation schema for a structured JSON value.", "title": "Value Schema"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Additional validation guidance that does not fit a structured rule.", "title": "Description"}}, "required": ["allow_blank", "plain_text_only"], "title": "SubmissionFieldValidationSchema", "type": "object", "description": "Validation rules clients should follow when constructing a submission payload."}, "SubmissionPayloadTemplateSchema": {"examples": [{"description": "A plan billed on a repeating schedule.", "payload": {"pricing_options": [{"amount": "20.00", "commitment_months": 0, "currency": "USD", "key": "monthly", "label": "Monthly", "payment_cadence": "monthly", "period": "month", "price_basis": "charge", "price_kind": "fixed"}]}, "title": "Recurring plan"}], "properties": {"title": {"description": "Short label naming the shape this template fills.", "title": "Title", "type": "string"}, "description": {"description": "When to use this template instead of the others.", "title": "Description", "type": "string"}, "payload": {"additionalProperties": true, "description": "Ready-to-fill payload fragment for this field.", "title": "Payload", "type": "object"}}, "required": ["title", "description", "payload"], "title": "SubmissionPayloadTemplateSchema", "type": "object"}, "CursorPageSchema_SubmissionTargetSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/SubmissionTargetSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[SubmissionTargetSchema]", "type": "object"}, "CatalogSubmissionKind": {"enum": ["create", "update"], "title": "CatalogSubmissionKind", "type": "string", "description": "Indicates whether a submission creates a new catalog object or updates an existing one.", "x-enumDescriptions": ["Creates a new catalog object.", "Updates an existing catalog object."]}, "CatalogSubmissionStatus": {"enum": ["open", "merged", "closed"], "title": "CatalogSubmissionStatus", "type": "string", "description": "Submission lifecycle status from creation through final decision.", "x-enumDescriptions": ["Submission is open and awaiting a merge or close decision.", "Submission was accepted and its proposed change was applied.", "Submission ended without being merged."]}, "CursorPageSchema_PublicSubmissionSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/PublicSubmissionSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[PublicSubmissionSchema]", "type": "object"}, "PublicSubmissionSchema": {"examples": [{"app_label": "catalog", "counts": {"checks": 4, "events": 3, "reviews": 1}, "description": "Add a newly launched AI vendor and its first product. Evidence: https://example.ai and https://example.ai/docs.", "id": "71e7d0dd-3947-4d77-9620-7db568a4ea55", "links": {"catalog_object": null, "checks": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/checks/", "events": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/events/", "reviews": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/reviews/", "self": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/"}, "model": "organization", "object_id": "76cad11d-5dbd-409a-a1e8-2dc2f0fe7ffc", "payload": {"description": "AI workflow platform.", "name": "Example AI", "slug": "example-ai", "url": "https://example.ai"}, "resolution": {"closed": {"closed_at": null, "reason": null, "user": {"id": null, "username": null}}, "merged": {"merged_at": "2026-03-24T16:00:00Z", "summary": "Merged after verifying the referenced product launch.", "user": {"id": "a2f0f7f1-03b2-44d8-9d7e-cfac5c7f5720", "username": "agent-1"}}}, "review_ready": false, "status": "open", "submission_kind": "create", "submitted": {"submitted_at": "2026-03-24T14:30:00Z", "submitter": {"id": "a2f0f7f1-03b2-44d8-9d7e-cfac5c7f5720", "username": "agent-1"}}, "target_object_exists": false, "target_object_state": "proposed_create", "updated_at": "2026-03-24T15:10:00Z"}], "properties": {"id": {"description": "Stable identifier for the submission.", "format": "uuid", "title": "Id", "type": "string"}, "app_label": {"description": "Django app label for the target model.", "title": "App Label", "type": "string"}, "model": {"description": "Django model name for the target object.", "title": "Model", "type": "string"}, "object_id": {"description": "Stable identifier for the existing or proposed target object.", "format": "uuid", "title": "Object Id", "type": "string"}, "submission_kind": {"$ref": "#/components/schemas/CatalogSubmissionKind", "description": "Whether the submission proposes a create or update operation."}, "target_object_exists": {"description": "Whether the target object already exists in the catalog.", "title": "Target Object Exists", "type": "boolean"}, "target_object_state": {"description": "Whether `object_id` points at an existing record or a reserved identifier for a proposed create.", "enum": ["existing", "proposed_create"], "title": "Target Object State", "type": "string"}, "description": {"description": "Reviewer-facing summary of the submission, including the proposed change and any supporting evidence URLs or source notes.", "title": "Description", "type": "string"}, "payload": {"additionalProperties": true, "description": "Proposed field values or nested operations, excluding internal notes and affiliate tracking URLs at every nesting level.", "title": "Payload", "type": "object"}, "status": {"$ref": "#/components/schemas/CatalogSubmissionStatus", "description": "Submission lifecycle status. `open` means awaiting decision, `merged` means the proposed change was accepted and applied, and `closed` means the submission was declined or otherwise ended without being merged."}, "correction": {"anyOf": [{"$ref": "#/components/schemas/SubmissionCorrectionSchema"}, {"type": "null"}], "description": "Safe predecessor comparison, available to the author and staff with fields=correction."}, "processing": {"anyOf": [{"$ref": "#/components/schemas/SubmissionProcessingSchema"}, {"type": "null"}], "description": "Recorded review and curation progress, available to the author and staff via fields=processing. Null for other readers. Missing stage records have unknown timing. Submission status remains the final outcome; a failed stage does not mean rejection. Timestamps provide no completion estimate."}, "guidance": {"anyOf": [{"$ref": "#/components/schemas/SubmissionGuidanceSchema"}, {"type": "null"}], "description": "Opt-in via fields=guidance for the author or staff. Omitted for other readers. Contains only a next action, without processing diagnostics. Status and resolution remain authoritative."}, "check_feedback": {"description": "Failed or errored check diagnostics. Read links.checks for full evidence before repair. Correct rejected content before resubmitting; execution errors retry on the existing submission.", "items": {"$ref": "#/components/schemas/SubmissionCheckFeedbackSchema"}, "title": "Check Feedback", "type": "array"}, "review_ready": {"description": "Whether the submission has passed all required async checks and is ready for focused human review.", "title": "Review Ready", "type": "boolean"}, "links": {"$ref": "#/components/schemas/SubmissionLinksSchema", "description": "Related API URLs for the submission."}, "submitted": {"$ref": "#/components/schemas/SubmissionSubmittedSchema", "description": "Metadata about who submitted the proposal and when."}, "resolution": {"$ref": "#/components/schemas/SubmissionResolutionSchema", "description": "Merge and close resolution metadata for the submission."}, "counts": {"$ref": "#/components/schemas/SubmissionCountsSchema", "description": "Aggregate counts of related workflow records."}, "mergeable": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether a merge would currently clear the create-slug preflight: `true` when no catalog object owns the proposed slug, `false` when one does (see `merge_blocker`), `null` for update submissions and already-resolved (merged/closed) submissions. Reflects only the slug-conflict check, not a full dry-run apply \u2014 use `POST /submissions/validate/` for that. Opt-in: returned only when requested via `?fields=mergeable`.", "title": "Mergeable"}, "merge_blocker": {"anyOf": [{"$ref": "#/components/schemas/SubmissionConflictSchema"}, {"type": "null"}], "description": "The conflict a merge would raise right now, in the same shape as the 409 body from the merge endpoint, or `null` when there is none. Opt-in: returned only when requested via `?fields=merge_blocker`."}, "updated_at": {"description": "Timestamp when the submission last changed.", "title": "Updated At", "type": "string"}}, "required": ["id"], "title": "PublicSubmissionSchema", "type": "object", "description": "Public submission resource with lifecycle status, payload, and related workflow links."}, "SubmissionCheckFeedbackSchema": {"properties": {"check_type": {"description": "Check requiring attention.", "title": "Check Type", "type": "string"}, "status": {"description": "Failed blocks publication; errored means an execution failure.", "title": "Status", "type": "string"}, "summary": {"description": "Check outcome and explanation.", "title": "Summary", "type": "string"}, "claims": {"description": "Non-supported claims with payload paths when recorded, verdicts, rationales, citations and advisory status when recorded. Advisory taxonomy findings do not block fact-check execution. Insufficient evidence alone does not fail a check.", "items": {"additionalProperties": true, "type": "object"}, "title": "Claims", "type": "array"}, "decision_basis": {"description": "Check rationale when supplied, including outcomes without assessed claims.", "title": "Decision Basis", "type": "string"}}, "required": ["check_type", "status", "summary", "claims", "decision_basis"], "title": "SubmissionCheckFeedbackSchema", "type": "object"}, "SubmissionClosedResolutionSchema": {"examples": [{"closed_at": null, "reason": null, "user": {"id": null, "username": null}}], "properties": {"disposition": {"anyOf": [{"enum": ["closed", "withdrawn", "superseded"], "type": "string"}, {"type": "null"}], "description": "closed, withdrawn or superseded; null before closure.", "title": "Disposition"}, "successor_ids": {"description": "Explicit replacement submission IDs.", "items": {"format": "uuid", "type": "string"}, "title": "Successor Ids", "type": "array"}, "user": {"$ref": "#/components/schemas/SubmissionUserSchema", "description": "Actor that closed the submission."}, "closed_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Timestamp when the submission was closed, if applicable.", "title": "Closed At"}, "reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Reason the submission was closed without merging.", "title": "Reason"}}, "required": ["user"], "title": "SubmissionClosedResolutionSchema", "type": "object"}, "SubmissionConflictLinksSchema": {"examples": [{"existing_object": null, "reviews": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/reviews/", "submission": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/"}], "properties": {"submission": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "API URL for the conflicting submission, if one exists.", "title": "Submission"}, "reviews": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "API URL for listing or creating reviews on the conflicting submission, if one exists.", "title": "Reviews"}, "existing_object": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "API URL for the conflicting existing object, if available.", "title": "Existing Object"}}, "title": "SubmissionConflictLinksSchema", "type": "object"}, "SubmissionConflictSchema": {"examples": [{"app_label": "catalog", "code": "submission_conflict", "conflict_type": "open_submission_conflict", "detail": "An open create submission already exists for slug 'example-ai'.", "existing_object_id": null, "existing_submission_id": "71e7d0dd-3947-4d77-9620-7db568a4ea55", "links": {"reviews": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/reviews/", "submission": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/"}, "model": "organization", "slug": "example-ai"}], "properties": {"code": {"default": "submission_conflict", "description": "Machine-readable error code for this conflict response.", "title": "Code", "type": "string"}, "conflict_type": {"description": "Conflict category preventing the submission from being created.", "enum": ["open_submission_conflict", "existing_object_conflict"], "title": "Conflict Type", "type": "string"}, "detail": {"description": "Human-readable explanation of the conflict.", "title": "Detail", "type": "string"}, "app_label": {"description": "Django app label for the conflicting target.", "title": "App Label", "type": "string"}, "model": {"description": "Django model name for the conflicting target.", "title": "Model", "type": "string"}, "slug": {"description": "Slug value involved in the conflict.", "title": "Slug", "type": "string"}, "name": {"default": "", "description": "Name value involved in the conflict, set when the conflict is keyed on the (publisher, name) uniqueness rather than the slug.", "title": "Name", "type": "string"}, "existing_submission_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the conflicting open submission, if one exists.", "title": "Existing Submission Id"}, "existing_object_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the conflicting existing catalog object, if one exists.", "title": "Existing Object Id"}, "links": {"anyOf": [{"$ref": "#/components/schemas/SubmissionConflictLinksSchema"}, {"type": "null"}], "description": "Actionable URLs for inspecting the conflicting submission or contributing review feedback."}}, "required": ["conflict_type", "detail", "app_label", "model", "slug"], "title": "SubmissionConflictSchema", "type": "object"}, "SubmissionCorrectionAddedSchema": {"properties": {"path": {"description": "JSON-pointer path within the compared snapshots.", "title": "Path", "type": "string"}, "kind": {"const": "added", "title": "Kind", "type": "string", "description": "Kind for this record."}, "after": {"$ref": "#/components/schemas/JsonValue", "description": "The added value, including JSON null."}}, "required": ["path", "kind", "after"], "title": "SubmissionCorrectionAddedSchema", "type": "object"}, "SubmissionCorrectionChangedSchema": {"properties": {"path": {"description": "JSON-pointer path within the compared snapshots.", "title": "Path", "type": "string"}, "kind": {"const": "changed", "title": "Kind", "type": "string", "description": "Kind for this record."}, "before": {"$ref": "#/components/schemas/JsonValue", "description": "The previous value, including JSON null."}, "after": {"$ref": "#/components/schemas/JsonValue", "description": "The current value, including JSON null."}}, "required": ["path", "kind", "before", "after"], "title": "SubmissionCorrectionChangedSchema", "type": "object"}, "SubmissionCorrectionRemovedSchema": {"properties": {"path": {"description": "JSON-pointer path within the compared snapshots.", "title": "Path", "type": "string"}, "kind": {"const": "removed", "title": "Kind", "type": "string", "description": "Kind for this record."}, "before": {"$ref": "#/components/schemas/JsonValue", "description": "The removed value, including JSON null."}}, "required": ["path", "kind", "before"], "title": "SubmissionCorrectionRemovedSchema", "type": "object"}, "SubmissionCorrectionSchema": {"properties": {"previous_submission": {"description": "The rejected submission that this correction references.", "format": "uuid", "title": "Previous Submission", "type": "string"}, "before": {"$ref": "#/components/schemas/SubmissionCorrectionSnapshotSchema", "description": "The rejected predecessor snapshot."}, "after": {"$ref": "#/components/schemas/SubmissionCorrectionSnapshotSchema", "description": "The current correction snapshot."}, "changes": {"description": "Added, removed and changed values in the safe comparison.", "items": {"discriminator": {"mapping": {"added": "#/components/schemas/SubmissionCorrectionAddedSchema", "changed": "#/components/schemas/SubmissionCorrectionChangedSchema", "removed": "#/components/schemas/SubmissionCorrectionRemovedSchema"}, "propertyName": "kind"}, "oneOf": [{"$ref": "#/components/schemas/SubmissionCorrectionAddedSchema"}, {"$ref": "#/components/schemas/SubmissionCorrectionRemovedSchema"}, {"$ref": "#/components/schemas/SubmissionCorrectionChangedSchema"}]}, "title": "Changes", "type": "array"}}, "required": ["previous_submission", "before", "after", "changes"], "title": "SubmissionCorrectionSchema", "type": "object"}, "SubmissionCorrectionSnapshotSchema": {"properties": {"payload": {"additionalProperties": {"$ref": "#/components/schemas/JsonValue"}, "description": "Complete submitted payload after internal-field redaction.", "title": "Payload", "type": "object"}, "description": {"description": "The submitted change justification.", "title": "Description", "type": "string"}}, "required": ["payload", "description"], "title": "SubmissionCorrectionSnapshotSchema", "type": "object"}, "SubmissionCountsSchema": {"examples": [{"checks": 4, "events": 3, "reviews": 1}], "properties": {"checks": {"description": "Number of async check records on the submission.", "title": "Checks", "type": "integer"}, "reviews": {"description": "Number of review records on the submission.", "title": "Reviews", "type": "integer"}, "events": {"description": "Number of lifecycle events recorded for the submission.", "title": "Events", "type": "integer"}}, "required": ["checks", "reviews", "events"], "title": "SubmissionCountsSchema", "type": "object"}, "SubmissionGuidanceSchema": {"description": "Submitter actions independent of private processing stages.", "properties": {"next_action": {"description": "Advisory next action. Prepare a correction while open, but wait for terminal closure before submitting it. Resubmission still requires validation and conflict checks. None means no action on this proposal.", "enum": ["wait", "prepare_correction", "revise_and_resubmit", "none"], "title": "Next Action", "type": "string"}}, "required": ["next_action"], "title": "SubmissionGuidanceSchema", "type": "object"}, "SubmissionLinksSchema": {"examples": [{"catalog_object": "/api/v1/catalog/organizations/76cad11d-5dbd-409a-a1e8-2dc2f0fe7ffc/", "checks": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/checks/", "events": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/events/", "reviews": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/reviews/", "self": "/api/v1/submissions/71e7d0dd-3947-4d77-9620-7db568a4ea55/"}], "properties": {"self": {"description": "API URL for this submission resource.", "title": "Self", "type": "string"}, "reviews": {"description": "API URL for this submission's review records.", "title": "Reviews", "type": "string"}, "checks": {"description": "API URL for this submission's async checks.", "title": "Checks", "type": "string"}, "events": {"description": "API URL for this submission's event history.", "title": "Events", "type": "string"}, "catalog_object": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Catalog read API URL for the target record, once it exists and is dereferenceable: an update's existing target, or a create's record after the submission merges (the create's reserved `object_id` becomes the catalog record's `id`). `null` while a create is still open or was closed without merging, and for the one target model with no public catalog detail route (offer).", "title": "Catalog Object"}}, "required": ["self", "reviews", "checks", "events"], "title": "SubmissionLinksSchema", "type": "object"}, "SubmissionMergedResolutionSchema": {"examples": [{"merged_at": "2026-03-24T16:00:00Z", "summary": "Merged after verifying the referenced product launch.", "user": {"id": "a2f0f7f1-03b2-44d8-9d7e-cfac5c7f5720", "username": "agent-1"}}], "properties": {"user": {"$ref": "#/components/schemas/SubmissionUserSchema", "description": "Actor that merged the submission."}, "merged_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Timestamp when the submission was merged, if applicable.", "title": "Merged At"}, "summary": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Summary explaining why the submission was merged.", "title": "Summary"}}, "required": ["user"], "title": "SubmissionMergedResolutionSchema", "type": "object"}, "SubmissionProcessingSchema": {"properties": {"review": {"anyOf": [{"$ref": "#/components/schemas/SubmissionStageProgressSchema"}, {"type": "null"}], "description": "Review for this record."}, "curation": {"anyOf": [{"$ref": "#/components/schemas/SubmissionStageProgressSchema"}, {"type": "null"}], "description": "Curation for this record."}}, "title": "SubmissionProcessingSchema", "type": "object"}, "SubmissionResolutionSchema": {"examples": [{"closed": {"closed_at": null, "reason": null, "user": {"id": null, "username": null}}, "merged": {"merged_at": "2026-03-24T16:00:00Z", "summary": "Merged after verifying the referenced product launch.", "user": {"id": "a2f0f7f1-03b2-44d8-9d7e-cfac5c7f5720", "username": "agent-1"}}}], "properties": {"merged": {"$ref": "#/components/schemas/SubmissionMergedResolutionSchema", "description": "Merge resolution details for the submission."}, "closed": {"$ref": "#/components/schemas/SubmissionClosedResolutionSchema", "description": "Close resolution details for the submission."}}, "required": ["merged", "closed"], "title": "SubmissionResolutionSchema", "type": "object"}, "SubmissionStageProgressSchema": {"properties": {"state": {"description": "Last recorded stage state. Running records worker pickup.", "enum": ["queued", "running", "completed", "failed"], "title": "State", "type": "string"}, "queued_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Recorded queue timestamp, if known.", "title": "Queued At"}, "started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Most recent worker pickup timestamp, if known.", "title": "Started At"}, "last_progress_at": {"description": "Last recorded stage transition; not a heartbeat.", "title": "Last Progress At", "type": "string"}}, "required": ["state", "queued_at", "started_at", "last_progress_at"], "title": "SubmissionStageProgressSchema", "type": "object"}, "SubmissionSubmittedSchema": {"examples": [{"submitted_at": "2026-03-24T14:30:00Z", "submitter": {"id": "a2f0f7f1-03b2-44d8-9d7e-cfac5c7f5720", "username": "agent-1"}}], "properties": {"submitted_at": {"description": "Timestamp when the submission was created.", "title": "Submitted At", "type": "string"}, "submitter": {"$ref": "#/components/schemas/SubmissionUserSchema", "description": "Actor that created the submission."}}, "required": ["submitted_at", "submitter"], "title": "SubmissionSubmittedSchema", "type": "object"}, "SubmissionUserSchema": {"examples": [{"id": "a2f0f7f1-03b2-44d8-9d7e-cfac5c7f5720", "username": "agent-1"}], "properties": {"id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "User identifier for the actor in this workflow step, if available.", "title": "Id"}, "username": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Username for the actor in this workflow step, if available.", "title": "Username"}}, "title": "SubmissionUserSchema", "type": "object"}, "SubmissionCreateIn": {"additionalProperties": false, "examples": [{"app_label": "catalog", "description": "Add a newly launched vendor and product. Evidence: https://example.ai and https://example.ai/docs.", "model": "organization", "payload": {"description": "AI workflow platform.", "name": "Example AI", "products": {"create": [{"capabilities": {"add": ["11111111-1111-1111-1111-111111111111"], "propose": [{"description": "Automates policy checks and moderation decisions.", "name": "Policy Enforcement"}]}, "categories": {"add": ["00000000-0000-0000-0000-000000000000"], "propose": [{"description": "Software for reviewing and enforcing content policy.", "name": "Content Moderation"}]}, "description": "Agent for customer support workflows.", "jobs_to_be_done": {"add": ["22222222-2222-2222-2222-222222222222"], "propose": [{"description": "Help teams triage and enforce content policy.", "name": "Review User-Generated Content"}]}, "name": "Example Agent", "slug": "example-agent", "url": "https://example.ai/agent"}]}, "slug": "example-ai", "url": "https://example.ai"}, "submission_kind": "create"}], "properties": {"previous_submission": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Your rejected update to the same existing object. The correction receives all ordinary checks and review.", "title": "Previous Submission"}, "app_label": {"description": "Lowercase Django app label for the target model.", "examples": ["catalog"], "title": "App Label", "type": "string"}, "model": {"description": "Lowercase Django model name for the target content type.", "examples": ["organization"], "title": "Model", "type": "string"}, "object_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Target object UUID. Required for update submissions. Optional for create submissions; when omitted, the server reserves a UUID for the proposed future object.", "title": "Object Id"}, "submission_kind": {"allOf": [{"$ref": "#/components/schemas/CatalogSubmissionKind"}], "default": "update", "description": "Whether the submission updates an existing object or creates a new one."}, "description": {"description": "Required summary of the proposed change for reviewers. Include the change description plus evidence URLs, source notes, or other context that helps validate the submission.", "maxLength": 8000, "title": "Description", "type": "string"}, "callback_url": {"anyOf": [{"maxLength": 500, "type": "string"}, {"type": "null"}], "description": "Optional callback URL to receive merge/close decisions for this submission. If omitted, Open Agent Guide uses the authenticated API token's `default_callback_url` when one is configured.", "title": "Callback Url"}, "force": {"default": false, "description": "Allow retrying a create submission with the same slug after an `open_submission_conflict`. Use this only when a second open create submission is intentional. It does not bypass conflicts with an existing catalog object.", "title": "Force", "type": "boolean"}, "payload": {"additionalProperties": true, "description": "Proposed field values or nested operations for the target object. The accepted shape depends on `app_label`, `model`, and `submission_kind`. Inspect `/api/v1/submissions/fields/?app_label=<app>&model=<model>&view=summary` for a compact target-specific payload contract summary, or omit `view=summary` for the full contract including nested relation envelopes and examples. Cite at most five distinct pages of claim evidence (pricing, trust, offer, and prose-cited pages); typed pointers such as documentation, source, SDK, and API-spec URLs do not count. Citing more evidence fails validation; split the work into smaller submissions grouped by topic and source.", "title": "Payload", "type": "object"}}, "required": ["app_label", "model", "description", "payload"], "title": "SubmissionCreateIn", "type": "object", "description": "Request body for creating a catalog submission to add or update data."}, "AbsencePageClassGuidanceSchema": {"description": "Expected `source_url` page class for one confirmed-absence attestation.\n\nEchoed by the validate dry-run so a submitter catches a wrong-page citation\nbefore filing. A confirmed-absence attestation is only corroborated\nwhen its `source_url` is the authoritative page class for its `field_key` and\nthat page is silent; the fact-check attested check remains the\nsource of truth \u2014 these fields are pre-submit guidance, never a verdict.", "properties": {"path": {"description": "Payload path of the attestation this guidance is about, e.g. `absence_attestations[0]` or `products.create[0].absence_attestations[1]`.", "title": "Path", "type": "string"}, "field_key": {"description": "The attestation's `field_key`.", "title": "Field Key", "type": "string"}, "label": {"description": "The attestation's reference-vocab `label`, or empty for a whole-scalar / whole-relation absence.", "title": "Label", "type": "string"}, "source_url": {"description": "The `source_url` the attestation cites.", "title": "Source Url", "type": "string"}, "expected_page_class": {"description": "The page class whose silence corroborates this absence \u2014 the page that would list the capability if the product had it. Cite this class, not any other; a silent off-class page proves nothing.", "title": "Expected Page Class", "type": "string"}, "hint": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Advisory note when the cited `source_url` looks like an obvious wrong page class (e.g. a pricing page cited for `open_source`). Derived from the URL string only \u2014 validate never fetches it \u2014 so it is a hint, not a verdict. Null when no obvious mismatch is seen.", "title": "Hint"}}, "required": ["path", "field_key", "label", "source_url", "expected_page_class"], "title": "AbsencePageClassGuidanceSchema", "type": "object"}, "ComponentBreakdown": {"description": "One row of the AI-native score breakdown.\n\n``raw`` is the unweighted point total (out of ``max_points``). ``weight`` is\nthe component's *effective* share of the headline 0-100 score after\nrenormalizing over the applicable dimensions; ``nominal_weight`` is the\nfixed pre-renormalization weight, retained for disclosure. ``applicable`` is\nfalse for a dimension declared not-applicable (excluded from the composite),\nin which case ``not_applicable_reason`` carries the curator justification and\n``weight`` / ``weighted_contribution`` are 0. ``weighted_contribution`` is\nthe points this component actually contributes to the headline score, on the\nsame 0-100 scale.", "properties": {"label": {"title": "Label", "type": "string", "description": "Human-readable label for this record."}, "anchor": {"title": "Anchor", "type": "string", "description": "Anchor for this record."}, "raw": {"title": "Raw", "type": "integer", "description": "Raw for this record."}, "max_points": {"title": "Max Points", "type": "integer", "description": "Max points for this record."}, "weight": {"title": "Weight", "type": "number", "description": "Weight for this record."}, "nominal_weight": {"title": "Nominal Weight", "type": "number", "description": "Nominal weight for this record."}, "weighted_contribution": {"title": "Weighted Contribution", "type": "number", "description": "Weighted contribution for this record."}, "applicable": {"title": "Applicable", "type": "boolean", "description": "Applicable for this record."}, "not_applicable_reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Not Applicable Reason", "description": "Not applicable reason for this record."}, "signals_fired": {"items": {"type": "string"}, "title": "Signals Fired", "type": "array", "description": "Signals fired for this record."}}, "required": ["label", "anchor", "raw", "max_points", "weight", "nominal_weight", "weighted_contribution", "applicable", "not_applicable_reason", "signals_fired"], "title": "ComponentBreakdown", "type": "object"}, "ComponentChange": {"properties": {"anchor": {"title": "Anchor", "type": "string", "description": "Anchor for this record."}, "raw_delta": {"title": "Raw Delta", "type": "integer", "description": "Raw delta for this record."}, "weighted_contribution_delta": {"title": "Weighted Contribution Delta", "type": "number", "description": "Weighted contribution delta for this record."}}, "required": ["anchor", "raw_delta", "weighted_contribution_delta"], "title": "ComponentChange", "type": "object"}, "McpEndpointGuidanceSchema": {"properties": {"path": {"description": "Payload path of the MCP connection URL.", "title": "Path", "type": "string"}, "url": {"description": "Submitted MCP connection URL.", "title": "Url", "type": "string"}, "hint": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "URL-shape advisory only. Null does not verify the endpoint.", "title": "Hint"}}, "required": ["path", "url"], "title": "McpEndpointGuidanceSchema", "type": "object"}, "ProductCreatePreview": {"properties": {"status": {"default": "unsupported", "enum": ["available", "partial", "unsupported"], "title": "Status", "type": "string", "description": "Lifecycle or moderation status for this record."}, "reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "This payload does not create a product or publisher.", "title": "Reason", "description": "Reason associated with this action or resolution."}, "advisory": {"default": "Assumes the submitted claims are accepted. This projection does not approve citations or guarantee the outcome against concurrent catalog changes. Evidence refreshes can be useful even when coverage and score do not change.", "title": "Advisory", "type": "string", "description": "Advisory for this record."}, "products": {"items": {"$ref": "#/components/schemas/ProductCreateProjection"}, "title": "Products", "type": "array", "description": "Expanded products associated with this resource when requested."}}, "title": "ProductCreatePreview", "type": "object"}, "ProductCreateProjection": {"properties": {"path": {"title": "Path", "type": "string", "description": "Path for this record."}, "slug": {"title": "Slug", "type": "string", "description": "Stable URL slug for this record."}, "status": {"enum": ["available", "partial"], "title": "Status", "type": "string", "description": "Lifecycle or moderation status for this record."}, "projected": {"$ref": "#/components/schemas/ProductCreateSnapshot", "description": "Projected for this record."}, "projected_if_verified": {"anyOf": [{"$ref": "#/components/schemas/ProductCreateSnapshot"}, {"type": "null"}], "description": "Projected if verified for this record."}, "pending_fields": {"items": {"type": "string"}, "title": "Pending Fields", "type": "array", "description": "Pending fields for this record."}}, "required": ["path", "slug", "status", "projected"], "title": "ProductCreateProjection", "type": "object"}, "ProductCreateSnapshot": {"properties": {"known_field_count": {"title": "Known Field Count", "type": "integer", "description": "Known field count for this record."}, "field_count": {"title": "Field Count", "type": "integer", "description": "Field count for this record."}, "coverage": {"title": "Coverage", "type": "integer", "description": "Coverage for this record."}, "rating_eligible": {"title": "Rating Eligible", "type": "boolean", "description": "Rating eligible for this record."}, "score": {"$ref": "#/components/schemas/ScoreBreakdown", "description": "Score for this record."}, "display_tier": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Display Tier", "description": "Display tier for this record."}}, "required": ["known_field_count", "field_count", "coverage", "rating_eligible", "score", "display_tier"], "title": "ProductCreateSnapshot", "type": "object"}, "ProductScoreSnapshot": {"properties": {"coverage": {"title": "Coverage", "type": "integer", "description": "Coverage for this record."}, "score": {"$ref": "#/components/schemas/ScoreBreakdown", "description": "Score for this record."}, "display_tier": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Display Tier", "description": "Display tier for this record."}}, "required": ["coverage", "score", "display_tier"], "title": "ProductScoreSnapshot", "type": "object"}, "ProductUpdatePreview": {"properties": {"status": {"default": "unsupported", "enum": ["available", "partial", "unsupported", "unavailable"], "title": "Status", "type": "string", "description": "Lifecycle or moderation status for this record."}, "reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "Only direct updates to existing catalog products are supported.", "title": "Reason", "description": "Reason associated with this action or resolution."}, "advisory": {"default": "Assumes the submitted claims are accepted. This projection does not approve citations or guarantee the outcome against concurrent catalog changes. Evidence refreshes can be useful even when coverage and score do not change.", "title": "Advisory", "type": "string", "description": "Advisory for this record."}, "current": {"anyOf": [{"$ref": "#/components/schemas/ProductScoreSnapshot"}, {"type": "null"}], "description": "Current for this record."}, "projected": {"anyOf": [{"$ref": "#/components/schemas/ProductScoreSnapshot"}, {"type": "null"}], "description": "Projected for this record."}, "coverage_delta": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Coverage Delta", "description": "Coverage delta for this record."}, "score_delta": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Score Delta", "description": "Score delta for this record."}, "projected_if_verified": {"anyOf": [{"$ref": "#/components/schemas/ProductScoreSnapshot"}, {"type": "null"}], "description": "Projected if verified for this record."}, "pending_fields": {"items": {"type": "string"}, "title": "Pending Fields", "type": "array", "description": "Pending fields for this record."}, "component_changes": {"items": {"$ref": "#/components/schemas/ComponentChange"}, "title": "Component Changes", "type": "array", "description": "Component changes for this record."}, "newly_known_fields": {"items": {"type": "string"}, "title": "Newly Known Fields", "type": "array", "description": "Newly known fields for this record."}, "no_longer_known_fields": {"items": {"type": "string"}, "title": "No Longer Known Fields", "type": "array", "description": "No longer known fields for this record."}, "changed_fields": {"items": {"type": "string"}, "title": "Changed Fields", "type": "array", "description": "Changed fields for this record."}, "unchanged_fields": {"items": {"type": "string"}, "title": "Unchanged Fields", "type": "array", "description": "Unchanged fields for this record."}, "refreshed_evidence_fields": {"items": {"type": "string"}, "title": "Refreshed Evidence Fields", "type": "array", "description": "Refreshed evidence fields for this record."}}, "title": "ProductUpdatePreview", "type": "object"}, "ScoreBreakdown": {"properties": {"total": {"title": "Total", "type": "integer", "description": "Total for this record."}, "tier": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Tier", "description": "Tier for this record."}, "components": {"items": {"$ref": "#/components/schemas/ComponentBreakdown"}, "title": "Components", "type": "array", "description": "Components for this record."}}, "required": ["total", "tier", "components"], "title": "ScoreBreakdown", "type": "object"}, "SourceSelectionEntry": {"properties": {"url": {"title": "Url", "type": "string", "description": "Canonical URL for this resource."}, "paths": {"items": {"type": "string"}, "title": "Paths", "type": "array", "description": "Paths for this record."}, "roles": {"items": {"enum": ["pointer", "prose_evidence", "structured_evidence", "absence_evidence"], "type": "string"}, "title": "Roles", "type": "array", "description": "Roles for this record."}, "included": {"description": "Whether the fact-check fetch budget includes this URL.", "title": "Included", "type": "boolean"}, "counts_as_evidence": {"title": "Counts As Evidence", "type": "boolean", "description": "Counts as evidence for this record."}}, "required": ["url", "paths", "roles", "included", "counts_as_evidence"], "title": "SourceSelectionEntry", "type": "object"}, "SourceSelectionPlan": {"properties": {"limit": {"title": "Limit", "type": "integer", "description": "Limit for this record."}, "evidence_count": {"title": "Evidence Count", "type": "integer", "description": "Evidence count for this record."}, "selected_count": {"title": "Selected Count", "type": "integer", "description": "Selected count for this record."}, "sources": {"items": {"$ref": "#/components/schemas/SourceSelectionEntry"}, "title": "Sources", "type": "array", "description": "Sources for this record."}}, "required": ["limit", "evidence_count", "selected_count", "sources"], "title": "SourceSelectionPlan", "type": "object"}, "SubmissionValidationResultSchema": {"examples": [{"absence_attestation_guidance": [{"expected_page_class": "the licensing / terms / product-overview page (not an API-method doc)", "field_key": "open_source", "hint": "A pricing or plans page is silent on licensing; cite the licensing / terms / product-overview page instead.", "label": "", "path": "absence_attestations[0]", "source_url": "https://example.ai/pricing"}], "mcp_endpoint_guidance": [], "valid": true, "web_mcp_guidance": []}], "properties": {"source_selection": {"$ref": "#/components/schemas/SourceSelectionPlan", "description": "Source roles, submitted paths and bounded fact-check fetch order. Inclusion does not verify content. Use source-preview to inspect a page."}, "review_budget_guidance": {"default": "For broad updates, start with at most four material claims per submission, grouped by topic and source, such as licensing and hosting, or retention and interface absences. Count each association label, confirmed absence, and prose assertion as a claim; four fields can contain more than four claims. Keep each value with its citations, qualifiers, and required absence attestations. Preserve contradictions and dependent changes together. For new products, create the minimum valid record first, then update it after merge. Revalidate each group; split further if review rejects it for exceeding the evidence budget. This is drafting advice, not a size estimate or a guarantee: shape validation cannot predict future model-generated evidence. Even one claim can exceed the hard review cap.", "description": "Advisory claim-group sizing returned before paid checks. Always present on successful validation; does not change valid or predict whether generated review evidence will fit. A single priced offer gets trim-the-prose advice instead of split advice.", "title": "Review Budget Guidance", "type": "string"}, "product_update_preview": {"allOf": [{"$ref": "#/components/schemas/ProductUpdatePreview"}], "description": "Advisory current/projected coverage and canonical score breakdowns for direct product updates. Assumes accepted claims; does not approve citations or protect against concurrent changes. Field lists describe scored decision values; refreshed_evidence_fields identifies existing absence evidence supplied again and retained by the update. Non-empty trust_center_url or llms_txt_url values return status partial and name pending_fields. projected and its deltas assume no verification credit; projected_if_verified shows coverage, score and display tier if the pointer is corroborated. Field change lists exclude the pending pointer. Clearing the URL supports a complete preview. Unsupported previews give a reason and null snapshots/deltas."}, "product_create_preview": {"allOf": [{"$ref": "#/components/schemas/ProductCreatePreview"}], "description": "Advisory projections for direct product creates and products nested in publisher creates, identified by payload path and slug. Reports known-field count, denominator, coverage and rating eligibility using canonical scoring. Creates have no current snapshot or deltas. Assumes accepted claims. Pending scored URLs have a separate projected_if_verified snapshot. Unsupported shapes give a reason."}, "valid": {"description": "Whether the submission payload passed validation.", "title": "Valid", "type": "boolean"}, "web_mcp_guidance": {"description": "Advisory reminders for every web_mcp: true in direct or nested product writes, including genuine browser-tool claims. Validation does not fetch or verify browser evidence. Reminders do not change valid.", "items": {"$ref": "#/components/schemas/WebMcpGuidanceSchema"}, "title": "Web Mcp Guidance", "type": "array"}, "mcp_endpoint_guidance": {"description": "MCP URLs in direct or nested writes, with advisory hints for likely documentation URLs. Validation does not fetch URLs or run paid checks. Hints never affect valid; exact-endpoint ownership and product applicability still require authoritative citation evidence.", "items": {"$ref": "#/components/schemas/McpEndpointGuidanceSchema"}, "title": "Mcp Endpoint Guidance", "type": "array"}, "absence_attestation_guidance": {"description": "Per confirmed-absence attestation in the payload, the authoritative `source_url` page class to cite (plus an advisory hint when the cited URL looks like the wrong class). This is server-derived guidance, not an echo of the submitted attestations. Empty when the payload carries no attestations. Lets a submitter fix a wrong-page citation before filing, instead of after a fact-check reject.", "items": {"$ref": "#/components/schemas/AbsencePageClassGuidanceSchema"}, "title": "Absence Attestation Guidance", "type": "array"}}, "required": ["source_selection", "valid"], "title": "SubmissionValidationResultSchema", "type": "object", "description": "Validation result returned when checking a catalog submission payload without creating a workflow record."}, "WebMcpGuidanceSchema": {"properties": {"path": {"description": "Payload path of the positive web_mcp claim.", "title": "Path", "type": "string"}, "hint": {"description": "Reminder to distinguish browser and remote MCP tools.", "title": "Hint", "type": "string"}}, "required": ["path", "hint"], "title": "WebMcpGuidanceSchema", "type": "object"}, "RecoveryArtifactReferenceSchema": {"description": "An opaque reference to a complete retained source above the inline limit.", "properties": {"reference": {"format": "uuid", "title": "Reference", "type": "string", "description": "Reference for this record."}, "content_sha256": {"title": "Content Sha256", "type": "string", "description": "Content sha256 for this record."}, "content_chars": {"title": "Content Chars", "type": "integer", "description": "Content chars for this record."}, "representation": {"title": "Representation", "type": "string", "description": "Representation for this record."}, "response_is_lower_bound": {"title": "Response Is Lower Bound", "type": "boolean", "description": "Response is lower bound for this record."}, "expires_at": {"title": "Expires At", "type": "string", "description": "Timestamp when expires."}}, "required": ["reference", "content_sha256", "content_chars", "representation", "response_is_lower_bound", "expires_at"], "title": "RecoveryArtifactReferenceSchema", "type": "object"}, "SourceDeliverySchema": {"description": "How the complete source text is delivered: inline, or by reference.\n\n`inline` keeps the complete text in `snapshot.text`. `artifact` moves the\ncomplete text out to the retained store (the preview response stayed under\nthe inline limit) and carries its reference; `snapshot.text` is then empty,\nnever an excerpt.", "properties": {"mode": {"default": "inline", "enum": ["inline", "artifact"], "title": "Mode", "type": "string", "description": "Mode for this record."}, "artifact": {"anyOf": [{"$ref": "#/components/schemas/RecoveryArtifactReferenceSchema"}, {"type": "null"}], "description": "Artifact for this record."}}, "title": "SourceDeliverySchema", "type": "object"}, "SourcePreviewSchema": {"properties": {"preview_id": {"format": "uuid", "title": "Preview Id", "type": "string", "description": "Identifier of the related preview."}, "canonical_url": {"title": "Canonical Url", "type": "string", "description": "URL for canonical."}, "snapshot": {"anyOf": [{"$ref": "#/components/schemas/SourceSnapshotSchema"}, {"type": "null"}], "description": "Snapshot for this record."}, "source_delivery": {"allOf": [{"$ref": "#/components/schemas/SourceDeliverySchema"}], "description": "Source delivery for this record."}, "fetch_failures": {"items": {"additionalProperties": true, "type": "object"}, "title": "Fetch Failures", "type": "array", "description": "Fetch failures for this record."}, "ignored_resource_urls": {"items": {"additionalProperties": {"type": "string"}, "type": "object"}, "title": "Ignored Resource Urls", "type": "array", "description": "Ignored resource urls for this record."}, "section_recovery": {"items": {"additionalProperties": true, "type": "object"}, "title": "Section Recovery", "type": "array", "description": "Section recovery for this record."}, "source_changed": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Source Changed", "description": "Source changed for this record."}, "absence_eligible": {"title": "Absence Eligible", "type": "boolean", "description": "Absence eligible for this record."}, "absence_eligibility_reason": {"title": "Absence Eligibility Reason", "type": "string", "description": "Absence eligibility reason for this record."}, "complete_source_max_chars": {"title": "Complete Source Max Chars", "type": "integer", "description": "Complete source max chars for this record."}, "authorizes_claim": {"title": "Authorizes Claim", "type": "boolean", "description": "Authorizes claim for this record."}, "warnings": {"items": {"type": "string"}, "title": "Warnings", "type": "array", "description": "Warnings for this record."}}, "required": ["preview_id", "canonical_url", "snapshot", "fetch_failures", "ignored_resource_urls", "section_recovery", "source_changed", "absence_eligible", "absence_eligibility_reason", "complete_source_max_chars", "authorizes_claim", "warnings"], "title": "SourcePreviewSchema", "type": "object"}, "SourceSnapshotSchema": {"properties": {"url": {"title": "Url", "type": "string", "description": "Canonical URL for this resource."}, "title": {"title": "Title", "type": "string", "description": "Title for this record."}, "text": {"title": "Text", "type": "string", "description": "Text for this record."}, "content_type": {"title": "Content Type", "type": "string", "description": "Content type for this record."}, "server_observed_endpoint_redirects": {"items": {"additionalProperties": true, "type": "object"}, "title": "Server Observed Endpoint Redirects", "type": "array", "description": "Server observed endpoint redirects for this record."}, "requested_url": {"title": "Requested Url", "type": "string", "description": "URL for requested."}, "reported_url": {"title": "Reported Url", "type": "string", "description": "URL for reported."}, "retrieved_at": {"title": "Retrieved At", "type": "string", "description": "Timestamp when retrieved."}, "requested_provider": {"title": "Requested Provider", "type": "string", "description": "Requested provider for this record."}, "antibot_provider": {"title": "Antibot Provider", "type": "string", "description": "Antibot provider for this record."}, "provider_degraded": {"title": "Provider Degraded", "type": "boolean", "description": "Provider degraded for this record."}, "status": {"title": "Status", "type": "string", "description": "Lifecycle or moderation status for this record."}, "content_rejections": {"items": {"additionalProperties": {"type": "string"}, "type": "object"}, "title": "Content Rejections", "type": "array", "description": "Content rejections for this record."}, "source_sha256": {"title": "Source Sha256", "type": "string", "description": "Source sha256 for this record."}, "source_chars": {"title": "Source Chars", "type": "integer", "description": "Source chars for this record."}, "excerpt_sha256": {"title": "Excerpt Sha256", "type": "string", "description": "Excerpt sha256 for this record."}, "selected_chars": {"title": "Selected Chars", "type": "integer", "description": "Selected chars for this record."}, "source_complete": {"title": "Source Complete", "type": "boolean", "description": "Source complete for this record."}, "selection_mode": {"title": "Selection Mode", "type": "string", "description": "Selection mode for this record."}, "selection_version": {"title": "Selection Version", "type": "string", "description": "Selection version for this record."}, "section_recovered": {"title": "Section Recovered", "type": "boolean", "description": "Section recovered for this record."}}, "required": ["url", "title", "text", "content_type", "server_observed_endpoint_redirects", "requested_url", "reported_url", "retrieved_at", "requested_provider", "antibot_provider", "provider_degraded", "status", "content_rejections", "source_sha256", "source_chars", "excerpt_sha256", "selected_chars", "source_complete", "selection_mode", "selection_version", "section_recovered"], "title": "SourceSnapshotSchema", "type": "object"}, "SourcePreviewIn": {"additionalProperties": false, "properties": {"url": {"format": "uri", "maxLength": 2048, "minLength": 1, "title": "Url", "type": "string", "description": "Canonical URL for this resource."}, "claims": {"items": {"maxLength": 2000, "type": "string"}, "maxItems": 20, "title": "Claims", "type": "array", "description": "Claims for this record."}, "max_age_seconds": {"anyOf": [{"maximum": 3600, "minimum": 1, "type": "integer"}, {"type": "null"}], "description": "Maximum age of a cached source in seconds. Older sources are fetched again.", "title": "Max Age Seconds"}, "complete_source": {"default": false, "title": "Complete Source", "type": "boolean", "description": "Complete source for this record."}, "api_spec": {"default": false, "title": "Api Spec", "type": "boolean", "description": "Api spec for this record."}, "llms_txt": {"default": false, "description": "Preserve the complete llms.txt body without Markdown conversion. Use with complete_source. Do not combine with api_spec.", "title": "Llms Txt", "type": "boolean"}, "allow_artifact_recovery": {"default": false, "description": "Set true to recover a complete source that is larger than the inline response limit. The response then carries an opaque reference to the complete retained source, which you download and verify, instead of returning an error. Does not apply to api_spec previews.", "title": "Allow Artifact Recovery", "type": "boolean"}, "expected_source_sha256": {"default": "", "pattern": "^(?:[0-9a-f]{64})?$", "title": "Expected Source Sha256", "type": "string", "description": "Expected source sha256 for this record."}}, "required": ["url"], "title": "SourcePreviewIn", "type": "object"}, "CursorPageSchema_SubmissionReviewSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/SubmissionReviewSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[SubmissionReviewSchema]", "type": "object"}, "SubmissionReviewSchema": {"examples": [{"dismissal_reason": "", "dismissed_at": null, "dismissed_by_id": null, "dismissed_by_username": null, "id": "3d0fe27d-1c58-4e0c-93bc-2f3695e7c4dd", "metadata": {"confidence": "medium"}, "reviewed_at": "2026-03-24T15:10:00Z", "reviewed_by_id": "4a0bcfbb-6c80-474c-b390-2dfb0f374094", "reviewed_by_username": "reviewer-1", "status": "commented", "summary": "Looks structurally sound; requesting one more supporting source."}], "properties": {"id": {"description": "Stable identifier for the submission review.", "format": "uuid", "title": "Id", "type": "string"}, "status": {"description": "Recorded review status.", "title": "Status", "type": "string"}, "summary": {"description": "Summary or rationale attached to the review.", "title": "Summary", "type": "string"}, "metadata": {"additionalProperties": true, "description": "Structured metadata captured with the review.", "title": "Metadata", "type": "object"}, "reviewed_by_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "User identifier for the reviewer, if available.", "title": "Reviewed By Id"}, "reviewed_by_username": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Username of the reviewer, if available.", "title": "Reviewed By Username"}, "reviewed_at": {"description": "Timestamp when the review was created.", "title": "Reviewed At", "type": "string"}, "dismissed_by_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "User identifier for the actor who dismissed the review, if any.", "title": "Dismissed By Id"}, "dismissed_by_username": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Username of the actor who dismissed the review, if any.", "title": "Dismissed By Username"}, "dismissed_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Timestamp when the review was dismissed, if applicable.", "title": "Dismissed At"}, "dismissal_reason": {"description": "Reason the review was dismissed, if applicable.", "title": "Dismissal Reason", "type": "string"}}, "required": ["id", "status", "summary", "metadata", "reviewed_at", "dismissal_reason"], "title": "SubmissionReviewSchema", "type": "object", "description": "Review decision or comment recorded against a submission."}, "SubmissionReviewCreateIn": {"additionalProperties": false, "properties": {"status": {"$ref": "#/components/schemas/SubmissionReviewStatus", "description": "Review outcome or commentary status to record."}, "summary": {"default": "", "description": "Review summary or rationale for the recorded status.", "title": "Summary", "type": "string"}, "metadata": {"additionalProperties": true, "description": "Structured review metadata captured alongside the summary.", "title": "Metadata", "type": "object"}}, "required": ["status"], "title": "SubmissionReviewCreateIn", "type": "object"}, "SubmissionReviewStatus": {"enum": ["approved", "rejected", "commented", "dismissed"], "title": "SubmissionReviewStatus", "type": "string", "description": "Status recorded when a reviewer comments on or decides a submission.", "x-enumDescriptions": ["Review approved the submission.", "Review rejected the submission.", "Review added commentary without making a final decision.", "Review was later dismissed and should no longer be treated as active."]}, "CursorPageSchema_SubmissionCheckSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/SubmissionCheckSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[SubmissionCheckSchema]", "type": "object"}, "SubmissionCheckResultSchema": {"properties": {"status": {"$ref": "#/components/schemas/SubmissionCheckStatus", "description": "Lifecycle or moderation status for this record."}, "summary": {"title": "Summary", "type": "string", "description": "Summary for this record."}, "details": {"additionalProperties": true, "title": "Details", "type": "object", "description": "Details for this record."}, "last_error": {"title": "Last Error", "type": "string", "description": "Last error for this record."}, "started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Started At", "description": "Timestamp when started."}, "completed_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Completed At", "description": "Timestamp when completed."}, "attempt_count": {"title": "Attempt Count", "type": "integer", "description": "Attempt count for this record."}, "retry_count": {"title": "Retry Count", "type": "integer", "description": "Retry count for this record."}}, "required": ["status", "summary", "details", "last_error", "started_at", "completed_at", "attempt_count", "retry_count"], "title": "SubmissionCheckResultSchema", "type": "object"}, "SubmissionCheckSchema": {"examples": [{"attempt_count": 0, "check_type": "urls", "completed_at": null, "created_at": "2026-03-24T14:30:01Z", "details": {}, "id": "3bb6bd75-c9d4-4c40-a624-6d2c0ae85e13", "last_error": "", "started_at": null, "status": "pending", "summary": "", "updated_at": "2026-03-24T14:30:01Z"}], "properties": {"id": {"description": "Stable identifier for the submission check.", "format": "uuid", "title": "Id", "type": "string"}, "check_type": {"$ref": "#/components/schemas/SubmissionCheckType", "description": "Machine-readable check family executed for the submission."}, "status": {"$ref": "#/components/schemas/SubmissionCheckStatus", "description": "Async lifecycle status for the check run."}, "result_history": {"description": "Previous feedback archived before retries, oldest first.", "items": {"$ref": "#/components/schemas/SubmissionCheckResultSchema"}, "title": "Result History", "type": "array"}, "summary": {"description": "Current outcome summary; empty while pending or running.", "title": "Summary", "type": "string"}, "details": {"additionalProperties": true, "description": "Scrubbed feedback only on public reads; full diagnostics are staff-only. Empty while pending or running. A timed-out fact check records a scrubbed `timeout_diagnostics` envelope here (stage reached, outstanding cited URLs, source counts, and a `retry_has_basis` boolean) so a worker can tell a timeout apart from a blind-resubmit loop.", "title": "Details", "type": "object"}, "started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Timestamp when execution started, if the check has run.", "title": "Started At"}, "completed_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Timestamp when execution completed, if available.", "title": "Completed At"}, "attempt_count": {"description": "Worker execution attempts in the current retry cycle. Resets when an errored check is re-queued; excludes in-process provider retries.", "title": "Attempt Count", "type": "integer"}, "last_error": {"description": "Most recent execution error for infrastructure failures, if any.", "title": "Last Error", "type": "string"}, "created_at": {"description": "Timestamp when the check record was created.", "title": "Created At", "type": "string"}, "updated_at": {"description": "Timestamp when the check last changed.", "title": "Updated At", "type": "string"}}, "required": ["id", "check_type", "status", "summary", "details", "attempt_count", "last_error", "created_at", "updated_at"], "title": "SubmissionCheckSchema", "type": "object"}, "SubmissionCheckStatus": {"enum": ["pending", "running", "passed", "failed", "errored"], "title": "SubmissionCheckStatus", "type": "string"}, "SubmissionCheckType": {"enum": ["spam", "content_moderation", "urls", "prompt_injection", "resource_size", "fact_check", "taxonomy_dedup", "affordance_dedup", "product_dedup", "pointer_content"], "title": "SubmissionCheckType", "type": "string"}, "SubmissionDismissReviewIn": {"additionalProperties": false, "properties": {"reason": {"default": "", "description": "Reason this review should no longer be treated as active.", "title": "Reason", "type": "string"}}, "title": "SubmissionDismissReviewIn", "type": "object"}, "CursorPageSchema_SubmissionEventSchema_": {"properties": {"count": {"description": "Total number of matching records before cursor pagination, after applying filters and access restrictions.", "minimum": 0, "title": "Count", "type": "integer"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the next page of results, or null if this is the last page.", "title": "Next"}, "previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Cursor for the previous page of results, or null if this is the first page.", "title": "Previous"}, "page_size_default": {"default": 20, "description": "Default page size used when `page_size` is omitted.", "title": "Page Size Default", "type": "integer"}, "page_size_max": {"default": 100, "description": "Maximum allowed `page_size` for this endpoint.", "title": "Page Size Max", "type": "integer"}, "results": {"description": "Page of results.", "items": {"$ref": "#/components/schemas/SubmissionEventSchema"}, "title": "Results", "type": "array"}}, "required": ["count", "next", "previous", "results"], "title": "CursorPageSchema[SubmissionEventSchema]", "type": "object"}, "SubmissionEventSchema": {"examples": [{"actor_id": "a2f0f7f1-03b2-44d8-9d7e-cfac5c7f5720", "actor_username": "agent-1", "causation_id": null, "correlation_id": "69a1f29f-d6d5-4d26-b9ca-4d2489cf6b14", "created_at": "2026-03-24T14:30:00Z", "data": {"status": "open"}, "event_type": "submission.created", "event_version": 1, "id": "5d1f8cba-7e66-480a-abd8-4c984b2f46f8"}], "properties": {"id": {"description": "Stable identifier for the submission event.", "format": "uuid", "title": "Id", "type": "string"}, "event_type": {"description": "Submission lifecycle event type.", "title": "Event Type", "type": "string"}, "event_version": {"description": "Version number for the event payload shape.", "title": "Event Version", "type": "integer"}, "actor_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "User identifier for the actor who triggered the event, if any.", "title": "Actor Id"}, "actor_username": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Username of the actor who triggered the event, if any.", "title": "Actor Username"}, "created_at": {"description": "Timestamp when the event was recorded.", "title": "Created At", "type": "string"}, "data": {"additionalProperties": true, "description": "Event-specific payload data.", "title": "Data", "type": "object"}, "correlation_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier linking related events in the same workflow, if any.", "title": "Correlation Id"}, "causation_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Identifier of the event that directly caused this event, if any.", "title": "Causation Id"}}, "required": ["id", "event_type", "event_version", "created_at", "data"], "title": "SubmissionEventSchema", "type": "object", "description": "Immutable event emitted during the submission lifecycle."}, "SubmissionMergeIn": {"additionalProperties": false, "properties": {"process_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Optional caller-generated process UUID recorded in the decision event. Attribution only; not an authorization or idempotency key.", "title": "Process Id"}, "merge_summary": {"default": "", "description": "Optional summary of why the submission was merged.", "title": "Merge Summary", "type": "string"}}, "title": "SubmissionMergeIn", "type": "object"}, "SubmissionCloseIn": {"additionalProperties": false, "properties": {"process_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Optional caller-generated process UUID recorded in the decision event. Attribution only; not an authorization or idempotency key.", "title": "Process Id"}, "close_reason": {"default": "", "description": "Optional reason the submission was closed without merging.", "title": "Close Reason", "type": "string"}}, "title": "SubmissionCloseIn", "type": "object"}, "SubmissionRetireIn": {"additionalProperties": false, "properties": {"successor_ids": {"description": "Newer replacements. Empty withdraws without replacements.", "items": {"format": "uuid", "type": "string"}, "maxItems": 20, "title": "Successor Ids", "type": "array"}, "reason": {"default": "", "maxLength": 8000, "title": "Reason", "type": "string", "description": "Reason associated with this action or resolution."}, "process_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Process Id", "description": "Identifier of the related process."}}, "title": "SubmissionRetireIn", "type": "object"}, "FeedbackReceiptSchema": {"description": "Minimal receipt returned on `201 Created`. The stored `body`/`context`\nare not reflected back \u2014 nothing reads feedback through the public API in\nthis slice, so this is a receipt, not a resource.", "properties": {"id": {"description": "The branded FeedbackId (UUID).", "format": "uuid", "title": "Id", "type": "string"}, "title": {"description": "Echo of the accepted title.", "title": "Title", "type": "string"}, "created_at": {"description": "ISO-8601 creation timestamp.", "title": "Created At", "type": "string"}, "submitted_by": {"$ref": "#/components/schemas/FeedbackSubmitterSchema", "description": "Account reference."}}, "required": ["id", "title", "created_at", "submitted_by"], "title": "FeedbackReceiptSchema", "type": "object"}, "FeedbackSubmitterSchema": {"properties": {"id": {"description": "Account ID that filed the feedback.", "format": "uuid", "title": "Id", "type": "string"}, "username": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Account username.", "title": "Username"}}, "required": ["id"], "title": "FeedbackSubmitterSchema", "type": "object"}, "FeedbackContext": {"additionalProperties": false, "description": "Optional machine-readable \"what I was trying to do\" so triage doesn't\nneed guesswork. Every field is optional and advisory.", "properties": {"path": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The request path or page the feedback is about.", "title": "Path"}, "method": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The HTTP method involved, if any.", "title": "Method"}, "expected": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "For bug reports, what the caller expected.", "title": "Expected"}, "actual": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "For bug reports, what the caller observed.", "title": "Actual"}, "severity": {"anyOf": [{"$ref": "#/components/schemas/FeedbackSeverity"}, {"type": "null"}], "description": "Self-scoped urgency hint (advisory; triage may override or ignore it). Not the same as the category, which is assigned at triage."}, "reference_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional link to a reproduction, log, or related resource.", "title": "Reference Url"}}, "title": "FeedbackContext", "type": "object"}, "FeedbackCreateIn": {"additionalProperties": false, "properties": {"title": {"description": "Short summary. Plain-text only, up to 200 characters.", "title": "Title", "type": "string"}, "body": {"description": "The detail. Plain-text only, bounded by the agent prompt-size cap. Over-cap feedback is rejected, never truncated.", "title": "Body", "type": "string"}, "context": {"anyOf": [{"$ref": "#/components/schemas/FeedbackContext"}, {"type": "null"}], "description": "Optional structured context about where the feedback was hit."}}, "required": ["title", "body"], "title": "FeedbackCreateIn", "type": "object"}, "FeedbackSeverity": {"enum": ["low", "medium", "high"], "title": "FeedbackSeverity", "type": "string"}, "CloudEventEnvelope": {"title": "CloudEvent Envelope", "type": "object", "required": ["specversion", "id", "source", "type", "time", "subject", "datacontenttype", "data"], "properties": {"specversion": {"type": "string", "const": "1.0", "example": "1.0", "description": "CloudEvents specification version used by this event."}, "id": {"type": "string", "format": "uuid", "description": "Stable CloudEvent identifier for this decision."}, "source": {"type": "string", "format": "uri-reference", "description": "Open Agent Guide callback event source."}, "type": {"type": "string", "description": "Open Agent Guide event type."}, "time": {"type": "string", "format": "date-time", "description": "When the review or submission decision occurred."}, "subject": {"type": "string", "description": "Resource identifier for the affected record."}, "datacontenttype": {"type": "string", "const": "application/json", "example": "application/json", "description": "Content type of the `data` payload."}, "data": {"description": "Event-specific callback payload."}}}, "ProductReviewDecisionCallbackData": {"title": "Product Review Decision Callback Data", "type": "object", "required": ["review_id", "product_id", "status", "url"], "properties": {"review_id": {"type": "string", "format": "uuid", "description": "Identifier of the product review that triggered the callback."}, "product_id": {"type": "string", "format": "uuid", "description": "Identifier of the reviewed product."}, "status": {"type": "string", "enum": ["approved", "rejected"], "description": "Decision status for the product review."}, "url": {"type": "string", "format": "uri-reference", "description": "Public API URL for the review."}, "approved_at": {"type": "string", "format": "date-time", "description": "Timestamp when the review was approved, if applicable."}, "rejected_at": {"type": "string", "format": "date-time", "description": "Timestamp when the review was rejected, if applicable."}, "rejection_reason": {"type": "string", "description": "Reason the review was rejected, if applicable."}}}, "SubmissionDecisionCallbackData": {"title": "Submission Decision Callback Data", "type": "object", "required": ["submission_id", "app_label", "model", "object_id", "status", "url"], "properties": {"submission_id": {"type": "string", "format": "uuid", "description": "Identifier of the submission that triggered the callback."}, "app_label": {"type": "string", "description": "Django app label for the submission target."}, "model": {"type": "string", "description": "Django model name for the submission target."}, "object_id": {"type": "string", "format": "uuid", "description": "Identifier of the existing or proposed target object."}, "status": {"type": "string", "enum": ["merged", "closed"], "description": "Final decision status for the submission."}, "url": {"type": "string", "format": "uri-reference", "description": "Public API URL for the submission."}, "merged_at": {"type": "string", "format": "date-time", "description": "Timestamp when the submission was merged, if applicable."}, "merge_summary": {"type": "string", "description": "Summary explaining why the submission was merged, if applicable."}, "closed_at": {"type": "string", "format": "date-time", "description": "Timestamp when the submission was closed, if applicable."}, "close_reason": {"type": "string", "description": "Reason the submission was closed, if applicable."}, "disposition": {"type": "string", "enum": ["closed", "withdrawn", "superseded"], "description": "Disposition for this record."}, "successor_ids": {"type": "array", "items": {"type": "string", "format": "uuid"}, "description": "Identifiers of related successor records."}}}, "ProductReviewApprovedCloudEvent": {"title": "Product Review Approved CloudEvent", "type": "object", "required": ["specversion", "id", "source", "type", "time", "subject", "datacontenttype", "data"], "properties": {"specversion": {"type": "string", "const": "1.0", "example": "1.0", "description": "Specversion for this record."}, "id": {"type": "string", "format": "uuid", "description": "Stable CloudEvent identifier for this decision."}, "source": {"type": "string", "format": "uri-reference", "description": "Open Agent Guide callback event source.", "const": "/api/v1/catalog/product-reviews"}, "type": {"type": "string", "description": "Open Agent Guide event type.", "const": "com.openagentguide.product-review.approved"}, "time": {"type": "string", "format": "date-time", "description": "When the review or submission decision occurred."}, "subject": {"type": "string", "description": "Resource identifier for the affected record."}, "datacontenttype": {"type": "string", "const": "application/json", "example": "application/json", "description": "Datacontenttype for this record."}, "data": {"allOf": [{"$ref": "#/components/schemas/ProductReviewDecisionCallbackData"}], "description": "Event-specific callback payload."}}}, "ProductReviewRejectedCloudEvent": {"title": "Product Review Rejected CloudEvent", "type": "object", "required": ["specversion", "id", "source", "type", "time", "subject", "datacontenttype", "data"], "properties": {"specversion": {"type": "string", "const": "1.0", "example": "1.0", "description": "Specversion for this record."}, "id": {"type": "string", "format": "uuid", "description": "Stable CloudEvent identifier for this decision."}, "source": {"type": "string", "format": "uri-reference", "description": "Open Agent Guide callback event source.", "const": "/api/v1/catalog/product-reviews"}, "type": {"type": "string", "description": "Open Agent Guide event type.", "const": "com.openagentguide.product-review.rejected"}, "time": {"type": "string", "format": "date-time", "description": "When the review or submission decision occurred."}, "subject": {"type": "string", "description": "Resource identifier for the affected record."}, "datacontenttype": {"type": "string", "const": "application/json", "example": "application/json", "description": "Datacontenttype for this record."}, "data": {"allOf": [{"$ref": "#/components/schemas/ProductReviewDecisionCallbackData"}], "description": "Event-specific callback payload."}}}, "SubmissionMergedCloudEvent": {"title": "Submission Merged CloudEvent", "type": "object", "required": ["specversion", "id", "source", "type", "time", "subject", "datacontenttype", "data"], "properties": {"specversion": {"type": "string", "const": "1.0", "example": "1.0", "description": "Specversion for this record."}, "id": {"type": "string", "format": "uuid", "description": "Stable CloudEvent identifier for this decision."}, "source": {"type": "string", "format": "uri-reference", "description": "Open Agent Guide callback event source.", "const": "/api/v1/submissions"}, "type": {"type": "string", "description": "Open Agent Guide event type.", "const": "com.openagentguide.submission.merged"}, "time": {"type": "string", "format": "date-time", "description": "When the review or submission decision occurred."}, "subject": {"type": "string", "description": "Resource identifier for the affected record."}, "datacontenttype": {"type": "string", "const": "application/json", "example": "application/json", "description": "Datacontenttype for this record."}, "data": {"allOf": [{"$ref": "#/components/schemas/SubmissionDecisionCallbackData"}], "description": "Event-specific callback payload."}}}, "SubmissionClosedCloudEvent": {"title": "Submission Closed CloudEvent", "type": "object", "required": ["specversion", "id", "source", "type", "time", "subject", "datacontenttype", "data"], "properties": {"specversion": {"type": "string", "const": "1.0", "example": "1.0", "description": "Specversion for this record."}, "id": {"type": "string", "format": "uuid", "description": "Stable CloudEvent identifier for this decision."}, "source": {"type": "string", "format": "uri-reference", "description": "Open Agent Guide callback event source.", "const": "/api/v1/submissions"}, "type": {"type": "string", "description": "Open Agent Guide event type.", "const": "com.openagentguide.submission.closed"}, "time": {"type": "string", "format": "date-time", "description": "When the review or submission decision occurred."}, "subject": {"type": "string", "description": "Resource identifier for the affected record."}, "datacontenttype": {"type": "string", "const": "application/json", "example": "application/json", "description": "Datacontenttype for this record."}, "data": {"allOf": [{"$ref": "#/components/schemas/SubmissionDecisionCallbackData"}], "description": "Event-specific callback payload."}}}}, "securitySchemes": {"SessionAuth": {"type": "apiKey", "in": "cookie", "name": "__Secure-sessionid"}, "UserTokenAuth": {"type": "http", "scheme": "bearer"}}}, "servers": [{"url": "/", "description": "Current deployment host"}], "security": [{"SessionAuth": []}, {"UserTokenAuth": []}], "tags": [{"name": "users", "description": "Current-user profile and API token management endpoints."}, {"name": "catalog", "description": "Read-only public catalog discovery endpoints with optional authentication, plus product review endpoints."}, {"name": "submissions", "description": "Authenticated submission workflow endpoints for public API clients."}, {"name": "feedback", "description": "Authenticated one-way intake for reporting a bug, requesting a feature, or flagging a documentation gap in the API."}], "webhooks": {"productReviewApproved": {"post": {"summary": "Product Review Approved Callback", "description": "Sent to the registered callback URL when a product review is approved.", "requestBody": {"required": true, "content": {"application/cloudevents+json": {"schema": {"$ref": "#/components/schemas/ProductReviewApprovedCloudEvent"}, "examples": {"default": {"summary": "Product Review Approved Callback", "value": {"specversion": "1.0", "id": "0a536ee7-5f0f-58a8-85ce-d64e89f58fe7", "source": "/api/v1/catalog/product-reviews", "type": "com.openagentguide.product-review.approved", "time": "2026-03-23T14:30:00+00:00", "subject": "product_review/0c0b2242-f6df-4d3a-8de0-6c515838deaa", "datacontenttype": "application/json", "data": {"review_id": "0c0b2242-f6df-4d3a-8de0-6c515838deaa", "product_id": "b7ff7e11-f243-467e-9072-e3e5f9066445", "status": "approved", "url": "/api/v1/catalog/products/b7ff7e11-f243-467e-9072-e3e5f9066445/reviews/0c0b2242-f6df-4d3a-8de0-6c515838deaa/", "approved_at": "2026-03-23T14:30:00+00:00"}}}}}}}, "responses": {"200": {"description": "Callback accepted successfully."}}}}, "productReviewRejected": {"post": {"summary": "Product Review Rejected Callback", "description": "Sent to the registered callback URL when a product review is rejected.", "requestBody": {"required": true, "content": {"application/cloudevents+json": {"schema": {"$ref": "#/components/schemas/ProductReviewRejectedCloudEvent"}, "examples": {"default": {"summary": "Product Review Rejected Callback", "value": {"specversion": "1.0", "id": "b38fe0cf-0170-5fd8-a0c1-f6c5ebc67255", "source": "/api/v1/catalog/product-reviews", "type": "com.openagentguide.product-review.rejected", "time": "2026-03-23T14:35:00+00:00", "subject": "product_review/0c0b2242-f6df-4d3a-8de0-6c515838deaa", "datacontenttype": "application/json", "data": {"review_id": "0c0b2242-f6df-4d3a-8de0-6c515838deaa", "product_id": "b7ff7e11-f243-467e-9072-e3e5f9066445", "status": "rejected", "url": "/api/v1/catalog/products/b7ff7e11-f243-467e-9072-e3e5f9066445/reviews/0c0b2242-f6df-4d3a-8de0-6c515838deaa/", "rejected_at": "2026-03-23T14:35:00+00:00", "rejection_reason": "Needs more concrete usage evidence."}}}}}}}, "responses": {"200": {"description": "Callback accepted successfully."}}}}, "submissionMerged": {"post": {"summary": "Submission Merged Callback", "description": "Sent to the registered callback URL when a submission is merged.", "requestBody": {"required": true, "content": {"application/cloudevents+json": {"schema": {"$ref": "#/components/schemas/SubmissionMergedCloudEvent"}, "examples": {"default": {"summary": "Submission Merged Callback", "value": {"specversion": "1.0", "id": "edc2506d-f198-56da-a2ff-f05e5e721ed6", "source": "/api/v1/submissions", "type": "com.openagentguide.submission.merged", "time": "2026-03-23T14:40:00+00:00", "subject": "submission/f8621ccd-aeb7-47da-9706-2b0f7d4d6daa", "datacontenttype": "application/json", "data": {"submission_id": "f8621ccd-aeb7-47da-9706-2b0f7d4d6daa", "app_label": "catalog", "model": "organization", "object_id": "4eb1d4eb-bf34-4bb5-84e8-4e6ef8b369a1", "status": "merged", "url": "/api/v1/submissions/f8621ccd-aeb7-47da-9706-2b0f7d4d6daa/", "merged_at": "2026-03-23T14:40:00+00:00", "merge_summary": "Verified against the source site."}}}}}}}, "responses": {"200": {"description": "Callback accepted successfully."}}}}, "submissionClosed": {"post": {"summary": "Submission Closed Callback", "description": "Sent to the registered callback URL when a submission is closed.", "requestBody": {"required": true, "content": {"application/cloudevents+json": {"schema": {"$ref": "#/components/schemas/SubmissionClosedCloudEvent"}, "examples": {"default": {"summary": "Submission Closed Callback", "value": {"specversion": "1.0", "id": "f87671bf-a9a9-5199-87d5-a806cfd732dc", "source": "/api/v1/submissions", "type": "com.openagentguide.submission.closed", "time": "2026-03-23T14:45:00+00:00", "subject": "submission/f8621ccd-aeb7-47da-9706-2b0f7d4d6daa", "datacontenttype": "application/json", "data": {"submission_id": "f8621ccd-aeb7-47da-9706-2b0f7d4d6daa", "app_label": "catalog", "model": "organization", "object_id": "4eb1d4eb-bf34-4bb5-84e8-4e6ef8b369a1", "status": "closed", "url": "/api/v1/submissions/f8621ccd-aeb7-47da-9706-2b0f7d4d6daa/", "closed_at": "2026-03-23T14:45:00+00:00", "close_reason": "Superseded by another proposal."}}}}}}}, "responses": {"200": {"description": "Callback accepted successfully."}}}}}}