{"openapi":"3.1.0","info":{"title":"Fanaura","version":"1.0.0","summary":"Public website files, form posts, and the Fanaura MCP OAuth scopes.","description":"This document describes the HTTP surface of https://www.fanaura.com and the OAuth scopes for the MCP server at https://app.fanaura.com/mcp. Request public pages with Accept: text/markdown when you want Markdown. Request only the MCP scope the task needs. Canonical protected-resource metadata for the MCP server is https://app.fanaura.com/.well-known/oauth-protected-resource. Authorization server metadata is https://app.fanaura.com/.well-known/oauth-authorization-server."},"servers":[{"url":"https://www.fanaura.com","description":"Fanaura public website"}],"paths":{"/llms.txt":{"get":{"operationId":"getLlmsTxt","summary":"Read the agent guide for Fanaura.","description":"Plain-text index of the site, including when to use Fanaura and how to call it.","security":[],"responses":{"200":{"description":"The llms.txt guide.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"operationId":"getLlmsFullTxt","summary":"Read the full question and answer text.","security":[],"responses":{"200":{"description":"Every public question and answer, page by page.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/sitemap.xml":{"get":{"operationId":"getSitemap","summary":"Read the XML sitemap.","security":[],"responses":{"200":{"description":"Sitemap of public pages.","content":{"application/xml":{"schema":{"type":"string"}}}}}}},"/privacy-policy.txt":{"get":{"operationId":"getPrivacyPolicyText","summary":"Read the privacy policy as plain text.","security":[],"responses":{"200":{"description":"Plain-text privacy policy.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApi","summary":"Read this OpenAPI document.","security":[],"responses":{"200":{"description":"OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"operationId":"getProtectedResourceMetadata","summary":"Read the MCP scope list published for agents that start on this website.","description":"The resource identifier is https://app.fanaura.com/mcp. The same scopes are listed in the fanauraMcpOAuth security scheme. The app host also publishes this metadata at https://app.fanaura.com/.well-known/oauth-protected-resource.","security":[],"responses":{"200":{"description":"OAuth 2.0 protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProtectedResourceMetadata"}}}}}}},"/api/legal/terms":{"get":{"operationId":"getTermsJson","summary":"Read the terms of service as JSON.","security":[],"responses":{"200":{"description":"Terms of service.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegalDocument"}}}}}}},"/api/legal/privacy":{"get":{"operationId":"getPrivacyJson","summary":"Read the privacy policy as JSON.","security":[],"responses":{"200":{"description":"Privacy policy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegalDocument"}}}}}}},"/api/demo":{"post":{"operationId":"submitDemoRequest","summary":"Submit a demo request from a person.","description":"Sends the demo request to Fanaura by email. Call this only when a person asked you to submit the form.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoRequest"}}}},"responses":{"200":{"description":"The request was accepted for email delivery.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormSuccess"}}}},"500":{"description":"The email was not sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/careers":{"post":{"operationId":"submitCareersApplication","summary":"Submit a careers application from a person.","description":"Sends a UGC application to Fanaura by email. Call this only when a person asked you to submit the application.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CareersApplication"}}}},"responses":{"200":{"description":"The application was accepted for email delivery.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormSuccess"}}}},"400":{"description":"A required field is missing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"The email was not sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/revalidate":{"post":{"operationId":"revalidateContent","summary":"Refresh the blog or changelog cache.","description":"Fanaura uses this from its own publish hook. Agents should not call it. The shared secret is the x-revalidate-secret header.","security":[{"revalidateSecret":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevalidateRequest"}}}},"responses":{"200":{"description":"The listed paths were revalidated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevalidateResult"}}}},"401":{"description":"The shared secret did not match.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/mcp":{"servers":[{"url":"https://app.fanaura.com","description":"Fanaura MCP server"}],"post":{"operationId":"callFanauraMcp","summary":"Call the Fanaura MCP server.","description":"Streamable HTTP JSON-RPC for a signed-in Fanaura account. Request only the scope the task needs: journeys:read to read journeys, journeys:write to create or edit a journey, or audience:read to read contacts and audience totals. Use the authorization code grant with PKCE (S256). Dynamic client registration is available at the authorization server.","security":[{"fanauraMcpOAuth":["journeys:read"]},{"fanauraMcpOAuth":["journeys:write"]},{"fanauraMcpOAuth":["audience:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"A JSON-RPC result, or a stream of events when the server streams the reply.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}},"text/event-stream":{"schema":{"type":"string"}}}},"401":{"description":"The bearer token is missing or was rejected. Request a least-privilege scope and retry."}}}}},"components":{"securitySchemes":{"fanauraMcpOAuth":{"type":"oauth2","description":"OAuth 2.0 for https://app.fanaura.com/mcp. Authorization code with PKCE (S256). Request only the scope the task needs. Do not request every scope in this list.","flows":{"authorizationCode":{"authorizationUrl":"https://app.fanaura.com/oauth/mcp/authorize","tokenUrl":"https://app.fanaura.com/api/oauth/mcp/token","refreshUrl":"https://app.fanaura.com/api/oauth/mcp/token","scopes":{"journeys:read":"Read journeys, keywords, destinations, and publish state on the signed-in account.","journeys:write":"Create and edit journeys on the signed-in account. Publishing still requires an active membership and a connected Instagram account.","audience:read":"Read contacts, timelines, and audience totals on the signed-in account."}}}},"revalidateSecret":{"type":"apiKey","in":"header","name":"x-revalidate-secret","description":"Shared secret for the website cache hook. Not an OAuth scope."}},"schemas":{"ProtectedResourceMetadata":{"type":"object","required":["resource","scopes_supported"],"properties":{"resource":{"type":"string","format":"uri"},"authorization_servers":{"type":"array","items":{"type":"string","format":"uri"}},"scopes_supported":{"type":"array","items":{"type":"string","enum":["journeys:read","journeys:write","audience:read"]}},"bearer_methods_supported":{"type":"array","items":{"type":"string","enum":["header"]}},"resource_name":{"type":"string"},"resource_documentation":{"type":"string","format":"uri"},"resource_policy_uri":{"type":"string","format":"uri"},"resource_tos_uri":{"type":"string","format":"uri"}}},"LegalSubsection":{"type":"object","required":["heading"],"properties":{"heading":{"type":"string"},"content":{"type":"string"},"list":{"type":"array","items":{"type":"string"}},"orderedList":{"type":"array","items":{"type":"string"}}}},"LegalSection":{"type":"object","required":["heading"],"properties":{"heading":{"type":"string"},"content":{"type":"string"},"list":{"type":"array","items":{"type":"string"}},"orderedList":{"type":"array","items":{"type":"string"}},"subsections":{"type":"array","items":{"$ref":"#/components/schemas/LegalSubsection"}},"table":{"type":"object","required":["headers","rows"],"properties":{"headers":{"type":"array","items":{"type":"string"}},"rows":{"type":"array","items":{"type":"array","items":{"type":"string"}}}}}}},"LegalDocument":{"type":"object","required":["title","lastUpdated","effectiveDate","sections"],"properties":{"title":{"type":"string"},"lastUpdated":{"type":"string"},"effectiveDate":{"type":"string"},"introduction":{"type":"string"},"sections":{"type":"array","items":{"$ref":"#/components/schemas/LegalSection"}}}},"DemoRequest":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"company":{"type":"string"},"message":{"type":"string"}}},"CareersApplication":{"type":"object","required":["firstName","lastName","location","portfolio"],"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"location":{"type":"string"},"instagram":{"type":"string"},"tiktok":{"type":"string"},"experience":{"type":"string"},"portfolio":{"type":"string"},"strategy":{"type":"string"}}},"FormSuccess":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean"}}},"ErrorMessage":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}},"RevalidateRequest":{"type":"object","properties":{"slug":{"type":"string","description":"Blog or changelog slug to refresh, in addition to the index."},"type":{"type":"string","enum":["blog","changelog"],"description":"Which collection the slug belongs to. Omit it for a blog post."}}},"RevalidateResult":{"type":"object","required":["revalidated"],"properties":{"revalidated":{"type":"boolean"},"slug":{"type":["string","null"]},"type":{"type":"string"}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"description":"Request id. Omit it for a notification."},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}}}}}