Connector fleet HTTP API This reference describes the HTTP contracts used inside an AIP connector fleet. Use it to identify the correct process and route, construct a signed request, and interpret route, lease, replay, and capacity failures. The contract applies to source revision 97be86e9efedf07ecf1783b03800f683f107fb04. It is an implementation boundary between trusted fleet components. It is not a public connector-catalog administration API and does not add fields to AIP 1.0. Three HTTP planes | Plane | Caller | Server | Purpose | | Connector data | Central aipd | Connector host | Deliver a route-pinned action or cancellation and receive a signed result | | Host lifecycle | Connector host | Connector control plane | Register, renew, drain, or take one pre-provisioned replica offline | | Central ingress | Connector host | Central aipd | Publish provider events or return stream chunks for an assigned action | Each plane has its own signer and authorization checks. Bearer authentication for the public native API does not replace these signatures. Operational health, readiness, manifest, and metrics routes have no application authentication in their process routers; protect them at the deployment edge. Connector-host data plane One connector-host process exposes five routes: | Method | Path | Response | | GET | /health | Process-liveness JSON | | GET | /ready | Lease, drain, storage, and connector readiness JSON | | GET | /metrics | Connector-host Prometheus text | | GET | /aip/v1/manifest | The immutable host-bound Manifest | | POST | /aip/v1/messages | A signed response Envelope | The admitted public endpoint must be an absolute URL ending exactly in /aip/v1/messages, without credentials, query, or fragment. HTTPS is required except for explicitly enabled loopback development. The default request-body limit is 4 MiB. Health and readiness GET /health reports process liveness only: { "status": "ok", "protocol": "AIP", "version": "1.0", "service": "aip-connector-host" } GET /ready returns HTTP 200 only when all four conditions are true: • the host is not draining; • its registry lease has not expired; • durable runtime storage passes its probe; and • the connector-specific health probe is ready. Otherwise it returns HTTP 503. The body exposes status, leasevalid, draining, a runtime object with durability, readiness, detail, and recovery state, and a connector readiness object. Readiness does not prove that an external provider request succeeded. Message authentication and route pinning POST /aip/v1/messages accepts a complete AIP Envelope. Before dispatch, the host verifies all of these boundaries: 1. The JSON passes the Envelope schema and decodes successfully. 2. The Ed25519 envelope signature resolves to the configured central gateway DID. 3. from matches the configured gateway principal, kind, and trust domain. 4. to matches this host principal. 5. security.connectorroute matches the admitted tenant, instance, replica, version, and manifest digest. 6. An action or cancellation matches the route's action and capability. 7. Any credential revision and approval authorization remains valid locally. The central dispatcher places these fields in security.connectorroute: | Field | Meaning | | actionid, capabilityid | Durable work coordinates | | tenantid | Verified tenant selected by the central runtime | | instanceid, replicaid, versionid | Pinned fleet destination | | manifestdigest | Admitted immutable capability contract | | catalogrevision, bindingpolicyrevision | Catalog and binding snapshot | | credentialrevisionref, quotapolicyref | Pinned policy references | | replicahealthrevision, fencetoken | Assignment and lease fences | | originalmode | Client mode before the remote-hop projection | | approvalauthorization | Optional terminal approval record verified by the gateway | The deployed remote dispatcher sends actions and action-scoped cancellations. It projects verified tenant identity into the action. An async client action is executed synchronously at the host hop because the central runtime owns durable queueing. A streaming action retains streaming mode and receives only the fixed central callback destination. The host signs every post-decode success or protocol-error envelope with its configured host key. It also correlates the response to the request. The central dispatcher authenticates the endpoint and verifies the expected host principal, DID, and trust domain before accepting the response. Host message errors | HTTP | Code | Condition | | 400 | schema.envelope.invalid | JSON does not pass the envelope schema | | 400 | envelope.decode.invalid | Schema-valid JSON cannot decode as an envelope | | 401 | connectorhost.routemismatch | Gateway signature or sender is not trusted | | 403 | connectorhost.routemismatch | Recipient or pinned route does not match this host | | 503 | connectorhost.notready | Host is draining or its lease or health is invalid | | 429 | connectorhost.capacity | Local action concurrency is exhausted | Schema and decode errors occur before a trustworthy request envelope exists, so those responses are unsigned input errors. Later errors are correlated and signed. Credential or approval-journal checks can add a more specific 403 or 503 error. Host lifecycle control plane The standalone connector control plane exposes: | Method | Path | Purpose | | GET | /health | Process liveness | | GET | /ready | Registry schema, revision, and pool readiness | | GET | /metrics | Fixed-cardinality registry pool snapshot as JSON | | POST | /aip/v1/connector-control | Signed replica lifecycle transition | GET /ready returns HTTP 200 with schemaversion, catalogrevision, and pools only when the restricted registry connection is healthy and the installed schema is current. It returns 503 with schemaok and catalogok otherwise. Unlike connector-host metrics, control-plane /metrics is a JSON pool snapshot, not Prometheus text. Signed lifecycle request The request body has a signed outer wrapper: { "request": { "requestid": "msg0190c42f2d5a70008000000000000001", "issuedat": "2026-07-26T12:00:00Z", "expiresat": "2026-07-26T12:00:30Z", "signerdid": "did:key:z6Mk...", "command": { "operation": "heartbeat", "payload": { "replicaid": "creplbookingregionaone", "previoussequence": 17, "inflight": 3, "connectorready": true } } }, "signature": "base64-ed25519-signature" } signature is standard-base64 Ed25519 over canonical JSON for the request object. signerdid must equal the DID pre-provisioned for that replica. The control plane rejects an invalid signature, an unknown replica, or a signer that does not match the registry record. The accepted clock window is deliberately small. The request lifetime cannot exceed 30 seconds, expiresat must be after issuedat and the current time, and issuedat can be at most five seconds in the future. Lifecycle commands | Operation | Payload | Successful outcome | | register | ConnectorHostRegistration | New lease | | heartbeat | replicaid, previoussequence, inflight, connectorready | Renewed lease | | drain | replicaid, previoussequence | Renewed lease in draining state | | offline | replicaid, previoussequence | offline | Registration contains the complete proposed replica record plus manifestdigest, artifactdigest, tenantid, configrevision, secretproviderref, and capabilitycount. The replica record carries its endpoint, peer principal and DID, trust domain, transport profile, topology, capacity, and initial health state. The control plane compares this proposal with the pre-admitted version, instance, and offline replica identity. previoussequence is a monotonic lease fence. A heartbeat cannot report more in-flight work than admitted capacity. connectorready=false moves the replica offline instead of renewing it as ready. Drain stops new assignments while allowing already pinned work to finish. Signed lifecycle response Every normal or rejected operation returns a signed wrapper containing response and signature. The response repeats requestid, has its own 30-second issuedat and expiresat window, identifies the control-plane signerdid, and carries one outcome: | HTTP | Outcome | Meaning | | 200 | {"status":"lease","lease":{"sequence":n,"expiresat":[...]}} | Register, heartbeat, or drain committed | | 200 | {"status":"offline"} | Offline transition committed | | 403 | {"status":"rejected","code":"connectorcontrol.rejected",...} | Admission or configuration rejection; not retryable | | 503 | {"status":"rejected","code":"connectorcontrol.unavailable",...} | Storage or control service unavailable; retryable | The host verifies the response request ID, trusted control-plane DID, time window, and signature before applying a lease. A response-signing failure is an unsigned HTTP 500 input-style error because no signed response can be produced. The wrapper's issuedat and expiresat fields are RFC 3339 strings. At this revision, ConnectorHostLease.expiresat uses the default time serialization instead: a nine-item array of year, ordinal day, hour, minute, second, nanosecond, and three UTC-offset components. Clients must not assume the lease field is also an RFC 3339 string. Request IDs are replay protected. Retrying the exact signed bytes after a lost response is safe while that request remains the last committed lifecycle transition. Reusing the ID with different content, or replaying an older transition after a later state, is rejected. The control endpoint must be an absolute HTTPS URL ending exactly in /aip/v1/connector-control, with no credentials, query, or fragment. Explicit loopback development may use HTTP. Request and response bodies are limited to 64 KiB. Central connector ingress Central aipd exposes two canonical connector-origin routes: | Method | Path | Canonical body | | POST | /aip/v1/connector-events | EventStream envelope for provider events | | POST | /aip/v1/connector-callbacks | StreamChunk envelope for a streaming action | The connector host requires those exact paths when configuring its event and callback publishers. At this revision both routes mount the same shared handler, which selects behavior from the envelope body rather than the URL. Publishers should still use the canonical path for the body family. Neither route uses native bearer middleware. The ingress validates the AIP envelope schema, exact central recipient, envelope signature, sender principal, registry state, tenant, version, manifest, attestation, and an active replica lease before storing content. Accepted responses are signed central envelopes correlated to the request. Provider-event envelope An event publisher sends a non-empty EventStream with no nextcursor and places these fields in security.connectorevent: | Field | Meaning | | tenantid | Tenant fixed by the enabled connector instance | | instanceid, replicaid, versionid | Originating fleet coordinates | | manifestdigest | Active admitted version digest | | leasesequence | Exact current replica health revision | | channelid | Channel declared by the version manifest | The replica may be ready or draining, but its lease must remain current. The ingress binds each event actor to the signed host, writes verified tenant and connector provenance into event data, and then appends it to the durable event log. Reusing an event ID is accepted only when retained semantic content is equivalent; different content returns connectorevent.idempotencyconflict. Stream-callback envelope A callback publisher sends one StreamChunk. Its security.connectorcallback object contains the complete assigned route: | Field group | Fields | | Work | actionid, capabilityid, tenantid | | Destination | instanceid, replicaid, versionid, manifestdigest | | Policy | catalogrevision, bindingpolicyrevision, credentialrevisionref, quotapolicyref | | Fences | replicahealthrevision, fencetoken | | Mode | originalmode equal to streaming | The chunk action ID must equal the route action ID. All durable assignment fields must match the central route resolver. The current replica must still match the assigned endpoint, identity, DID, trust domain, transport profile, instance, and version. A lease renewal may advance the live health revision, but it cannot invalidate the assignment's other fences. Ingress defaults and responses | Bound | Default | | Signed envelope | 4 MiB | | Events per event envelope | 100 | | One enriched event | 256 KiB | | One stream chunk | 256 KiB | | Concurrent ingress operations | 128 | | Maximum event age | 24 hours | | Maximum future clock skew | 5 minutes | | Maximum stream-callback age | 5 minutes | Successful event ingress returns a signed EventStream containing the stored events. Successful stream ingress returns the signed EventStream produced by the central stream sink. The principal error cases are: | HTTP | Code | Retry | | 404 | connectorevent.notconfigured | No | | 400 | schema.envelope.invalid or envelope.decode.invalid | No | | 400 | connectorevent.invalid or connectorevent.idempotencyconflict | No | | 401 | connectorevent.notauthorized | No | | 503 | connectorevent.capacity | Yes, after 100 ms | | 503 | connectorevent.unavailable | Yes, after 1,000 ms | An error produced after envelope decoding is signed when the central ingress signer is available. Pre-decode and not-configured errors use the ordinary native error response. Request-flow summary | Flow | Sequence | | Start or renew a host | Host signs lifecycle request → control plane verifies pre-provisioned identity and replay → registry transition commits → control plane signs lease → host verifies and applies lease | | Invoke an action | Runtime resolves and fences route → aipd signs pinned envelope → host verifies gateway, route, lease, credential, and approval → connector executes → host signs result → central dispatcher verifies it | | Publish a provider event | Host durably stages event → host signs event stream and route → central ingress verifies current registry state → event log accepts or identifies an idempotent replay | | Stream a result | Central action carries fixed callback route → host signs each chunk → ingress compares the complete durable assignment → runtime stores and exposes the stream | Surface boundaries This API does not expose catalog writes, connector admission, credential material, or registry database access to a connector host. Client-facing actions, queries, sessions, approvals, and audit routes remain in the native HTTP API (http-api.md). Complete deployment settings belong to connector-host configuration (connector-host-configuration.md), and operational transitions belong to connector-host lifecycle (../guides/connector-host-lifecycle.md). Transport retry, destination, and response-authentication rules are detailed in transport bindings (transport-bindings.md). Normative envelope and body definitions remain in JSON schemas (../spec/schemas.md). Related documentation • Deploy a connector fleet (../guides/deploy-connector-fleet.md) • Errors and retry decisions (errors.md) • Identity and trust (../concepts/identity-and-trust.md)