{"openapi":"3.1.0","info":{"title":"Forge Content external and public HTTP contract","version":"2.0.0","description":"Versioned Forge API, Marketplace, developer-platform, public endpoint and webhook contract. API keys and sessions are tenant-scoped; write retries use explicit idempotency keys."},"servers":[{"url":"https://forgecontent.io"}],"x-forge-deprecation-policy":"Additive first; retain an old operation for at least one reviewed release and measured zero-use window before removal.","paths":{"/.netlify/functions/api":{"post":{"operationId":"forgeApi","summary":"Use the tenant-scoped Forge REST or MCP API","security":[{"forgeApiKey":[]}],"x-forge-abuse-control":true,"x-forge-rate-limit":"120 requests per minute per key and IP","x-forge-idempotency":"Idempotency-Key is required for every metered marketplace-app call and for reliable generate_post retries","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiRequest"}}}},"responses":{"200":{"description":"Action or JSON-RPC result"},"400":{"description":"Invalid action or body"},"401":{"description":"Missing, invalid or revoked API key"},"409":{"description":"Identical write is already in progress"},"429":{"description":"Rate limited"}}}},"/.netlify/functions/marketplace-api":{"get":{"operationId":"marketplaceCatalog","summary":"Read the live database-backed app catalog or published reviews","x-forge-public":true,"x-forge-abuse-control":true,"responses":{"200":{"description":"Fixed-shape live catalog"},"503":{"description":"Catalog temporarily unavailable"}}},"post":{"operationId":"marketplaceAccountAction","summary":"Read state, sync, install, uninstall or review an app","security":[{"portalSession":[]}],"x-forge-abuse-control":true,"responses":{"200":{"description":"Tenant-scoped marketplace state"},"400":{"description":"Invalid request or installation prerequisite"},"401":{"description":"Sign-in required"},"403":{"description":"Tenant mismatch"}}}},"/.netlify/functions/developer-api":{"post":{"operationId":"developerPlatform","summary":"Authenticate a developer, review or submit an app, read revenue, and activate verified Stripe Connect payouts","security":[{"developerSession":[]}],"x-forge-abuse-control":true,"x-forge-auto-review":"Manifest, customer support, privacy, permissions, external JavaScript, secrets, SDK, webhook and billing checks","responses":{"200":{"description":"Developer action completed"},"201":{"description":"Submission accepted"},"400":{"description":"Manifest or review failure"},"401":{"description":"Developer session required"},"429":{"description":"Rate limited"},"503":{"description":"Developer service or payout provider unavailable"}}}},"/.netlify/functions/csp-report":{"post":{"operationId":"cspReport","summary":"Receive a bounded browser CSP report","x-forge-public":true,"x-forge-abuse-control":true,"responses":{"204":{"description":"Report accepted"},"400":{"description":"Invalid report"},"413":{"description":"Report too large"}}}},"/.netlify/functions/health-check":{"get":{"operationId":"healthCheck","summary":"Read-only service health","x-forge-public":true,"x-forge-abuse-control":true,"responses":{"200":{"description":"Health state"}}}},"/.netlify/functions/serve-form":{"get":{"operationId":"serveForm","summary":"Render a tenant public form","x-forge-public":true,"x-forge-abuse-control":true,"responses":{"200":{"description":"HTML form"},"404":{"description":"Not found"}}}},"/.netlify/functions/serve-page":{"get":{"operationId":"servePage","summary":"Render a tenant landing page","x-forge-public":true,"x-forge-abuse-control":true,"responses":{"200":{"description":"HTML page"},"404":{"description":"Not found"}}}},"/.netlify/functions/serve-media":{"get":{"operationId":"serveMedia","summary":"Serve an authorised media object","x-forge-public":true,"x-forge-abuse-control":true,"responses":{"200":{"description":"Media response"},"404":{"description":"Not found"}}}},"/.netlify/functions/serve-reschedule":{"get":{"operationId":"serveReschedule","summary":"Render a reschedule flow","x-forge-public":true,"x-forge-abuse-control":true,"responses":{"200":{"description":"HTML page"}}}},"/.netlify/functions/submit-lead":{"post":{"operationId":"submitLead","summary":"Submit a public lead form","x-forge-public":true,"x-forge-abuse-control":true,"x-forge-idempotency":"derived submission key","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicLead"}}}},"responses":{"200":{"description":"Accepted"},"400":{"description":"Invalid request"},"429":{"description":"Rate limited"}}}},"/.netlify/functions/contact-submit":{"post":{"operationId":"contactSubmit","summary":"Submit the public contact form","x-forge-public":true,"x-forge-abuse-control":true,"x-forge-idempotency":"message fingerprint","responses":{"200":{"description":"Accepted"},"429":{"description":"Rate limited"}}}},"/.netlify/functions/agency-api":{"get":{"operationId":"agencyMarketplaceRead","summary":"Search or read public agency directory records","x-forge-public":true,"x-forge-abuse-control":true,"responses":{"200":{"description":"Public fixed-shape agency data"},"404":{"description":"Not found"}}},"post":{"operationId":"agencyMarketplaceAction","summary":"Submit an escrow enquiry, domain claim, or verified removal request","x-forge-public":true,"x-forge-abuse-control":true,"x-forge-idempotency":"derived lead or claim fingerprint","responses":{"200":{"description":"Action accepted"},"201":{"description":"Escrow lead created"},"400":{"description":"Invalid request"},"429":{"description":"Rate limited"}}}},"/.netlify/functions/agency-inbound":{"post":{"operationId":"agencyInboundEmail","summary":"Ingest a Resend agency escrow email","security":[{"inboundEmailSecret":[]}],"x-forge-abuse-control":true,"x-forge-idempotency":"Resend message id","responses":{"200":{"description":"Accepted or updated"},"401":{"description":"Rejected"}}}},"/.netlify/functions/inbound-webhook":{"post":{"operationId":"inboundWebhook","summary":"Ingest a tenant-scoped lead webhook","security":[{"webhookToken":[]}],"x-forge-abuse-control":true,"x-forge-idempotency":"provider event or payload fingerprint","x-forge-replay-window-seconds":300,"responses":{"200":{"description":"Accepted"},"401":{"description":"Rejected"},"409":{"description":"Replay"}}}},"/.netlify/functions/stripe-webhook":{"post":{"operationId":"stripeWebhook","summary":"Apply Stripe billing events","security":[{"stripeSignature":[]}],"x-forge-abuse-control":true,"x-forge-idempotency":"Stripe event id","x-forge-replay-window-seconds":300,"responses":{"200":{"description":"Applied or already applied"},"400":{"description":"Invalid signature"}}}},"/.netlify/functions/zernio-webhook":{"post":{"operationId":"zernioWebhook","summary":"Apply publisher status events","security":[{"webhookSignature":[]}],"x-forge-abuse-control":true,"x-forge-idempotency":"provider event id","x-forge-replay-window-seconds":300,"responses":{"200":{"description":"Applied or already applied"},"401":{"description":"Rejected"}}}},"/.netlify/functions/fal-webhook":{"post":{"operationId":"falWebhook","summary":"Receive generated video completion","security":[{"webhookToken":[]}],"x-forge-abuse-control":true,"x-forge-idempotency":"signed nonce and payload fingerprint atomically claimed in Postgres before mutation","x-forge-replay-window-seconds":900,"responses":{"200":{"description":"Applied or already applied"},"401":{"description":"Rejected"},"503":{"description":"Replay protection unavailable; provider may retry"}}}},"/.netlify/functions/fal-compose-webhook":{"post":{"operationId":"falComposeWebhook","summary":"Receive composed-media completion","security":[{"webhookToken":[]}],"x-forge-abuse-control":true,"x-forge-idempotency":"signed nonce and payload fingerprint atomically claimed in Postgres before mutation","x-forge-replay-window-seconds":900,"responses":{"200":{"description":"Applied or already applied"},"401":{"description":"Rejected"},"503":{"description":"Replay protection unavailable; provider may retry"}}}},"/.netlify/functions/connect-callback":{"get":{"operationId":"socialConnectCallback","summary":"Social OAuth callback","security":[{"oauthState":[]}],"x-forge-abuse-control":true,"x-forge-idempotency":"OAuth state nonce","responses":{"302":{"description":"Return to Forge"},"401":{"description":"Invalid state"}}}},"/.netlify/functions/oauth-callback":{"get":{"operationId":"oauthCallback","summary":"Provider OAuth callback","security":[{"oauthState":[]}],"x-forge-abuse-control":true,"x-forge-idempotency":"OAuth state nonce","responses":{"302":{"description":"Return to Forge"},"401":{"description":"Invalid state"}}}},"/.netlify/functions/zoom-callback":{"get":{"operationId":"zoomCallback","summary":"Zoom OAuth callback","security":[{"oauthState":[]}],"x-forge-abuse-control":true,"x-forge-idempotency":"OAuth state nonce","responses":{"302":{"description":"Return to Forge"},"401":{"description":"Invalid state"}}}},"/.netlify/functions/email-open":{"get":{"operationId":"emailOpen","summary":"Record an email open pixel","x-forge-public":true,"x-forge-abuse-control":true,"x-forge-idempotency":"message and recipient key","responses":{"200":{"description":"Tracking pixel"}}}},"/.netlify/functions/track-click":{"get":{"operationId":"trackClick","summary":"Record a public landing-page click","x-forge-public":true,"x-forge-abuse-control":true,"x-forge-idempotency":"event fingerprint","responses":{"302":{"description":"Redirect"}}}},"/.netlify/functions/track-email-click":{"get":{"operationId":"trackEmailClick","summary":"Record and redirect an email click","x-forge-public":true,"x-forge-abuse-control":true,"x-forge-idempotency":"message and URL key","responses":{"302":{"description":"Redirect"}}}},"/.netlify/functions/track-open":{"get":{"operationId":"trackOpen","summary":"Record a campaign open pixel","x-forge-public":true,"x-forge-abuse-control":true,"x-forge-idempotency":"campaign and recipient key","responses":{"200":{"description":"Tracking pixel"}}}}},"components":{"securitySchemes":{"forgeApiKey":{"type":"http","scheme":"bearer","bearerFormat":"fck_... or fma_...","description":"An Owner-created tenant key, or a short-lived installed-app token bound to one tenant, app and reviewed scope set."},"portalSession":{"type":"apiKey","in":"header","name":"x-session-token","description":"Signed Forge portal session. Its tenant always overrides request data."},"developerSession":{"type":"apiKey","in":"header","name":"x-developer-session","description":"30-day developer session issued after work-email OTP verification."},"oauthState":{"type":"apiKey","in":"query","name":"state"},"stripeSignature":{"type":"apiKey","in":"header","name":"stripe-signature"},"webhookSignature":{"type":"apiKey","in":"header","name":"x-forge-signature"},"webhookToken":{"type":"apiKey","in":"query","name":"token"},"inboundEmailSecret":{"type":"apiKey","in":"header","name":"x-inbound-key"}},"schemas":{"ApiRequest":{"oneOf":[{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["get_credits","list_posts","generate_post"]},"limit":{"type":"integer","minimum":1,"maximum":50},"platform":{"type":"string","examples":["instagram"]},"prompt":{"type":"string","maxLength":1000}},"additionalProperties":true},{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"const":"2.0"},"id":{},"method":{"type":"string"},"params":{"type":"object"}}}]},"PublicLead":{"type":"object","required":["client_id"],"properties":{"client_id":{"type":"string","maxLength":100},"email":{"type":"string","format":"email","maxLength":320},"phone":{"type":"string","maxLength":50},"name":{"type":"string","maxLength":200},"form_data":{"type":"object","additionalProperties":true}},"additionalProperties":false}}}}