{"openapi":"3.1.0","info":{"title":"INITE AI Visibility","version":"2.1.0","summary":"The AI visibility audit, and the company data behind it, as HTTP.","description":"What a third party may call. Public reads: the company record, the badge, and the Atlas of AI tools (search, one tool's record as JSON or markdown, verified-plan price comparisons). Two JSON-RPC surfaces behind optional OAuth: MCP for a model holding tools, A2A for an agent handing another agent a task; both are described by their own discovery documents, linked from `externalDocs`.","contact":{"name":"inite LLC","url":"https://inite.ai","email":"info@inite.ai"},"license":{"name":"Proprietary","url":"https://inite.ai/en/terms"}},"servers":[{"url":"https://inite.ai"}],"externalDocs":{"description":"A2A agent card — skills, interfaces and security for the agent surface","url":"https://inite.ai/.well-known/agent-card.json"},"paths":{"/api/atlas":{"get":{"operationId":"searchAtlas","summary":"Search the Atlas of AI tools","description":"A page of the catalogue filtered without a model: words, a category, slices that must all hold, sorted by measured use by default. Each tool links its full record. `all=1` returns every row (tens of MB) for a crawler; an agent wants the search.","tags":["atlas"],"security":[],"parameters":[{"name":"q","in":"query","required":false,"description":"Words to match in the name and description.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"One Atlas category.","schema":{"type":"string"}},{"name":"slices","in":"query","required":false,"description":"Comma-separated slices that must all hold, e.g. api,free-plan.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"used (default), active, newest or name.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1-100, default 25.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"description":"Rows to skip.","schema":{"type":"integer","minimum":0}},{"name":"all","in":"query","required":false,"description":"1 for the whole feed instead of a page.","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"A page: matched, total, tools, next (the next page or null), and the address templates.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/atlas/{domain}":{"get":{"operationId":"getAtlasTool","summary":"One AI tool's measured record","description":"What it does and for whom, the starting price with the page and day it was read and how it moved, API docs / OpenAPI / MCP server / status page, what it states about your data, use and activity, and verified plans where Atlas Live Data has them. Every fact is dated. `{domain}.md` or `Accept: text/markdown` answers markdown; a name instead of a domain takes the first search match.","tags":["atlas"],"security":[],"parameters":[{"name":"domain","in":"path","required":true,"description":"e.g. otter.ai, or otter.ai.md for markdown","schema":{"type":"string"}}],"responses":{"200":{"description":"The record.","content":{"application/json":{"schema":{"type":"object","required":["domain","name","url"],"additionalProperties":true}},"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"Not in the Atlas; the body carries a search address.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/atlas/live/compare":{"get":{"operationId":"compareVerifiedPlans","summary":"Price tools for a team from verified plans (no account)","description":"Atlas Live Data: the cheapest plan of each tool that fits the conditions, computed from plan editions each backed by a quote from the vendor's pricing page and re-checked nightly. Shaped like a published dataset, with a source line to show beside the table. Category transcription in 10/2026.","tags":["atlas"],"security":[],"externalDocs":{"description":"Live Data docs and drop-in component","url":"https://inite.ai/en/atlas/live-data"},"parameters":[{"name":"products","in":"query","required":true,"description":"Two to five Atlas domains, comma-separated.","schema":{"type":"string"}},{"name":"seats","in":"query","required":false,"description":"People on the plan.","schema":{"type":"integer","minimum":1}},{"name":"volume","in":"query","required":false,"description":"Minutes a month.","schema":{"type":"integer","minimum":0}},{"name":"billing","in":"query","required":false,"description":"monthly (default) or annual.","schema":{"type":"string","enum":["monthly","annual"]}},{"name":"currency","in":"query","required":false,"description":"ISO code; plans in another currency are reported as ineligible, never converted.","schema":{"type":"string"}},{"name":"required","in":"query","required":false,"description":"Comma-separated capabilities every plan must have.","schema":{"type":"string"}}],"responses":{"200":{"description":"The comparison, its freshness and its attribution.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Conditions the category does not take; `error.code` says which.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Daily preview allowance for this address used; see Retry-After.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/atlas/datasets/{id}":{"get":{"operationId":"getLiveDataset","summary":"A published Live Data comparison","description":"The current revision of a published dataset: the table, its freshness (evaluated on read) and the attribution. ETag bound to validity. Creating and publishing one is done over MCP (atlas_dataset_*) with a token.","tags":["atlas"],"security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"JSON.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"No such published dataset."},"410":{"description":"Archived by its owner."}}}},"/api/ai-data":{"get":{"operationId":"getCompanyData","summary":"Structured company data","description":"The fullest structured answer about this company: what is sold, at what price, the service ladder, the site routes, the analyzer feature list and the FAQ. Written for a model crawling or answering questions about INITE. English is canonical.","tags":["public"],"security":[],"responses":{"200":{"description":"The company record.","content":{"application/json":{"schema":{"type":"object","description":"Assembled from the same sources the site renders from, so the shape follows the catalogue rather than a frozen contract. Read it, do not pin to it.","additionalProperties":true}}}}}}},"/api/badge":{"get":{"operationId":"getVisibilityBadge","summary":"Embeddable AI visibility badge","description":"An SVG badge a site owner places on their own pages after an audit. Prints the composite score of the shared report named by `report`; the number is read from the report, never taken from the URL. Without a report it shows no score.","tags":["public"],"security":[],"parameters":[{"name":"report","in":"query","required":false,"description":"The public share id of the audit report (the id in /report/{shareId}).","schema":{"type":"string"}},{"name":"style","in":"query","required":false,"schema":{"type":"string","enum":["flat","gradient"],"default":"gradient"}},{"name":"theme","in":"query","required":false,"schema":{"type":"string","enum":["dark","light"],"default":"dark"}}],"responses":{"200":{"description":"The badge.","content":{"image/svg+xml":{"schema":{"type":"string"}}}}}}},"/api/mcp":{"post":{"operationId":"callMcp","summary":"Model Context Protocol endpoint (JSON-RPC 2.0)","description":"Streamable HTTP MCP, three rails: portal (services, prices, call slots, booking, contact, guides), analyzer (identity check, AI visibility audit) and atlas (tool matching, a tool's measured record, search, market changes, coupons). Open without a token: a guest gets every open tool under per-address allowances and the audit as a survey. A token adds the member tools and the account's own tier; a member tool called without one answers 401 with WWW-Authenticate. Stateless, no session. `/api/mcp/{rail}` serves one rail.","tags":["agent"],"externalDocs":{"description":"MCP server card","url":"https://inite.ai/.well-known/mcp.json"},"security":[{},{"mcpOAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}},{"type":"array","items":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}}}]}}}},"responses":{"200":{"description":"The JSON-RPC reply, or an array of them for a batch.","content":{"application/json":{"schema":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"result":{},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}},"202":{"description":"A notification only; nothing to answer."},"401":{"description":"No token, or a token whose audience is a different endpoint. The `WWW-Authenticate` header names the protected-resource metadata that starts the authorization flow.","headers":{"WWW-Authenticate":{"description":"Bearer resource_metadata=\"…\"","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"result":{},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}}}},"/api/mcp/{rail}":{"post":{"operationId":"callMcpRail","summary":"One rail of the MCP endpoint","description":"The same server as /api/mcp with the tool list cut to one rail. A token minted for /api/mcp is accepted.","tags":["agent"],"security":[{},{"mcpOAuth":[]}],"parameters":[{"name":"rail","in":"path","required":true,"schema":{"type":"string","enum":["portal","analyzer","atlas"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}},{"type":"array","items":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}}}]}}}},"responses":{"200":{"description":"The JSON-RPC reply.","content":{"application/json":{"schema":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"result":{},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}},"202":{"description":"A notification only; nothing to answer."},"401":{"description":"No token, or a token whose audience is a different endpoint. The `WWW-Authenticate` header names the protected-resource metadata that starts the authorization flow.","headers":{"WWW-Authenticate":{"description":"Bearer resource_metadata=\"…\"","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"result":{},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}},"404":{"description":"No such rail."}}}},"/api/a2a":{"post":{"operationId":"callA2a","summary":"Agent2Agent endpoint (JSON-RPC 2.0, A2A v1.0)","description":"A2A v1.0 — PascalCase methods (`SendMessage`, `GetTask`, `ListTasks`, `CancelTask`) and ProtoJSON shapes, so enums arrive as `TASK_STATE_WORKING` and fields as camelCase. `SendStreamingMessage` and `SubscribeToTask` answer with `text/event-stream` instead of JSON. A client announcing an older version in `A2A-Version` is refused rather than served 1.0 shapes under a 0.3 name.","tags":["agent"],"externalDocs":{"description":"A2A agent card","url":"https://inite.ai/.well-known/agent-card.json"},"security":[{},{"a2aOAuth":[]}],"parameters":[{"name":"A2A-Version","in":"header","required":false,"description":"A2A service parameter. Only 1.0 is implemented; anything else is refused with VersionNotSupportedError.","schema":{"type":"string","enum":["1.0"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"The JSON-RPC reply. For the two streaming methods the body is `text/event-stream` and each event is one `data:` line carrying a JSON-RPC envelope.","content":{"application/json":{"schema":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"result":{},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}},"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"A version, batch or parameter the endpoint refuses. The A2A error code is in `error.code`.","content":{"application/json":{"schema":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"result":{},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}},"401":{"description":"No token, or a token whose audience is a different endpoint. The `WWW-Authenticate` header names the protected-resource metadata that starts the authorization flow.","headers":{"WWW-Authenticate":{"description":"Bearer resource_metadata=\"…\"","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"result":{},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}},"404":{"description":"TaskNotFoundError — no such task, or none belonging to this account.","content":{"application/json":{"schema":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"result":{},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}}}}},"components":{"securitySchemes":{"mcpOAuth":{"type":"openIdConnect","openIdConnectUrl":"https://auth.inite.ai/.well-known/openid-configuration","description":"Token audience `https://inite.ai/api/mcp`. Protected-resource metadata: https://inite.ai/.well-known/oauth-protected-resource"},"a2aOAuth":{"type":"openIdConnect","openIdConnectUrl":"https://auth.inite.ai/.well-known/openid-configuration","description":"Token audience `https://inite.ai/api/a2a`. Protected-resource metadata: https://inite.ai/.well-known/oauth-protected-resource/api/a2a"}}}}