Platform architecture¶
A Poly instance is a control-plane API, a gateway, a catalog, Knative FaaS for server functions, and a portal (Canopy / PolyUI). This page is the product runtime.
Managed instances today: NA1 (AWS us-west-2) and EU1 (AWS eu-west-1). The same product APIs can run on customer Kubernetes. Public self-host install docs are deferred; this page does not include cluster recipes or secrets.
Day-1 orientation: How Poly fits together. Picking a resource type: Choosing a Poly resource.
Components¶
Piece |
Role |
|---|---|
Control plane |
Authenticated REST for catalog CRUD and execute metadata. Swagger on the instance: API reference |
Gateway |
HTTP front door: API Function outbound proxy; API Endpoint (webhook) ingress; injected |
Catalog |
Env-scoped resources (functions, Vari, endpoints, jobs, …). Namespaced by Context |
FaaS (Knative) |
Server Function revisions. Client functions never get their own revision |
Portal |
Canopy apps. PolyUI is the default management app ( |
Generated SDK |
Language bindings from a catalog snapshot ( |
Every execute path checks the Bearer API key (tenant, environment, permissions) plus environment entity access. Authentication model. Visibility gates discovery, not writes. Visibility.
Request flows¶
Auth shape on every hop:
Bearer <api-key> → AuthData { tenant, environment, user|application, permissions, … }
→ execute path (api | server | trigger | job | graphql)
API Function (outbound)¶
Caller (SDK or REST)
→ POST /functions/api/:id/execute
→ Auth + environment access
→ Gateway applies the trained HTTP template
→ Third-party response returned to the caller
Server Function¶
Caller
→ POST /functions/server/:id/execute
→ Auth + access
→ Knative invoke
→ Body/status to the caller
Optional: serverSideAsync → HTTP 202 { executionId }
Client Function¶
Caller process (laptop, or inside a server function)
→ Client code runs in-process
→ No /functions/client/:id/execute route
Inbound API Endpoint (webhook) → Trigger¶
HTTP → Webhook Handle
→ Inject x-http-method, x-original-uri
→ Optional security server functions (boolean gate)
→ Fan-out:
Triggers → server function (eventPayload, headersPayload, paramsPayload)
Socket listeners → { body, headers, params, executionId }
→ If Wait for Response: HTTP body from that server function
→ Else: static responsePayload (or empty 200)
Only one trigger per webhook may wait for the response. Events and Triggers.
Job¶
Scheduler → job function entries
→ execute server function with configured
eventPayload / headersPayload / paramsPayload
Job wait timeouts do not cancel the Knative run. Limits and timeouts.
GraphQL Subscription¶
Provider event → GraphQL service
→ server function args [event, params]
→ Also a socket subscription event to live listeners
AI Function¶
Caller → POST /functions/ai/:id/execute
→ Auth + access
→ LLM (optional tools = API or server functions)
→ Separate meter from server function executions
Debugging which hop failed¶
Symptom |
Hop to check |
|---|---|
401 / 403 |
API key, environment, permissions |
Train succeeded, execute 404 |
API Function host URL mode (Using OpenAPI Specs) |
Webhook always returns stub JSON |
No Wait for Response trigger |
Job failed ~10 min; logs still going |
Job wait vs server function |
Empty webhook body |
Content-Type (JSON/XML/text only) |
Assumed Canopy Architecture explains FaaS |
Wrong page; use this one |