{"openapi":"3.1.0","info":{"title":"Infaris Platform API","summary":"Identity, plans, and developer discovery for Infaris products.","description":"The Infaris Platform API is the public contract for the Infaris identity provider (OAuth 2.0 / OpenID Connect), the plan catalog, health, changelog, and agent discovery documents.\n\nVersioning: URL path `/api/v1/*` is the current major version. Unversioned `/api/health`, `/api/plans` and `/api/changelog` are stable aliases of the v1 paths. Breaking changes ship as `/api/v2`. Deprecated operations send `Deprecation: true` and a `Sunset` HTTP-date at least 90 days before removal, and are listed in llms.txt plus the changelog.\n\nErrors: 4xx and 5xx on catalog endpoints use RFC 9457 `application/problem+json` with `type`, `title`, `status`, `detail`, `code` and `hint`. OAuth token errors additionally keep the RFC 6749 `error` / `error_description` body.\n\nRate limits: public catalog endpoints advertise IETF `RateLimit` and `RateLimit-Policy` (`public`, 120 requests / 60 seconds). A 429 includes `Retry-After`.\n\nGuard monitoring data lives on the Guard API (https://api.ipulse.one) and Guard MCP (https://api.ipulse.one/mcp). Every operation below has a unique operationId, typed parameters, and a response schema so LLM function-calling can bind to it.","version":"1.0.0","contact":{"name":"Infaris","url":"https://infaris.com/contact","email":"info@infaris.com"},"license":{"name":"Proprietary","url":"https://infaris.com/terms"}},"servers":[{"url":"https://infaris.com","description":"This Infaris identity host (production, preview or local)"}],"tags":[{"name":"Discovery","description":"Machine-readable catalogs and health."},{"name":"OAuth","description":"OAuth 2.0 / OpenID Connect endpoints."},{"name":"Catalog","description":"Public product and billing catalog."},{"name":"Agents","description":"MCP and markdown surfaces for AI agents."}],"security":[],"paths":{"/api":{"get":{"operationId":"getApiIndexUnversioned","tags":["Discovery"],"summary":"Infaris Platform API index","description":"Machine-readable index of the Infaris Platform API: versioning policy, error model, rate-limit convention, and links to OpenAPI, MCP and public v1 endpoints.","responses":{"200":{"description":"API index.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name","version","versioning","errors","rateLimit","links"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"versioning":{"type":"object","additionalProperties":false,"required":["strategy","current","prefix"],"properties":{"strategy":{"type":"string"},"current":{"type":"string"},"prefix":{"type":"string"},"unversionedAliases":{"type":"string"},"deprecation":{"type":"string"}}},"errors":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string"},"spec":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}}}},"rateLimit":{"type":"object","additionalProperties":false,"properties":{"policy":{"type":"string"},"headers":{"type":"array","items":{"type":"string"}}}},"links":{"type":"object","additionalProperties":{"type":"string","format":"uri"}}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1":{"get":{"operationId":"getApiIndex","tags":["Discovery"],"summary":"Infaris Platform API index","description":"Machine-readable index of the Infaris Platform API: versioning policy, error model, rate-limit convention, and links to OpenAPI, MCP and public v1 endpoints.","responses":{"200":{"description":"API index.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name","version","versioning","errors","rateLimit","links"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"versioning":{"type":"object","additionalProperties":false,"required":["strategy","current","prefix"],"properties":{"strategy":{"type":"string"},"current":{"type":"string"},"prefix":{"type":"string"},"unversionedAliases":{"type":"string"},"deprecation":{"type":"string"}}},"errors":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string"},"spec":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}}}},"rateLimit":{"type":"object","additionalProperties":false,"properties":{"policy":{"type":"string"},"headers":{"type":"array","items":{"type":"string"}}}},"links":{"type":"object","additionalProperties":{"type":"string","format":"uri"}}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/health":{"get":{"operationId":"getHealthUnversioned","tags":["Discovery"],"summary":"Liveness probe","description":"Returns whether the Infaris web process is up. Does not query the database. No authentication. Sends RateLimit and API-Version headers.","responses":{"200":{"description":"Process is serving.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["status","service"],"properties":{"status":{"type":"string","examples":["ok"]},"service":{"type":"string","examples":["ipulse"]},"timestamp":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/health":{"get":{"operationId":"getHealth","tags":["Discovery"],"summary":"Liveness probe","description":"Returns whether the Infaris web process is up. Does not query the database. No authentication. Sends RateLimit and API-Version headers.","responses":{"200":{"description":"Process is serving.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["status","service"],"properties":{"status":{"type":"string","examples":["ok"]},"service":{"type":"string","examples":["ipulse"]},"timestamp":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/plans":{"get":{"operationId":"listPlansUnversioned","tags":["Catalog"],"summary":"List Infaris / Guard plans and add-ons","description":"Public catalog of Guard plans, add-ons, bundles, entitlement keys and per-plan add-on caps. No authentication. Rate-limit: 120 requests/minute/IP (RateLimit header).","responses":{"200":{"description":"Plan catalog.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["plans","addons","updatedAt","source"],"properties":{"plans":{"type":"array","items":{"$ref":"#/components/schemas/PlanItem"}},"addons":{"type":"array","items":{"$ref":"#/components/schemas/PlanItem"}},"bundles":{"type":"array","items":{"$ref":"#/components/schemas/PlanItem"}},"features":{"type":"object","additionalProperties":false,"properties":{"areas":{"type":"object","additionalProperties":true},"keys":{"type":"object","additionalProperties":true}}},"addOnCaps":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"type":"integer"}}},"updatedAt":{"type":"string","format":"date-time"},"source":{"type":"string","enum":["db","static"]}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/plans":{"get":{"operationId":"listPlans","tags":["Catalog"],"summary":"List Infaris / Guard plans and add-ons","description":"Public catalog of Guard plans, add-ons, bundles, entitlement keys and per-plan add-on caps. No authentication. Rate-limit: 120 requests/minute/IP (RateLimit header).","responses":{"200":{"description":"Plan catalog.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["plans","addons","updatedAt","source"],"properties":{"plans":{"type":"array","items":{"$ref":"#/components/schemas/PlanItem"}},"addons":{"type":"array","items":{"$ref":"#/components/schemas/PlanItem"}},"bundles":{"type":"array","items":{"$ref":"#/components/schemas/PlanItem"}},"features":{"type":"object","additionalProperties":false,"properties":{"areas":{"type":"object","additionalProperties":true},"keys":{"type":"object","additionalProperties":true}}},"addOnCaps":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"type":"integer"}}},"updatedAt":{"type":"string","format":"date-time"},"source":{"type":"string","enum":["db","static"]}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/changelog":{"get":{"operationId":"listChangelogUnversioned","tags":["Catalog"],"summary":"List product changelog entries","description":"Public release notes. Filter with `app` (product slug) and `limit` (1–200). Pass `appsOnly=true` to list product slugs.","parameters":[{"name":"app","in":"query","required":false,"schema":{"type":"string"},"description":"Product slug to filter, e.g. pulseguard."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"appsOnly","in":"query","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Changelog payload.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/ChangelogEntry"}},"lastUpdated":{"type":"string","format":"date-time"},"source":{"type":"string"},"apps":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/changelog":{"get":{"operationId":"listChangelog","tags":["Catalog"],"summary":"List product changelog entries","description":"Public release notes. Filter with `app` (product slug) and `limit` (1–200). Pass `appsOnly=true` to list product slugs.","parameters":[{"name":"app","in":"query","required":false,"schema":{"type":"string"},"description":"Product slug to filter, e.g. pulseguard."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"appsOnly","in":"query","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Changelog payload.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/ChangelogEntry"}},"lastUpdated":{"type":"string","format":"date-time"},"source":{"type":"string"},"apps":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/.well-known/openid-configuration":{"get":{"operationId":"getOpenIdConfiguration","tags":["OAuth"],"summary":"OpenID Provider metadata","description":"OIDC discovery document (issuer, authorization, token, userinfo, JWKS, and scopes_supported). Agents should start here rather than hard-coding endpoint URLs.","responses":{"200":{"description":"OpenID Provider metadata.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["issuer","authorization_endpoint","token_endpoint","jwks_uri","scopes_supported"],"properties":{"issuer":{"type":"string","format":"uri"},"authorization_endpoint":{"type":"string","format":"uri"},"token_endpoint":{"type":"string","format":"uri"},"userinfo_endpoint":{"type":"string","format":"uri"},"revocation_endpoint":{"type":"string","format":"uri"},"jwks_uri":{"type":"string","format":"uri"},"scopes_supported":{"type":"array","items":{"type":"string","enum":["openid","email","profile","organizations"]}},"response_types_supported":{"type":"array","items":{"type":"string"}},"grant_types_supported":{"type":"array","items":{"type":"string"}},"code_challenge_methods_supported":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/.well-known/jwks.json":{"get":{"operationId":"getJsonWebKeySet","tags":["OAuth"],"summary":"JSON Web Key Set","description":"Public RS256 keys used to verify Infaris access tokens and ID tokens.","responses":{"200":{"description":"JWKS document.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["keys"],"properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/JsonWebKey"}}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/oauth/authorize":{"get":{"operationId":"oauthAuthorize","tags":["OAuth"],"summary":"OAuth 2.0 authorization endpoint","description":"Starts an authorization-code + PKCE flow. Redirects the user to sign-in or consent, then back to redirect_uri with a code. Confidential clients may skip PKCE only when requirePkce is false on the client record. Request only the scopes you need.","parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string"},"description":"Registered OAuth client id."},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","format":"uri"},"description":"Must match a pre-registered redirect URI."},{"name":"response_type","in":"query","required":true,"schema":{"type":"string","enum":["code"]}},{"name":"scope","in":"query","required":false,"schema":{"type":"string"},"description":"Space-delimited scopes. Supported: openid email profile organizations. Default: openid email profile."},{"name":"state","in":"query","required":false,"schema":{"type":"string"}},{"name":"code_challenge","in":"query","required":false,"schema":{"type":"string"},"description":"PKCE S256 challenge. Required for public clients."},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string","enum":["S256"]}},{"name":"nonce","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to sign-in, consent, or the client redirect_uri."},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/oauth/token":{"post":{"operationId":"oauthToken","tags":["OAuth"],"summary":"OAuth 2.0 token endpoint","description":"Exchanges an authorization code (with PKCE verifier) or a refresh token for an access token, refresh token, and optional ID token. Access tokens last 15 minutes; refresh tokens last 30 days and rotate on use.","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","additionalProperties":false,"required":["grant_type"],"properties":{"grant_type":{"type":"string","enum":["authorization_code","refresh_token"]},"code":{"type":"string"},"redirect_uri":{"type":"string","format":"uri"},"client_id":{"type":"string"},"client_secret":{"type":"string"},"code_verifier":{"type":"string"},"refresh_token":{"type":"string"},"scope":{"type":"string"}}}}}},"responses":{"200":{"description":"Issued tokens.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["access_token","token_type","expires_in"],"properties":{"access_token":{"type":"string"},"token_type":{"type":"string","enum":["Bearer"]},"expires_in":{"type":"integer"},"refresh_token":{"type":"string"},"id_token":{"type":"string"},"scope":{"type":"string"}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/oauth/userinfo":{"get":{"operationId":"oauthUserInfo","tags":["OAuth"],"summary":"OpenID Connect UserInfo","description":"Returns claims for the access-token subject. Claims are filtered by the token's scopes: email, profile, organizations. Requires a Bearer access token.","security":[{"oauth2":["openid","email","profile","organizations"]},{"bearerAuth":[]}],"responses":{"200":{"description":"UserInfo claims.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["sub"],"properties":{"sub":{"type":"string"},"email":{"type":"string","format":"email"},"name":{"type":"string"},"picture":{"type":"string","format":"uri"},"image":{"type":"string","format":"uri"},"role":{"type":"string"},"organizations":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationClaim"}}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"oauthUserInfoPost","tags":["OAuth"],"summary":"OpenID Connect UserInfo (POST)","description":"Same claims as GET /api/oauth/userinfo. Clients may send the access token as a Bearer header or in the form body as access_token.","security":[{"oauth2":["openid","email","profile","organizations"]},{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","additionalProperties":false,"properties":{"access_token":{"type":"string"}}}}}},"responses":{"200":{"description":"UserInfo claims.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["sub"],"properties":{"sub":{"type":"string"},"email":{"type":"string","format":"email"},"name":{"type":"string"},"picture":{"type":"string","format":"uri"},"image":{"type":"string","format":"uri"},"role":{"type":"string"},"organizations":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationClaim"}}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/oauth/revoke":{"post":{"operationId":"oauthRevoke","tags":["OAuth"],"summary":"OAuth 2.0 token revocation (RFC 7009)","description":"Revokes an access token or refresh token. Always returns 200, even if the token was unknown, per RFC 7009.","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","additionalProperties":false,"required":["token"],"properties":{"token":{"type":"string"},"token_type_hint":{"type":"string","enum":["access_token","refresh_token"]},"client_id":{"type":"string"},"client_secret":{"type":"string"}}}}}},"responses":{"200":{"description":"Revocation attempted. Body is an empty JSON object.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiDescription","tags":["Discovery"],"summary":"This OpenAPI description","description":"Returns this OpenAPI 3.1 document, including the RFC 9457 Problem schema, /api/v1 paths, and OAuth scopes.","responses":{"200":{"description":"OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["openapi","info","paths"],"properties":{"openapi":{"type":"string","examples":["3.1.0"]},"info":{"type":"object","required":["title","version"],"properties":{"title":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"}}},"paths":{"type":"object","additionalProperties":true},"components":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/.well-known/mcp":{"get":{"operationId":"getMcpHandshake","tags":["Agents"],"summary":"Infaris MCP live handshake","description":"GET handshake for the public Streamable HTTP MCP server. Returns protocolVersion, capabilities (tools + resources), serverInfo, the resource list and the transport URL. POST the same path for JSON-RPC (initialize, resources/list, tools/list, tools/call).","responses":{"200":{"description":"MCP handshake including a non-empty resources array.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["protocolVersion","capabilities","serverInfo","resources"],"properties":{"protocolVersion":{"type":"string"},"capabilities":{"type":"object","additionalProperties":true},"serverInfo":{"type":"object","additionalProperties":true},"instructions":{"type":"string"},"transport":{"type":"object","additionalProperties":true},"resources":{"type":"array","items":{"$ref":"#/components/schemas/McpResource"}},"tools":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"mcpWellKnownJsonRpc","tags":["Agents"],"summary":"Infaris MCP JSON-RPC (well-known)","description":"JSON-RPC 2.0 Model Context Protocol endpoint (Streamable HTTP) at the well-known handshake URL. Public and read-only. Methods: initialize, ping, tools/list, tools/call, resources/list, resources/read.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"JSON-RPC response.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"result":{"type":"object","additionalProperties":true},"error":{"type":"object","additionalProperties":false,"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{}}}}}}}},"202":{"description":"Notification accepted (no JSON-RPC response)."},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/mcp":{"post":{"operationId":"mcpJsonRpc","tags":["Agents"],"summary":"Infaris Streamable HTTP MCP server","description":"JSON-RPC 2.0 Model Context Protocol endpoint (Streamable HTTP). Alias of POST /.well-known/mcp. Public and read-only. Tools: infaris_get_overview, infaris_get_developer_docs, infaris_list_products, infaris_get_when_to_use. resources/list returns HTTPS and infaris:// resources.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"JSON-RPC response.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"result":{"type":"object","additionalProperties":true},"error":{"type":"object","additionalProperties":false,"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{}}}}}}}},"202":{"description":"Notification accepted (no JSON-RPC response)."},"400":{"description":"Invalid request. RFC 9457 problem+json with code, detail and hint.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No resource at this path. List endpoints at GET /api/v1.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"HTTP method not allowed. See Allow and OpenAPI.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Honor RateLimit and Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry once, then check /api/v1/health.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"schemas":{"Problem":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","code"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":400,"maximum":599},"detail":{"type":"string"},"code":{"type":"string"},"instance":{"type":"string"},"hint":{"type":"string"}}},"PlanItem":{"type":"object","additionalProperties":true,"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"currency":{"type":"string"},"isActive":{"type":"boolean"},"explanationNl":{"type":"string"}}},"ChangelogEntry":{"type":"object","additionalProperties":false,"required":["id","name","app","version","createdTime","contentMd"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"app":{"type":"string"},"appColor":{"type":"string"},"version":{"type":"string"},"createdTime":{"type":"string","format":"date-time"},"contentMd":{"type":"string"},"coverImageUrl":{"type":"string","format":"uri","nullable":true}}},"OrganizationClaim":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"role":{"type":"string"},"membershipId":{"type":"string"}}},"JsonWebKey":{"type":"object","additionalProperties":false,"required":["kty","kid"],"properties":{"kty":{"type":"string"},"kid":{"type":"string"},"use":{"type":"string"},"alg":{"type":"string"},"n":{"type":"string"},"e":{"type":"string"}}},"McpResource":{"type":"object","additionalProperties":false,"required":["uri","name","mimeType"],"properties":{"uri":{"type":"string"},"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"mimeType":{"type":"string"}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Infaris OAuth access token (RS256 JWT, 15 minute TTL). Send as `Authorization: Bearer <token>`."},"oauth2":{"type":"oauth2","description":"Infaris authorization-code + PKCE. Request only the scopes the job needs. Guard MCP uses a separate authorization server with `read` and `write` scopes at https://api.ipulse.one/mcp.","flows":{"authorizationCode":{"authorizationUrl":"https://infaris.com/api/oauth/authorize","tokenUrl":"https://infaris.com/api/oauth/token","refreshUrl":"https://infaris.com/api/oauth/token","scopes":{"openid":"OpenID Connect subject identifier (the Infaris user id).","email":"Read the user's email address.","profile":"Read the user's name, profile picture, and role.","organizations":"Read the organizations the user belongs to, including membership roles."}}}}}},"externalDocs":{"description":"Infaris developer resources, Guard API, MCP and CLI","url":"https://infaris.com/developers"},"x-infaris-related":{"docs":"https://docs.infaris.com","guardApi":"https://api.ipulse.one","guardMcp":"https://api.ipulse.one/mcp","oauthScopes":["openid","email","profile","organizations"],"versioning":"url-path /api/v1","errors":"RFC 9457 application/problem+json"}}