{"openapi":"3.1.0","info":{"title":"FellowMakers.app API","version":"0.0.0","description":"One founder asked to connect. Hundreds answered. A landscape of who they are and what they are building, drawn only from what they wrote themselves.\n\nReads need an access token with the `read` scope, writes the `write` scope, and routes that manage the account itself accept only the browser session. Tokens come from the OAuth 2.1 authorization server described in `components.securitySchemes`; client registration is open and immediate.\n\nVersioning is by date. The current version is 2026-09-10; send it as `API-Version` to pin a client, omit it for the current version. Every response under /api carries `API-Version` naming the version that answered; an unknown version is refused with 400 `unsupported_version`. A superseded version keeps answering for at least 90 days with `Deprecation` and `Sunset` headers (RFC 9745, RFC 8594) before it is removed.\n\nRate limits are per 60 seconds: 1200 requests per address for the API, with tighter buckets on the OAuth endpoints. Every response names the policy it passed under in `RateLimit-Policy`; a refusal is 429 with `Retry-After`.\n\nEvery error is the `ApiError` shape: an `error` code or sentence, and `error_description` when there is more to say. A request without a valid token answers 401 with a `WWW-Authenticate` header naming the protected resource metadata. Developer documentation: https://fellowmakers.app/developers.","contact":{"name":"Aleksei Krasnoperov","email":"hello@fellowmakers.app","url":"https://krasnoperov.me"}},"servers":[{"url":"https://fellowmakers.app","description":"FellowMakers.app"}],"externalDocs":{"url":"https://fellowmakers.app/developers","description":"Developer portal"},"tags":[{"name":"Landscape","description":"The people who answered one thread and what they are building. Read-only; nothing here needs a token."},{"name":"Service","description":"The API index and health checks. Nothing here needs a token."},{"name":"Auth","description":"Browser sign-in with Google, sessions, and the apps a person has connected."},{"name":"OAuth","description":"The OAuth 2.1 authorization server: discovery, client registration, consent and tokens."},{"name":"User","description":"The signed-in person's profile."}],"components":{"schemas":{"ApiError":{"type":"object","properties":{"error":{"type":"string","description":"A short code or sentence naming what went wrong"},"error_description":{"type":"string","description":"More for a person, when the code alone would not do"}},"required":["error"]}},"parameters":{"ApiVersion":{"name":"API-Version","in":"header","required":false,"description":"The API version the client was written against. Omit it for the current version, 2026-09-10. The response carries the same header, naming the version that answered.","schema":{"type":"string","enum":["2026-09-10"]}}},"securitySchemes":{"oauth2":{"type":"oauth2","description":"OAuth 2.1 authorization code with PKCE (S256), issued by this deployment. Register a client at the registration endpoint or present a Client ID Metadata Document, then send the person to authorize. Metadata: /.well-known/oauth-authorization-server.","flows":{"authorizationCode":{"authorizationUrl":"https://fellowmakers.app/api/oauth/authorize","tokenUrl":"https://fellowmakers.app/api/oauth/token","refreshUrl":"https://fellowmakers.app/api/oauth/token","scopes":{"openid":"Confirm who you are","profile":"See your name","email":"See your email address","read":"Read your data","write":"Change your data on your behalf"}}}},"session":{"type":"apiKey","in":"cookie","name":"auth_token","description":"The browser session set by signing in with Google. Routes that manage the account itself accept only this, never an app token."},"registrationToken":{"type":"http","scheme":"bearer","description":"The registration access token returned by client registration (RFC 7592). It manages that one registration and nothing else."}}},"paths":{"/api":{"get":{"operationId":"apiIndex","summary":"API index","description":"Where this deployment's OpenAPI document, developer documentation, authorization metadata, MCP endpoint and health check are, as absolute URLs. Needs no token.","tags":["Service"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"openapi":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"},"health":{"type":"string","format":"uri"},"mcp":{"type":"object","properties":{"endpoint":{"type":"string","format":"uri"},"serverCard":{"type":"string","format":"uri"}},"required":["endpoint","serverCard"]},"authorization":{"type":"object","properties":{"authorizationServer":{"type":"string","format":"uri"},"protectedResource":{"type":"string","format":"uri"}},"required":["authorizationServer","protectedResource"]},"catalog":{"type":"string","format":"uri"},"llms":{"type":"string","format":"uri"}},"required":["name","version","description","openapi","documentation","health","mcp","authorization","catalog","llms"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/health":{"get":{"operationId":"healthCheck","summary":"Health check","description":"Reports that the service is reachable and which environment answered. Needs no token.","tags":["Service"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"environment":{"type":"string"}},"required":["status"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/hello":{"get":{"operationId":"hello","summary":"Hello","description":"A fixed greeting that proves the API foundation is wired. Needs no token.","tags":["Service"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/.well-known/openid-configuration":{"get":{"operationId":"oauthDiscovery","summary":"OpenID discovery","description":"The authorization server metadata under its OpenID name. The same document as /.well-known/oauth-authorization-server.","tags":["OAuth"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"issuer":{"type":"string","format":"uri"},"authorization_endpoint":{"type":"string","format":"uri"},"token_endpoint":{"type":"string","format":"uri"},"registration_endpoint":{"type":"string","format":"uri"},"revocation_endpoint":{"type":"string","format":"uri"},"jwks_uri":{"type":"string","format":"uri"},"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"}},"token_endpoint_auth_methods_supported":{"type":"array","items":{"type":"string"}},"revocation_endpoint_auth_methods_supported":{"type":"array","items":{"type":"string"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"client_id_metadata_document_supported":{"type":"boolean"}},"required":["issuer","authorization_endpoint","token_endpoint","registration_endpoint","revocation_endpoint","jwks_uri","response_types_supported","grant_types_supported","code_challenge_methods_supported","token_endpoint_auth_methods_supported","revocation_endpoint_auth_methods_supported","scopes_supported","client_id_metadata_document_supported"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"operationId":"oauthAuthorizationServerMetadata","summary":"Authorization server metadata","description":"RFC 8414: the endpoints, grant types, PKCE methods and scopes of this issuer.","tags":["OAuth"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"issuer":{"type":"string","format":"uri"},"authorization_endpoint":{"type":"string","format":"uri"},"token_endpoint":{"type":"string","format":"uri"},"registration_endpoint":{"type":"string","format":"uri"},"revocation_endpoint":{"type":"string","format":"uri"},"jwks_uri":{"type":"string","format":"uri"},"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"}},"token_endpoint_auth_methods_supported":{"type":"array","items":{"type":"string"}},"revocation_endpoint_auth_methods_supported":{"type":"array","items":{"type":"string"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"client_id_metadata_document_supported":{"type":"boolean"}},"required":["issuer","authorization_endpoint","token_endpoint","registration_endpoint","revocation_endpoint","jwks_uri","response_types_supported","grant_types_supported","code_challenge_methods_supported","token_endpoint_auth_methods_supported","revocation_endpoint_auth_methods_supported","scopes_supported","client_id_metadata_document_supported"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"operationId":"oauthProtectedResource","summary":"Protected resource metadata","description":"RFC 9728: which authorization server protects the API, and which scopes it understands.","tags":["OAuth"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"resource":{"type":"string","format":"uri"},"resource_name":{"type":"string"},"authorization_servers":{"type":"array","items":{"type":"string","format":"uri"}},"bearer_methods_supported":{"type":"array","items":{"type":"string"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"jwks_uri":{"type":"string","format":"uri"},"resource_documentation":{"type":"string","format":"uri"}},"required":["resource","resource_name","authorization_servers","bearer_methods_supported","scopes_supported","jwks_uri","resource_documentation"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"operationId":"oauthProtectedResourceMcp","summary":"MCP protected resource metadata","description":"RFC 9728 for the MCP endpoint, which is its own resource. A client refused by /mcp is pointed here to find the authorization server.","tags":["OAuth"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"resource":{"type":"string","format":"uri"},"resource_name":{"type":"string"},"authorization_servers":{"type":"array","items":{"type":"string","format":"uri"}},"bearer_methods_supported":{"type":"array","items":{"type":"string"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"jwks_uri":{"type":"string","format":"uri"},"resource_documentation":{"type":"string","format":"uri"}},"required":["resource","resource_name","authorization_servers","bearer_methods_supported","scopes_supported","jwks_uri","resource_documentation"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/.well-known/jwks.json":{"get":{"operationId":"oauthJwks","summary":"Signing keys","description":"The JSON Web Key Set that verifies the tokens this issuer signs.","tags":["OAuth"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object","properties":{"kid":{"type":"string"},"alg":{"type":"string"},"use":{"type":"string"}},"required":["kid","alg","use"],"additionalProperties":{}}}},"required":["keys"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/oauth/authorize":{"get":{"operationId":"oauthAuthorize","summary":"Authorization endpoint","description":"Starts an authorization code flow with PKCE (S256). Sends the person to sign in and consent, then back to the redirect URI with a code.","tags":["OAuth"],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"client_id","in":"query"},{"schema":{"type":"string","format":"uri"},"required":true,"name":"redirect_uri","in":"query"},{"schema":{"type":"string","enum":["code"]},"required":true,"name":"response_type","in":"query"},{"schema":{"type":"string","minLength":43,"maxLength":128},"required":true,"name":"code_challenge","in":"query"},{"schema":{"type":"string","enum":["S256"]},"required":true,"name":"code_challenge_method","in":"query"},{"schema":{"type":"string"},"required":false,"name":"scope","in":"query"},{"schema":{"type":"string","format":"uri"},"required":false,"name":"resource","in":"query"},{"schema":{"type":"string"},"required":false,"name":"state","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"302":{"description":"Sends the browser to the next step of the flow; there is no body","headers":{"Location":{"description":"Where the browser goes next","schema":{"type":"string","format":"uri"}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"unauthorized_client: the client_id is not registered here","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/oauth/callback":{"get":{"operationId":"oauthCallback","summary":"Sign-in return during authorization","description":"Where Google returns the browser while a client is being authorized. Not called by clients themselves.","tags":["OAuth"],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"code","in":"query"},{"schema":{"type":"string","minLength":1},"required":true,"name":"state","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"302":{"description":"Sends the browser to the next step of the flow; there is no body","headers":{"Location":{"description":"Where the browser goes next","schema":{"type":"string","format":"uri"}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/oauth/token":{"post":{"operationId":"oauthToken","summary":"Token endpoint","description":"Exchanges an authorization code, or a refresh token, for tokens. Form-encoded as RFC 6749 requires; JSON is accepted too.","tags":["OAuth"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"oneOf":[{"type":"object","properties":{"grant_type":{"type":"string","enum":["authorization_code"]},"code":{"type":"string","minLength":1},"code_verifier":{"type":"string","minLength":43,"maxLength":128},"redirect_uri":{"type":"string","format":"uri"},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string","minLength":1},"resource":{"type":"string","format":"uri"}},"required":["grant_type","code","code_verifier","redirect_uri"]},{"type":"object","properties":{"grant_type":{"type":"string","enum":["refresh_token"]},"refresh_token":{"type":"string","minLength":1},"scope":{"type":"string"},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string","minLength":1},"resource":{"type":"string","format":"uri"}},"required":["grant_type","refresh_token"]}]}},"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"grant_type":{"type":"string","enum":["authorization_code"]},"code":{"type":"string","minLength":1},"code_verifier":{"type":"string","minLength":43,"maxLength":128},"redirect_uri":{"type":"string","format":"uri"},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string","minLength":1},"resource":{"type":"string","format":"uri"}},"required":["grant_type","code","code_verifier","redirect_uri"]},{"type":"object","properties":{"grant_type":{"type":"string","enum":["refresh_token"]},"refresh_token":{"type":"string","minLength":1},"scope":{"type":"string"},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string","minLength":1},"resource":{"type":"string","format":"uri"}},"required":["grant_type","refresh_token"]}]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"access_token":{"type":"string"},"token_type":{"type":"string"},"expires_in":{"type":"number"},"scope":{"type":"string"},"refresh_token":{"type":"string"},"refresh_token_expires_in":{"type":"number"},"user":{"type":["object","null"],"properties":{"id":{"type":"number"},"email":{"type":"string","format":"email"},"name":{"type":"string"}},"required":["id"]}},"required":["access_token","token_type","expires_in","scope","user"]}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"invalid_client: the client credentials were missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/oauth/revoke":{"post":{"operationId":"oauthRevoke","summary":"Revoke a token","description":"RFC 7009. Revoking a refresh token ends its grant; the client must authorize again. Answers 200 with an empty object whether or not the token was known, as the RFC requires.","tags":["OAuth"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":1},"token_type_hint":{"type":"string","enum":["access_token","refresh_token"]},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string","minLength":1}},"required":["token"]}},"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":1},"token_type_hint":{"type":"string","enum":["access_token","refresh_token"]},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string","minLength":1}},"required":["token"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"invalid_client: the client credentials were missing or wrong","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/oauth/authorize/request":{"get":{"operationId":"oauthApprovalRequest","summary":"Pending consent request","description":"What the consent page shows: the client and the scopes awaiting the signed-in person's decision. Browser session only.","tags":["OAuth"],"security":[{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"request","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"clientId":{"type":"string"},"clientName":{"type":"string"},"redirectUri":{"type":"string","format":"uri"},"scopes":{"type":"array","items":{"type":"string"}},"user":{"type":"object","properties":{"id":{"type":"number"},"email":{"type":"string","format":"email"}},"required":["id","email"]}},"required":["clientId","clientName","redirectUri","scopes","user"]}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/oauth/authorize/decision":{"post":{"operationId":"oauthApprovalDecision","summary":"Decide a consent request","description":"Approves or declines a pending request. Approval issues the authorization code. Browser session only.","tags":["OAuth"],"security":[{"session":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"request_id":{"type":"string","minLength":1},"approved":{"type":"boolean"}},"required":["request_id","approved"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"redirectUrl":{"type":"string","format":"uri"}},"required":["redirectUrl"]}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/oauth/register":{"post":{"operationId":"oauthClientRegister","summary":"Register a client","description":"RFC 7591 dynamic registration. Open and immediate: the response carries the client_id and a registration access token for managing the registration.","tags":["OAuth"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"client_name":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string"}},"grant_types":{"type":"array","items":{"type":"string"}},"response_types":{"type":"array","items":{"type":"string"}},"scope":{"type":"string"},"token_endpoint_auth_method":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"type":"string"},"client_name":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string"}},"grant_types":{"type":"array","items":{"type":"string"}},"response_types":{"type":"array","items":{"type":"string"}},"scope":{"type":"string"},"token_endpoint_auth_method":{"type":"string"},"client_id_issued_at":{"type":"number"},"client_secret_expires_at":{"type":"number"},"registration_client_uri":{"type":"string","format":"uri"},"registration_access_token":{"type":"string"},"client_secret":{"type":"string"}},"required":["client_id","client_name","redirect_uris","grant_types","response_types","scope","token_endpoint_auth_method","client_id_issued_at","client_secret_expires_at","registration_client_uri"]}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/oauth/register/{clientId}":{"get":{"operationId":"oauthClientGet","summary":"Read a client registration","description":"RFC 7592. The registration as it stands, for the client that holds its registration access token.","tags":["OAuth"],"security":[{"registrationToken":[]}],"parameters":[{"schema":{"type":"string","description":"clientId path parameter"},"required":true,"description":"clientId path parameter","name":"clientId","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"type":"string"},"client_name":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string"}},"grant_types":{"type":"array","items":{"type":"string"}},"response_types":{"type":"array","items":{"type":"string"}},"scope":{"type":"string"},"token_endpoint_auth_method":{"type":"string"},"client_id_issued_at":{"type":"number"},"client_secret_expires_at":{"type":"number"},"registration_client_uri":{"type":"string","format":"uri"},"registration_access_token":{"type":"string"},"client_secret":{"type":"string"}},"required":["client_id","client_name","redirect_uris","grant_types","response_types","scope","token_endpoint_auth_method","client_id_issued_at","client_secret_expires_at","registration_client_uri"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"put":{"operationId":"oauthClientUpdate","summary":"Update a client registration","description":"RFC 7592. Replaces the registered metadata; the client_id stays.","tags":["OAuth"],"security":[{"registrationToken":[]}],"parameters":[{"schema":{"type":"string","description":"clientId path parameter"},"required":true,"description":"clientId path parameter","name":"clientId","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"client_name":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string"}},"grant_types":{"type":"array","items":{"type":"string"}},"response_types":{"type":"array","items":{"type":"string"}},"scope":{"type":"string"},"token_endpoint_auth_method":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"type":"string"},"client_name":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string"}},"grant_types":{"type":"array","items":{"type":"string"}},"response_types":{"type":"array","items":{"type":"string"}},"scope":{"type":"string"},"token_endpoint_auth_method":{"type":"string"},"client_id_issued_at":{"type":"number"},"client_secret_expires_at":{"type":"number"},"registration_client_uri":{"type":"string","format":"uri"},"registration_access_token":{"type":"string"},"client_secret":{"type":"string"}},"required":["client_id","client_name","redirect_uris","grant_types","response_types","scope","token_endpoint_auth_method","client_id_issued_at","client_secret_expires_at","registration_client_uri"]}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"oauthClientDelete","summary":"Delete a client registration","description":"RFC 7592. Removes the registration; tokens issued to the client stop working.","tags":["OAuth"],"security":[{"registrationToken":[]}],"parameters":[{"schema":{"type":"string","description":"clientId path parameter"},"required":true,"description":"clientId path parameter","name":"clientId","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"204":{"description":"Done; there is no body"},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/auth/session":{"get":{"operationId":"authSession","summary":"Current session","description":"The signed-in user of the presented session cookie or bearer token, or null when there is none. Never fails for an anonymous caller.","tags":["Auth"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":["object","null"],"properties":{"id":{"type":"string"},"email":{"type":["string","null"],"format":"email"},"name":{"type":"string"}},"required":["id","email","name"]},"config":{"type":"object","properties":{"googleClientId":{"type":"string"},"twitterEnabled":{"type":"boolean"},"environment":{"type":"string"}},"required":["googleClientId"]}},"required":["user","config"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/auth/google/login":{"get":{"operationId":"authGoogleLogin","summary":"Start Google sign-in","description":"Redirects the browser to Google. The optional redirect query names the local path to return to afterwards.","tags":["Auth"],"parameters":[{"schema":{"type":"string"},"required":false,"name":"return_to","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"302":{"description":"Sends the browser to the next step of the flow; there is no body","headers":{"Location":{"description":"Where the browser goes next","schema":{"type":"string","format":"uri"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/auth/google/callback":{"get":{"operationId":"authGoogleCallback","summary":"Finish Google sign-in","description":"Where Google sends the browser back. Creates the account on first sign-in, starts a session and redirects to the requested page.","tags":["Auth"],"parameters":[{"schema":{"type":"string"},"required":false,"name":"code","in":"query"},{"schema":{"type":"string"},"required":false,"name":"state","in":"query"},{"schema":{"type":"string"},"required":false,"name":"error","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"302":{"description":"Sends the browser to the next step of the flow; there is no body","headers":{"Location":{"description":"Where the browser goes next","schema":{"type":"string","format":"uri"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/auth/logout":{"post":{"operationId":"authLogout","summary":"Sign out","description":"Ends the current browser session and clears its cookie.","tags":["Auth"],"security":[{"session":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/auth/logout/all":{"post":{"operationId":"authLogoutAll","summary":"Sign out everywhere","description":"Ends every session of the signed-in user. Accepts a browser session only, never an app token.","tags":["Auth"],"security":[{"session":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"revoked":{"type":"number"}},"required":["revoked"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/auth/grants":{"get":{"operationId":"authGrantsList","summary":"List connected apps","description":"The OAuth grants the signed-in user has given: the client, the scopes, and when each was created and last used. Browser session only.","tags":["Auth"],"security":[{"session":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"grants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"clientId":{"type":"string"},"clientName":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"number"},"lastUsedAt":{"type":"number"},"expiresAt":{"type":"number"},"revokedAt":{"type":["number","null"]}},"required":["id","clientId","clientName","scopes","createdAt","lastUsedAt","expiresAt","revokedAt"]}}},"required":["grants"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"delete":{"operationId":"authGrantsRevokeAll","summary":"Revoke all connected apps","description":"Revokes every grant of the signed-in user. Browser session only.","tags":["Auth"],"security":[{"session":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"revoked":{"type":"number"}},"required":["revoked"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/auth/grants/{grantId}":{"delete":{"operationId":"authGrantRevoke","summary":"Revoke a connected app","description":"Revokes one grant. Every token issued under it stops working on its next use. Browser session only.","tags":["Auth"],"security":[{"session":[]}],"parameters":[{"schema":{"type":"string","description":"grantId path parameter"},"required":true,"description":"grantId path parameter","name":"grantId","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"revoked":{"type":"number"}},"required":["revoked"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/auth/twitter/login":{"get":{"operationId":"authTwitterLogin","summary":"Sign in with X","description":"Starts X OAuth 2.0 with PKCE and returns the browser to a validated local page.","tags":["Auth"],"parameters":[{"schema":{"type":"string"},"required":false,"name":"return_to","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"302":{"description":"Sends the browser to the next step of the flow; there is no body","headers":{"Location":{"description":"Where the browser goes next","schema":{"type":"string","format":"uri"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/auth/twitter/callback":{"get":{"operationId":"authTwitterCallback","summary":"Complete X sign-in","description":"Verifies the callback and X identity, creates an account if needed and starts a browser session.","tags":["Auth"],"parameters":[{"schema":{"type":"string"},"required":false,"name":"code","in":"query"},{"schema":{"type":"string"},"required":false,"name":"state","in":"query"},{"schema":{"type":"string"},"required":false,"name":"error","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"302":{"description":"Sends the browser to the next step of the flow; there is no body","headers":{"Location":{"description":"Where the browser goes next","schema":{"type":"string","format":"uri"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/user/project-search":{"get":{"operationId":"projectSearch","summary":"Search projects","description":"Hybrid semantic and text search over product descriptions and captured websites. Requires read scope. Sector filters apply before ranking; no people or personal evidence are indexed.","tags":["Landscape"],"security":[{"oauth2":["read"]},{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":2,"maxLength":500,"description":"Describe the product, problem or audience to find, in any language."},"required":true,"description":"Describe the product, problem or audience to find, in any language.","name":"query","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Exact project sector, case-insensitive. Applied before ranking."},"required":false,"description":"Exact project sector, case-insensitive. Applied before ranking.","name":"sector","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":5},"required":false,"name":"limit","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"mode":{"type":"string","enum":["hybrid"]},"candidates":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"project":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"url":{"type":["string","null"]},"unnamed":{"type":"boolean"}},"required":["slug","name","what","sector","url","unnamed"]},"score":{"type":"number"},"reason":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"text":{"type":"string"},"sourceUrl":{"type":["string","null"]},"capturedAt":{"type":["string","null"]}},"required":["field","text","sourceUrl","capturedAt"]}}},"required":["project","score","reason","evidence"]}}},"required":["query","mode","candidates","results"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/user/wave-search":{"get":{"operationId":"waveSearch","summary":"Search waves","description":"Find ideas and waves by meaning, with optional group filtering. Requires read scope.","tags":["Landscape"],"security":[{"oauth2":["read"]},{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":2,"maxLength":500,"description":"Describe the product, problem or audience to find, in any language."},"required":true,"description":"Describe the product, problem or audience to find, in any language.","name":"query","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":5},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":100},"required":false,"name":"group","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"mode":{"type":"string","enum":["hybrid"]},"candidates":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"wave":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"}},"required":["slug","kind","title","lede","position","projectCount","personCount"]},"score":{"type":"number"},"reason":{"type":"string"}},"required":["wave","score","reason"]}}},"required":["query","mode","candidates","results"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/user/profile":{"get":{"operationId":"userProfileGet","summary":"Get profile","description":"The signed-in user: id, email and display name.","tags":["User"],"security":[{"oauth2":["read"]},{"session":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":["string","null"],"format":"email"},"name":{"type":"string"}},"required":["id","email","name"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"patch":{"operationId":"userProfileUpdate","summary":"Update profile","description":"Changes the display name of the signed-in user.","tags":["User"],"security":[{"oauth2":["write"]},{"session":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1}},"required":["name"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":["string","null"],"format":"email"},"name":{"type":"string"}},"required":["id","email","name"]}},"required":["success","user"]}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/user/page":{"get":{"operationId":"ownedPersonGet","summary":"Your public page","description":"Returns the public page owned by the authenticated X account, or null when it has no listing.","tags":["User"],"security":[{"session":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"twitterLinked":{"type":"boolean"},"person":{"type":["object","null"],"properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"category":{"type":["string","null"]},"fieldEvidence":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}},"bio":{"type":["string","null"]},"websiteUrl":{"type":["string","null"]},"placeBased":{"type":["string","null"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"sourcePostId":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"note":{"type":["string","null"]},"startedThread":{"type":"boolean"},"openToConnect":{"type":"boolean"},"skills":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","state"]}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","bio","websiteUrl","placeBased","excerpt","mark","sourcePostId","sourceUrl","channel","note","startedThread","openToConnect","skills","labels","projects"]}},"required":["twitterLinked","person"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"put":{"operationId":"ownedPersonUpdate","summary":"Update your public page","description":"Saves owner changes independently of research imports. Browser session and verified X ownership required.","tags":["User"],"security":[{"session":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":["string","null"],"minLength":1,"maxLength":120},"bio":{"type":["string","null"],"maxLength":2000},"website_url":{"type":["string","null"],"maxLength":2048,"format":"uri"},"role":{"type":["string","null"],"maxLength":200},"place_based":{"type":["string","null"],"maxLength":200},"sector":{"type":["string","null"],"maxLength":200}},"required":["name","bio","website_url","role","place_based","sector"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"twitterLinked":{"type":"boolean"},"person":{"type":["object","null"],"properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"category":{"type":["string","null"]},"fieldEvidence":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}},"bio":{"type":["string","null"]},"websiteUrl":{"type":["string","null"]},"placeBased":{"type":["string","null"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"sourcePostId":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"note":{"type":["string","null"]},"startedThread":{"type":"boolean"},"openToConnect":{"type":"boolean"},"skills":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","state"]}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","bio","websiteUrl","placeBased","excerpt","mark","sourcePostId","sourceUrl","channel","note","startedThread","openToConnect","skills","labels","projects"]}},"required":["twitterLinked","person"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/user/request":{"get":{"operationId":"ownedRequestGet","summary":"Get your card request","description":"Returns the private card request written by the signed-in X account, if any.","tags":["User"],"security":[{"session":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"request":{"type":["object","null"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"building":{"type":["string","null"],"maxLength":120},"what":{"type":["string","null"],"maxLength":200},"url":{"type":["string","null"],"maxLength":2048,"format":"uri"},"place":{"type":["string","null"],"maxLength":120},"intro":{"type":"string","minLength":1,"maxLength":600},"meeting":{"type":["string","null"],"maxLength":200},"consent":{"type":"boolean","enum":[true]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["name","building","what","url","place","intro","meeting","consent","createdAt","updatedAt"],"additionalProperties":false}},"required":["request"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"put":{"operationId":"ownedRequestUpdate","summary":"Write your card request","description":"Creates or replaces the private card request for a signed-in X account that has no public card.","tags":["User"],"security":[{"session":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"building":{"type":["string","null"],"maxLength":120},"what":{"type":["string","null"],"maxLength":200},"url":{"type":["string","null"],"maxLength":2048,"format":"uri"},"place":{"type":["string","null"],"maxLength":120},"intro":{"type":"string","minLength":1,"maxLength":600},"meeting":{"type":["string","null"],"maxLength":200},"consent":{"type":"boolean","enum":[true]}},"required":["name","building","what","url","place","intro","meeting","consent"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"request":{"type":["object","null"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"building":{"type":["string","null"],"maxLength":120},"what":{"type":["string","null"],"maxLength":200},"url":{"type":["string","null"],"maxLength":2048,"format":"uri"},"place":{"type":["string","null"],"maxLength":120},"intro":{"type":"string","minLength":1,"maxLength":600},"meeting":{"type":["string","null"],"maxLength":200},"consent":{"type":"boolean","enum":[true]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["name","building","what","url","place","intro","meeting","consent","createdAt","updatedAt"],"additionalProperties":false}},"required":["request"]}}}},"400":{"description":"The request did not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The account has no linked X identity or its X identity already owns a card.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]},"delete":{"operationId":"ownedRequestDelete","summary":"Withdraw your card request","description":"Deletes the signed-in X account card request; nothing of it is kept. Repeating the operation is safe.","tags":["User"],"security":[{"session":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/user/recommendations":{"get":{"operationId":"userRecommendationsGet","summary":"Your recommendations","description":"People worth knowing and projects around the page the authenticated X account owns, each with the reason and the quotes behind it. Optional project (a slug of an own project) and intent (founders, partners, experience) refine the selection. Private to the owner; an account without a listing gets an empty, clearly labelled answer.","tags":["User"],"security":[{"session":[]}],"parameters":[{"schema":{"type":"string","minLength":1},"required":false,"name":"project","in":"query"},{"schema":{"type":"string","enum":["founders","partners","experience"]},"required":false,"name":"intent","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"context":{"type":"object","properties":{"person":{"type":["object","null"],"properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]},"project":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon"]},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon"]}},"basis":{"type":"string","enum":["project","person","none"]}},"required":["person","project","projects","basis"]},"intent":{"type":["string","null"],"enum":["founders","partners","experience",null]},"people":{"type":"array","items":{"type":"object","properties":{"lens":{"type":"string","enum":["similar_audience","related_problem","complementary_skills"]},"weight":{"type":"number"},"person":{"type":["object","null"],"properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]},"project":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon"]},"shared":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"}},"required":["kind","key","label"]}},"theirs":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"}},"required":["kind","key","label"]}},"evidence":{"type":"object","properties":{"mine":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"theirs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}}},"required":["mine","theirs"]}},"required":["lens","weight","person","project","shared","theirs","evidence"]}},"projects":{"type":"array","items":{"type":"object","properties":{"lens":{"type":"string","enum":["similar_audience","related_problem","complementary_skills"]},"weight":{"type":"number"},"person":{"type":["object","null"],"properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]},"project":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon"]},"shared":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"}},"required":["kind","key","label"]}},"theirs":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"}},"required":["kind","key","label"]}},"evidence":{"type":"object","properties":{"mine":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"theirs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}}},"required":["mine","theirs"]}},"required":["lens","weight","person","project","shared","theirs","evidence"]}},"fallback":{"type":"string","enum":["none","no_record","sparse"]},"coverage":{"type":"object","properties":{"people":{"type":"integer"},"peopleLabelled":{"type":"integer"},"projects":{"type":"integer"},"projectsLabelled":{"type":"integer"}},"required":["people","peopleLabelled","projects","projectsLabelled"]}},"required":["context","intent","people","projects","fallback","coverage"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/user/account":{"delete":{"operationId":"userAccountDelete","summary":"Permanently delete your account and page","description":"Permanently erases the account, page, sole-owned projects and credentials, retaining fingerprints to prevent reimport.","tags":["User"],"security":[{"session":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"confirmation":{"type":"string","enum":["DELETE"]}},"required":["confirmation"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"]}}}},"401":{"description":"No valid credentials. WWW-Authenticate names the protected resource metadata to start from","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"The credentials are valid but not enough: the token lacks the scope, or the action needs a browser session rather than an app token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape":{"get":{"operationId":"landscapeOverview","summary":"Landscape overview","description":"The thread, when the corpus was read, the counts and statistics, the waves, and the projects whose homepage was opened. Needs no token.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"snapshot":{"type":"object","properties":{"generatedAt":{"type":"string"},"posts":{"type":"integer"},"authors":{"type":"integer"},"profilesFetched":{"type":"integer"}},"required":["generatedAt","posts","authors","profilesFetched"]},"thread":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"authorId":{"type":"string"},"text":{"type":"string"},"postedAt":{"type":"string"},"impressions":{"type":"integer"},"likes":{"type":"integer"},"replies":{"type":"integer"},"quotes":{"type":"integer"}},"required":["id","url","authorId","text","postedAt","impressions","likes","replies","quotes"]},"stats":{"type":"object","properties":{"said":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"places":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"placeStated":{"type":"integer"},"sectors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"roles":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"channels":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"authors":{"type":"integer"},"describedWork":{"type":"integer"},"namedProject":{"type":"integer"},"noise":{"type":"integer"}},"required":["key","authors","describedWork","namedProject","noise"]}},"founders":{"type":"integer"}},"required":["said","places","placeStated","sectors","roles","channels","founders"]},"counts":{"type":"object","properties":{"people":{"type":"integer"},"projects":{"type":"integer"},"homepages":{"type":"integer"},"places":{"type":"integer"},"sectors":{"type":"integer"}},"required":["people","projects","homepages","places","sectors"]},"places":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"sectors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"waves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"}},"required":["slug","kind","title","lede","position","projectCount","personCount"]}},"homepages":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"fromProfile":{"type":"boolean"},"site":{"type":["object","null"],"properties":{"url":{"type":"string"},"domain":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"summary":{"type":["string","null"]},"audience":{"type":["string","null"]},"features":{"type":"array","items":{"type":"string"}},"capturedAt":{"type":"string"},"favicon":{"type":["string","null"]},"image":{"type":["string","null"]},"screenshot":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}}},"required":["url","domain","title","description","summary","audience","features","capturedAt","favicon","image","screenshot","evidence"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","state"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"whatEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]},"nameEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","fromProfile","site","builders","labels","whatEvidence"]}}},"required":["snapshot","thread","stats","counts","places","sectors","waves","homepages"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/people":{"get":{"operationId":"landscapePeopleList","summary":"List people","description":"Everyone on the map, in their own words, with counts by sector, place and how much they said. Filter with sector, place, said (named, described, domain, identity) or q, a case-insensitive search over names, handles, bios, replies, project names and project descriptions. Needs no token.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","minLength":1},"required":false,"name":"sector","in":"query"},{"schema":{"type":"string","minLength":1},"required":false,"name":"place","in":"query"},{"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"required":false,"name":"country","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"skill","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"problem","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"audience","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"seeking","in":"query"},{"schema":{"type":"string","enum":["named","described","domain","identity"]},"required":false,"name":"said","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":80},"required":false,"name":"q","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"category":{"type":["string","null"]},"fieldEvidence":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}},"bio":{"type":["string","null"]},"websiteUrl":{"type":["string","null"]},"placeBased":{"type":["string","null"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"sourcePostId":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"note":{"type":["string","null"]},"startedThread":{"type":"boolean"},"openToConnect":{"type":"boolean"},"skills":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","state"]}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","bio","websiteUrl","placeBased","excerpt","mark","sourcePostId","sourceUrl","channel","note","startedThread","openToConnect","skills","labels","projects"]}},"total":{"type":"integer"},"filters":{"type":"object","properties":{"sectors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"places":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"countries":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"skills":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"problems":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"audiences":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"seeking":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"said":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}}},"required":["sectors","places","countries","skills","problems","audiences","seeking","said"]}},"required":["people","total","filters"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/people/{id}":{"get":{"operationId":"landscapePersonGet","summary":"Get a person","description":"One person by account id or by X handle (any case): their words, their projects, their waves, and people near them. Needs no token.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","description":"id path parameter"},"required":true,"description":"id path parameter","name":"id","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"person":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"category":{"type":["string","null"]},"fieldEvidence":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}},"bio":{"type":["string","null"]},"websiteUrl":{"type":["string","null"]},"placeBased":{"type":["string","null"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"sourcePostId":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"note":{"type":["string","null"]},"startedThread":{"type":"boolean"},"openToConnect":{"type":"boolean"},"skills":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","state"]}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","bio","websiteUrl","placeBased","excerpt","mark","sourcePostId","sourceUrl","channel","note","startedThread","openToConnect","skills","labels","projects"]},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"fromProfile":{"type":"boolean"},"site":{"type":["object","null"],"properties":{"url":{"type":"string"},"domain":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"summary":{"type":["string","null"]},"audience":{"type":["string","null"]},"features":{"type":"array","items":{"type":"string"}},"capturedAt":{"type":"string"},"favicon":{"type":["string","null"]},"image":{"type":["string","null"]},"screenshot":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}}},"required":["url","domain","title","description","summary","audience","features","capturedAt","favicon","image","screenshot","evidence"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","state"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"whatEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]},"nameEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","fromProfile","site","builders","labels","whatEvidence"]}},"waves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"}},"required":["slug","kind","title","lede","position","projectCount","personCount"]}},"samePlace":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]}},"sameSector":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]}}},"required":["person","projects","waves","samePlace","sameSector"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/projects":{"get":{"operationId":"landscapeProjectList","summary":"List projects","description":"Every project named or described in the thread, with its builders and, when a homepage was opened, what it says. Needs no token.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"fromProfile":{"type":"boolean"},"site":{"type":["object","null"],"properties":{"url":{"type":"string"},"domain":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"summary":{"type":["string","null"]},"audience":{"type":["string","null"]},"features":{"type":"array","items":{"type":"string"}},"capturedAt":{"type":"string"},"favicon":{"type":["string","null"]},"image":{"type":["string","null"]},"screenshot":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}}},"required":["url","domain","title","description","summary","audience","features","capturedAt","favicon","image","screenshot","evidence"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","state"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"whatEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]},"nameEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","fromProfile","site","builders","labels","whatEvidence"]}},"sectors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}}},"required":["projects","sectors"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/projects/{slug}":{"get":{"operationId":"landscapeProjectGet","summary":"Get a project","description":"One project by slug: its homepage summary, builders, waves, and projects near it. Needs no token.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","description":"slug path parameter"},"required":true,"description":"slug path parameter","name":"slug","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"fromProfile":{"type":"boolean"},"site":{"type":["object","null"],"properties":{"url":{"type":"string"},"domain":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"summary":{"type":["string","null"]},"audience":{"type":["string","null"]},"features":{"type":"array","items":{"type":"string"}},"capturedAt":{"type":"string"},"favicon":{"type":["string","null"]},"image":{"type":["string","null"]},"screenshot":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}}},"required":["url","domain","title","description","summary","audience","features","capturedAt","favicon","image","screenshot","evidence"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","state"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"whatEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]},"nameEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","fromProfile","site","builders","labels","whatEvidence"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"category":{"type":["string","null"]},"fieldEvidence":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}},"bio":{"type":["string","null"]},"websiteUrl":{"type":["string","null"]},"placeBased":{"type":["string","null"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"sourcePostId":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"note":{"type":["string","null"]},"startedThread":{"type":"boolean"},"openToConnect":{"type":"boolean"},"skills":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","state"]}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","bio","websiteUrl","placeBased","excerpt","mark","sourcePostId","sourceUrl","channel","note","startedThread","openToConnect","skills","labels","projects"]}},"waves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"}},"required":["slug","kind","title","lede","position","projectCount","personCount"]}},"related":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"fromProfile":{"type":"boolean"},"site":{"type":["object","null"],"properties":{"url":{"type":"string"},"domain":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"summary":{"type":["string","null"]},"audience":{"type":["string","null"]},"features":{"type":"array","items":{"type":"string"}},"capturedAt":{"type":"string"},"favicon":{"type":["string","null"]},"image":{"type":["string","null"]},"screenshot":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}}},"required":["url","domain","title","description","summary","audience","features","capturedAt","favicon","image","screenshot","evidence"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","state"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"whatEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]},"nameEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","fromProfile","site","builders","labels","whatEvidence"]}}},"required":["project","builders","waves","related"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/waves":{"get":{"operationId":"landscapeWaveList","summary":"List waves","description":"Every wave, with each member resolved to the full project or person. Needs no token.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"waves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"},"body":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"position":{"type":"integer"},"project":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"fromProfile":{"type":"boolean"},"site":{"type":["object","null"],"properties":{"url":{"type":"string"},"domain":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"summary":{"type":["string","null"]},"audience":{"type":["string","null"]},"features":{"type":"array","items":{"type":"string"}},"capturedAt":{"type":"string"},"favicon":{"type":["string","null"]},"image":{"type":["string","null"]},"screenshot":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}}},"required":["url","domain","title","description","summary","audience","features","capturedAt","favicon","image","screenshot","evidence"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","state"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"whatEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]},"nameEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","fromProfile","site","builders","labels","whatEvidence"]},"person":{"type":["object","null"],"properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"category":{"type":["string","null"]},"fieldEvidence":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}},"bio":{"type":["string","null"]},"websiteUrl":{"type":["string","null"]},"placeBased":{"type":["string","null"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"sourcePostId":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"note":{"type":["string","null"]},"startedThread":{"type":"boolean"},"openToConnect":{"type":"boolean"},"skills":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","state"]}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","bio","websiteUrl","placeBased","excerpt","mark","sourcePostId","sourceUrl","channel","note","startedThread","openToConnect","skills","labels","projects"]},"note":{"type":["string","null"]},"theme":{"type":["string","null"]}},"required":["position","project","person","note","theme"]}}},"required":["slug","kind","title","lede","position","projectCount","personCount","body","members"]}}},"required":["waves"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/waves/{slug}":{"get":{"operationId":"landscapeWaveGet","summary":"Get a wave","description":"One wave by slug, with its members resolved. Needs no token.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","description":"slug path parameter"},"required":true,"description":"slug path parameter","name":"slug","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"wave":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"},"body":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"position":{"type":"integer"},"project":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"fromProfile":{"type":"boolean"},"site":{"type":["object","null"],"properties":{"url":{"type":"string"},"domain":{"type":"string"},"title":{"type":["string","null"]},"description":{"type":["string","null"]},"summary":{"type":["string","null"]},"audience":{"type":["string","null"]},"features":{"type":"array","items":{"type":"string"}},"capturedAt":{"type":"string"},"favicon":{"type":["string","null"]},"image":{"type":["string","null"]},"screenshot":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}}},"required":["url","domain","title","description","summary","audience","features","capturedAt","favicon","image","screenshot","evidence"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","state"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"whatEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]},"nameEvidence":{"type":["object","null"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","fromProfile","site","builders","labels","whatEvidence"]},"person":{"type":["object","null"],"properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"category":{"type":["string","null"]},"fieldEvidence":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}},"bio":{"type":["string","null"]},"websiteUrl":{"type":["string","null"]},"placeBased":{"type":["string","null"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"sourcePostId":{"type":["string","null"]},"sourceUrl":{"type":["string","null"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"note":{"type":["string","null"]},"startedThread":{"type":"boolean"},"openToConnect":{"type":"boolean"},"skills":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"labels":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"},"basis":{"type":"string","enum":["statement","website","reviewed"]},"confidence":{"type":"string","enum":["high","medium","low"]},"reason":{"type":["string","null"]},"evidence":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"required":["kind","key","label","basis","confidence","evidence"]}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]},"evidence":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["post","profile","website","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"quote":{"type":"string"},"observedAt":{"type":["string","null"]},"sourceField":{"type":["string","null"]}},"required":["id","kind","sourceUrl","quote","observedAt","sourceField"]}},"review":{"type":["object","null"],"additionalProperties":{}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","state"]}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","bio","websiteUrl","placeBased","excerpt","mark","sourcePostId","sourceUrl","channel","note","startedThread","openToConnect","skills","labels","projects"]},"note":{"type":["string","null"]},"theme":{"type":["string","null"]}},"required":["position","project","person","note","theme"]}}},"required":["slug","kind","title","lede","position","projectCount","personCount","body","members"]}},"required":["wave"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/map":{"get":{"operationId":"landscapeMapGet","summary":"The map","description":"Everyone and every project as the map draws them: country and region when stated, when the post was written, who they want to meet, their skills, and their place on the constellation. Needs no token.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"generatedAt":{"type":"string"},"terms":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"}},"required":["kind","key","label"]}},"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"country":{"type":["string","null"]},"region":{"type":["string","null"],"enum":["europe","north_america","south_america","africa","asia","middle_east","oceania",null]},"postedAt":{"type":["string","null"]},"startedThread":{"type":"boolean"},"reply":{"type":"boolean"},"seeking":{"type":"array","items":{"type":"string"}},"skills":{"type":"array","items":{"type":"string"}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"state":{"type":"string","enum":["own","affiliated","unresolved"]}},"required":["slug","name","siteFavicon","state"]}},"x":{"type":["number","null"]},"y":{"type":["number","null"]}},"required":["id","handle","name","avatarUrl","role","place","country","region","postedAt","startedThread","reply","seeking","skills","projects","x","y"]}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"categories":{"type":"array","items":{"type":"string"}},"region":{"type":["string","null"],"enum":["europe","north_america","south_america","africa","asia","middle_east","oceania",null]},"builders":{"type":"array","items":{"type":"string"}},"x":{"type":["number","null"]},"y":{"type":["number","null"]}},"required":["slug","name","siteFavicon","categories","region","builders","x","y"]}}},"required":["generatedAt","terms","people","projects"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/map/edges":{"get":{"operationId":"landscapeMapEdgesGet","summary":"The lines of the map","description":"Why two people or projects sit near each other: the shared audience, problem or complementary skills behind each line of the constellation. Needs no token.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"edges":{"type":"array","items":{"type":"object","properties":{"subject":{"type":"string"},"other":{"type":"string"},"lens":{"type":"string","enum":["similar_audience","related_problem","complementary_skills"]},"weight":{"type":"number"},"shared":{"type":"array","items":{"type":"string"}},"theirs":{"type":"array","items":{"type":"string"}}},"required":["subject","other","lens","weight","shared","theirs"]}}},"required":["edges"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/views/home":{"get":{"operationId":"landscapeHome","summary":"Home view","description":"The homepage: eight directory rows, eight homepage links, facets, phrase counts and exchange totals. No evidence or review payloads. Public; cached for up to five minutes.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"directory":{"type":"object","properties":{"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"startedThread":{"type":"boolean"},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"unnamed":{"type":"boolean"}},"required":["slug","name","what","unnamed"]}},"wave":{"type":["string","null"]},"seeking":{"type":"array","items":{"type":"string"}},"matched":{"type":"array","items":{"type":"string","enum":["name","handle","project","project_description","skill","problem","words","bio","website"]}},"matchedDescription":{"type":["string","null"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said","excerpt","mark","channel","sourceUrl","startedThread","projects","wave","seeking","matched"]}},"total":{"type":"integer"},"nextOffset":{"type":["integer","null"]},"filters":{"type":"object","properties":{"sectors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"places":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"countries":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"skills":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"problems":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"audiences":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"seeking":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"said":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}}},"required":["sectors","places","countries","skills","problems","audiences","seeking","said"]}},"required":["people","total","nextOffset","filters"]},"sidebar":{"type":"object","properties":{"homepages":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon"]}},"homepageCount":{"type":"integer"},"waves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"}},"required":["slug","kind","title","lede","position","projectCount","personCount"]}}},"required":["homepages","homepageCount","waves"]},"phrases":{"type":"object","properties":{"said":{"type":"number"},"openers":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"count":{"type":"number"}},"required":["label","count"]}},"objects":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"count":{"type":"number"}},"required":["label","count"]}}},"required":["said","openers","objects"]},"exchange":{"type":"object","properties":{"roles":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"targets":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"links":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"target":{"type":"string"},"count":{"type":"number"}},"required":["source","target","count"]}},"stats":{"type":"object","properties":{"wantMarketers":{"type":"number"},"areMarketers":{"type":"number"},"marketingSkill":{"type":"number"},"engineersForDevelopers":{"type":"number"},"engineersForFounders":{"type":"number"},"founders":{"type":"number"},"seekFounders":{"type":"number"}},"required":["wantMarketers","areMarketers","marketingSkill","engineersForDevelopers","engineersForFounders","founders","seekFounders"]}},"required":["roles","targets","links","stats"]}},"required":["directory","sidebar","phrases","exchange"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/views/people":{"get":{"operationId":"landscapeDirectory","summary":"Directory view","description":"Paginated directory rows with global facets and a wave title; each row says whom the person said they want to meet, where its post is and, with q, where the word was found. Filter by sector, problem, audience, skill, seeking, country, place, said, literal substring q, or exchange role. Defaults to 24 rows, maximum 60; nextOffset is null at the end.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","minLength":1},"required":false,"name":"sector","in":"query"},{"schema":{"type":"string","minLength":1},"required":false,"name":"place","in":"query"},{"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"required":false,"name":"country","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"skill","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"problem","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"audience","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"seeking","in":"query"},{"schema":{"type":"string","enum":["named","described","domain","identity"]},"required":false,"name":"said","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":80},"required":false,"name":"q","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"maximum":100000},"required":false,"name":"offset","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":60},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":200},"required":false,"name":"role","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"startedThread":{"type":"boolean"},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"unnamed":{"type":"boolean"}},"required":["slug","name","what","unnamed"]}},"wave":{"type":["string","null"]},"seeking":{"type":"array","items":{"type":"string"}},"matched":{"type":"array","items":{"type":"string","enum":["name","handle","project","project_description","skill","problem","words","bio","website"]}},"matchedDescription":{"type":["string","null"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said","excerpt","mark","channel","sourceUrl","startedThread","projects","wave","seeking","matched"]}},"total":{"type":"integer"},"nextOffset":{"type":["integer","null"]},"filters":{"type":"object","properties":{"sectors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"places":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"countries":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"skills":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"problems":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"audiences":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"seeking":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"said":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}}},"required":["sectors","places","countries","skills","problems","audiences","seeking","said"]}},"required":["people","total","nextOffset","filters"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/views/projects":{"get":{"operationId":"landscapeProjectDirectory","summary":"ProjectDirectory view","description":"Paginated project cards in homepage, named and unnamed order, with builder summaries. Optional q matches a case-insensitive literal substring in name, description or site URL; empty q is ignored. Defaults to 24 rows, maximum 60; follow nextOffset for the next page.","tags":["Landscape"],"parameters":[{"schema":{"type":["integer","null"],"minimum":0,"maximum":100000},"required":false,"name":"offset","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":60},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","maxLength":80},"required":false,"name":"q","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"site":{"type":["object","null"],"properties":{"image":{"type":["string","null"]},"capturedAt":{"type":"string"}},"required":["image","capturedAt"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","site","builders"]}},"total":{"type":"integer"},"nextOffset":{"type":["integer","null"]}},"required":["projects","total","nextOffset"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/views/sidebar":{"get":{"operationId":"landscapeSidebar","summary":"Sidebar view","description":"Eight homepage links, the total homepage count, and wave summaries for the directory sidebar. Public; cached for up to five minutes.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"homepages":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon"]}},"homepageCount":{"type":"integer"},"waves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"}},"required":["slug","kind","title","lede","position","projectCount","personCount"]}}},"required":["homepages","homepageCount","waves"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/views/numbers":{"get":{"operationId":"landscapeNumbers","summary":"Numbers view","description":"The imported snapshot and statistics used by the Numbers page, without any people or project records.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"snapshot":{"type":"object","properties":{"generatedAt":{"type":"string"},"posts":{"type":"integer"},"authors":{"type":"integer"},"profilesFetched":{"type":"integer"}},"required":["generatedAt","posts","authors","profilesFetched"]},"stats":{"type":"object","properties":{"said":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"places":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"placeStated":{"type":"integer"},"sectors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"roles":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}},"required":["key","label","count"]}},"channels":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"authors":{"type":"integer"},"describedWork":{"type":"integer"},"namedProject":{"type":"integer"},"noise":{"type":"integer"}},"required":["key","authors","describedWork","namedProject","noise"]}},"founders":{"type":"integer"}},"required":["said","places","placeStated","sectors","roles","channels","founders"]}},"required":["snapshot","stats"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/views/grid":{"get":{"operationId":"landscapeGrid","summary":"Grid view","description":"Project category marks, builder regions and tooltip identities for the category grid, without profile details or evidence.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"terms":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category"]},"key":{"type":"string"},"label":{"type":"string"}},"required":["kind","key","label"]}},"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"handle":{"type":["string","null"]},"place":{"type":["string","null"]}},"required":["id","name","handle","place"]}},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"unnamed":{"type":"boolean"},"site":{"type":"boolean"},"siteFavicon":{"type":["string","null"]},"sector":{"type":["string","null"]},"categories":{"type":"array","items":{"type":"string"}},"themes":{"type":"array","items":{"type":"string"}},"region":{"type":["string","null"],"enum":["europe","north_america","south_america","africa","asia","middle_east","oceania",null]},"builders":{"type":"array","items":{"type":"string"}}},"required":["slug","name","unnamed","site","siteFavicon","sector","categories","themes","region","builders"]}}},"required":["terms","people","projects"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/views/waves":{"get":{"operationId":"landscapeWavesView","summary":"Wave cards","description":"All wave narratives and compact member cards, without member evidence and review metadata.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"methodology":{"type":"array","items":{"type":"object","properties":{"term":{"type":"string"},"description":{"type":"string"}},"required":["term","description"]}},"waves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"},"group":{"type":"string"},"highlight":{"type":"string"},"relatedWaves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"shared":{"type":"array","items":{"type":"string"}}},"required":["slug","title","shared"]}},"criteria":{"type":"object","properties":{"inclusion":{"type":"string"},"exclusion":{"type":"string"}},"required":["inclusion","exclusion"]},"body":{"type":"string"},"themes":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}},"required":["key","label"]}},"members":{"type":"array","items":{"type":"object","properties":{"position":{"type":"integer"},"note":{"type":["string","null"]},"theme":{"type":["string","null"]},"person":{"type":["object","null"],"properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"startedThread":{"type":"boolean"},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"unnamed":{"type":"boolean"}},"required":["slug","name","what","unnamed"]}},"wave":{"type":["string","null"]},"seeking":{"type":"array","items":{"type":"string"}},"matched":{"type":"array","items":{"type":"string","enum":["name","handle","project","project_description","skill","problem","words","bio","website"]}},"matchedDescription":{"type":["string","null"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said","excerpt","mark","channel","sourceUrl","startedThread","projects","wave","seeking","matched"]},"project":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"site":{"type":["object","null"],"properties":{"image":{"type":["string","null"]},"capturedAt":{"type":"string"}},"required":["image","capturedAt"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","site","builders"]}},"required":["position","note","theme","person","project"]}}},"required":["slug","kind","title","lede","position","projectCount","personCount","body","themes","members"]}}},"required":["waves"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/views/waves/{slug}":{"get":{"operationId":"landscapeWaveView","summary":"Wave detail cards","description":"One wave by slug with its narrative and compact member cards. Returns 404 when the wave is absent.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","description":"slug path parameter"},"required":true,"description":"slug path parameter","name":"slug","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"wave":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"},"group":{"type":"string"},"highlight":{"type":"string"},"relatedWaves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"shared":{"type":"array","items":{"type":"string"}}},"required":["slug","title","shared"]}},"criteria":{"type":"object","properties":{"inclusion":{"type":"string"},"exclusion":{"type":"string"}},"required":["inclusion","exclusion"]},"body":{"type":"string"},"themes":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}},"required":["key","label"]}},"members":{"type":"array","items":{"type":"object","properties":{"position":{"type":"integer"},"note":{"type":["string","null"]},"theme":{"type":["string","null"]},"person":{"type":["object","null"],"properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"startedThread":{"type":"boolean"},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"unnamed":{"type":"boolean"}},"required":["slug","name","what","unnamed"]}},"wave":{"type":["string","null"]},"seeking":{"type":"array","items":{"type":"string"}},"matched":{"type":"array","items":{"type":"string","enum":["name","handle","project","project_description","skill","problem","words","bio","website"]}},"matchedDescription":{"type":["string","null"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said","excerpt","mark","channel","sourceUrl","startedThread","projects","wave","seeking","matched"]},"project":{"type":["object","null"],"properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"site":{"type":["object","null"],"properties":{"image":{"type":["string","null"]},"capturedAt":{"type":"string"}},"required":["image","capturedAt"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","site","builders"]}},"required":["position","note","theme","person","project"]}}},"required":["slug","kind","title","lede","position","projectCount","personCount","body","themes","members"]}},"required":["wave"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/views/people/{id}":{"get":{"operationId":"landscapePersonView","summary":"Person page","description":"One public person page by id or handle, with project summaries, the post date, whom they said they want to meet, related people with the labels both carry, and bounded neighbours. Omits evidence and review metadata.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","description":"id path parameter"},"required":true,"description":"id path parameter","name":"id","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"person":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]},"sourceUrl":{"type":["string","null"]},"note":{"type":["string","null"]},"startedThread":{"type":"boolean"},"bio":{"type":["string","null"]},"websiteUrl":{"type":["string","null"]},"postedAt":{"type":["string","null"]},"editedAt":{"type":["string","null"]},"seeking":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}},"required":["key","label"]}}},"required":["id","handle","name","avatarUrl","role","place","sector","said","excerpt","mark","channel","sourceUrl","note","startedThread","bio","websiteUrl","postedAt","editedAt","seeking"]},"projects":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"site":{"type":["object","null"],"properties":{"summary":{"type":["string","null"]},"capturedAt":{"type":"string"}},"required":["summary","capturedAt"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","site"]}},"waves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"}},"required":["slug","kind","title","lede","position","projectCount","personCount"]}},"related":{"type":"array","items":{"type":"object","properties":{"lens":{"type":"string","enum":["similar_audience","related_problem","complementary_skills"]},"person":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]},"shared":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"}},"required":["kind","key","label"]}},"theirs":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["category","audience","problem","skill","theme"]},"key":{"type":"string"},"label":{"type":"string"}},"required":["kind","key","label"]}}},"required":["lens","person","shared","theirs"]}},"samePlace":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]}},"sameSector":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]}}},"required":["person","projects","waves","related","samePlace","sameSector"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/views/projects/{slug}":{"get":{"operationId":"landscapeProjectView","summary":"Project page","description":"One project page with homepage text, builder excerpts and up to six related cards. Omits evidence and review metadata.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","description":"slug path parameter"},"required":true,"description":"slug path parameter","name":"slug","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"fromProfile":{"type":"boolean"},"site":{"type":["object","null"],"properties":{"url":{"type":"string"},"domain":{"type":"string"},"summary":{"type":["string","null"]},"description":{"type":["string","null"]},"audience":{"type":["string","null"]},"features":{"type":"array","items":{"type":"string"}},"image":{"type":["string","null"]},"screenshot":{"type":["string","null"]},"capturedAt":{"type":"string"}},"required":["url","domain","summary","description","audience","features","image","screenshot","capturedAt"]}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","fromProfile","site"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]},"excerpt":{"type":"string"},"mark":{"type":["object","null"],"properties":{"start":{"type":"integer"},"end":{"type":"integer"}},"required":["start","end"]},"sourceUrl":{"type":["string","null"]},"channel":{"type":"string","enum":["reply","quote","post","pasted_feed"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said","excerpt","mark","sourceUrl","channel"]}},"waves":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"}},"required":["slug","kind","title","lede","position","projectCount","personCount"]}},"related":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"site":{"type":["object","null"],"properties":{"image":{"type":["string","null"]},"capturedAt":{"type":"string"}},"required":["image","capturedAt"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","site","builders"]}}},"required":["project","builders","waves","related"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/views/exchange":{"get":{"operationId":"landscapeExchangeMembers","summary":"Exchange members","description":"Paginated names and project notes for one role-to-seeking ribbon. Use role and seeking to select a ribbon; defaults to twelve members.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","minLength":1},"required":false,"name":"sector","in":"query"},{"schema":{"type":"string","minLength":1},"required":false,"name":"place","in":"query"},{"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"required":false,"name":"country","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"skill","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"problem","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"audience","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":40},"required":false,"name":"seeking","in":"query"},{"schema":{"type":"string","enum":["named","described","domain","identity"]},"required":false,"name":"said","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":80},"required":false,"name":"q","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"maximum":100000},"required":false,"name":"offset","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":60},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":200},"required":false,"name":"role","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"place":{"type":["string","null"]},"projectName":{"type":["string","null"]}},"required":["id","handle","name","avatarUrl","place","projectName"]}},"total":{"type":"number"},"nextOffset":{"type":["number","null"]}},"required":["people","total","nextOffset"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/views/map/graph":{"get":{"operationId":"landscapeMapGraph","summary":"Complete map topology","description":"Every constellation line and global cluster label, with indexed endpoints. Explanations are loaded separately for a selected node; the graph is never truncated.","tags":["Landscape"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"nodes":{"type":"array","items":{"type":"string"}},"lines":{"type":"array","items":{"type":"array","prefixItems":[{"type":"integer","minimum":0},{"type":"integer","minimum":0}]}},"labels":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"number"},"x":{"type":"number"},"y":{"type":"number"}},"required":["key","label","count","x","y"]}}},"required":["nodes","lines","labels"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/views/map/node":{"get":{"operationId":"landscapeMapNode","summary":"Selected map node","description":"All connections touching the selected person or project, with weights and shared term references. Includes both directions without pagination; unavailable nodes have no edges.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","enum":["person","project"]},"required":true,"name":"kind","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":200},"required":true,"name":"id","in":"query"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"edges":{"type":"array","items":{"type":"object","properties":{"subject":{"type":"string"},"other":{"type":"string"},"lens":{"type":"string","enum":["similar_audience","related_problem","complementary_skills"]},"weight":{"type":"number"},"shared":{"type":"array","items":{"type":"string"}},"theirs":{"type":"array","items":{"type":"string"}}},"required":["subject","other","lens","weight","shared","theirs"]}}},"required":["edges"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/views/projects/{slug}/preview":{"get":{"operationId":"landscapeProjectPreview","summary":"Project preview","description":"Compact project facts for hover cards: identity, existing description and confirmed owner or affiliate relationships. Public; cached for up to five minutes.","tags":["Landscape"],"parameters":[{"schema":{"type":"string","description":"slug path parameter"},"required":true,"description":"slug path parameter","name":"slug","in":"path"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"description":{"type":["string","null"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"handle":{"type":["string","null"]},"place":{"type":["string","null"]},"state":{"type":"string","enum":["own","affiliated"]}},"required":["id","name","handle","place","state"]}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","description","builders"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/landscape/search/projects":{"post":{"operationId":"publicProjectSearch","summary":"Search the project catalogue","description":"Public semantic project search. Records submitted queries. No response caching.","tags":["Landscape"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":500,"description":"Describe the product, problem or audience to find, in any language."},"sector":{"type":"string","minLength":1,"maxLength":100,"description":"Exact project sector, case-insensitive. Applied before ranking."},"limit":{"type":"integer","minimum":1,"maximum":20,"default":5}},"required":["query"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"mode":{"type":"string","enum":["hybrid"]},"candidates":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"project":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":["string","null"]},"what":{"type":["string","null"]},"sector":{"type":["string","null"]},"unnamed":{"type":"boolean"},"url":{"type":["string","null"]},"siteDomain":{"type":["string","null"]},"siteFavicon":{"type":["string","null"]},"site":{"type":["object","null"],"properties":{"image":{"type":["string","null"]},"capturedAt":{"type":"string"}},"required":["image","capturedAt"]},"builders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"role":{"type":["string","null"]},"place":{"type":["string","null"]},"sector":{"type":["string","null"]},"said":{"type":"string","enum":["named","described","domain","identity"]}},"required":["id","handle","name","avatarUrl","role","place","sector","said"]}}},"required":["slug","name","what","sector","unnamed","url","siteDomain","siteFavicon","site","builders"]},"score":{"type":"number"},"reason":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"text":{"type":"string"},"sourceUrl":{"type":["string","null"]},"capturedAt":{"type":["string","null"]}},"required":["field","text","sourceUrl","capturedAt"]}}},"required":["project","score","reason","evidence"]}}},"required":["query","mode","candidates","results"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/api/landscape/search/waves":{"post":{"operationId":"publicWaveSearch","summary":"Search the waves","description":"Public semantic wave search. Records submitted queries. No response caching.","tags":["Landscape"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":500,"description":"Describe the product, problem or audience to find, in any language."},"limit":{"type":"integer","minimum":1,"maximum":20,"default":5},"group":{"type":"string","minLength":1,"maxLength":100}},"required":["query"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"mode":{"type":"string","enum":["hybrid"]},"candidates":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"wave":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["wave","solo"]},"title":{"type":"string"},"lede":{"type":"string"},"position":{"type":"integer"},"projectCount":{"type":"integer"},"personCount":{"type":"integer"}},"required":["slug","kind","title","lede","position","projectCount","personCount"]},"score":{"type":"number"},"reason":{"type":"string"}},"required":["wave","score","reason"]}}},"required":["query","mode","candidates","results"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. RateLimit names the policy; Retry-After says when to try again","headers":{"Retry-After":{"description":"Seconds until the bucket refills","schema":{"type":"integer"}},"RateLimit":{"description":"The policy, with nothing left in it","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}}},"webhooks":{}}