Skip to main content
A private connector is an org-owned connector provider backed by an adapter that the customer hosts. Voyant stores the provider manifest, grants, registrations, encrypted signing secret, and normalized connection state; the supplier adapter itself runs outside Voyant infrastructure. This model is for suppliers that are specific to one organization, such as an obscure bed bank, DMC, cruise consolidator, or airline GSA. The contractor building the integration owns the adapter service and exposes the protocol below. For protocol demos without building inventory, point metadata.externalAdapter.baseUrl at the public Voyant sandbox connector Worker and use HMAC as below — the sandbox implements the same operation paths.

Register the provider

Store the one-time signingSecret from the register response in the adapter’s secret manager.

HTTP API

Register the provider with POST /connect/v1/connector-providers. The request body is the connector manifest. Private connectors must include metadata.externalAdapter; hostedWorker and externalAdapter are mutually exclusive. Registration validates the manifest, enforces public HTTPS URL policy on metadata.externalAdapter.baseUrl, and probes the adapter endpoint (well-known manifest preferred; otherwise /health must respond as reachable, including 401/403 when signature is required). After creation, PUT /connect/v1/connector-providers/{key}/manifest re-registers the manifest for the same provider — use it to update capabilities, credential forms, or the adapter target as the integration evolves. Only the owning organization can touch an owned key, and platform-managed metadata (managedByOrganizationId, website, applicationForm, iconObjectKey) is ignored if a manifest tries to set it. Adapters may also self-describe by serving their manifest at /.well-known/voyant-connect/manifest, which is how hosted connectors publish theirs; for private connectors it is optional but useful for voyant-side validation tooling.
The response includes data.provider and data.signingSecret. The signing secret is revealed once. Store it in the adapter service secret manager; later reads do not return it.

URL constraints

metadata.externalAdapter.baseUrl must be a public HTTPS URL. The control plane rejects URLs with credentials, query strings, or fragments, and rejects hosts that are local, internal, loopback, private, link-local, carrier-grade NAT, documentation-only, benchmark, multicast, reserved, or otherwise non-public after DNS resolution. Voyant repeats this policy at connect time in its connector egress relay. The relay resolves the complete DNS answer set, rejects the request if any answer is non-public, selects one accepted address, and pins that address into the TLS connection. It keeps the original hostname for certificate validation and SNI. DNS failure and mixed public/private answers fail closed. The relay does not follow redirects. The configuration-time check remains defense in depth. It is not the check that authorizes the connection, so changing DNS after registration cannot redirect a connector request to a private service. Valid:
Invalid:

Request contract

Connect dispatches each operation with POST to:
If baseUrl is https://adapter.example.com/connect, searchStays is sent to https://adapter.example.com/connect/stays/search. The request body is JSON:
Treat operatorId, marketContext, and now as absent-able: catalog-wide operations dispatch without an operator, and only per-call operations carry the tracing fields. Code the adapter against this exact shape rather than assuming every field is present. The adapter must return one of these JSON envelopes:

Headers and signing

Every external adapter request includes: The egress relay authentication header is platform-internal and is never sent to the adapter. The adapter-facing method, URL path, body, headers, timeout envelope, and response handling are unchanged by relaying. The signature is HMAC-SHA256 over this canonical string:
url.pathname includes any path prefix from baseUrl plus the operation path. It does not include scheme, host, query, or fragment. bodyText is the exact raw request body bytes decoded as text.

Operation paths

The platform dispatches only the operations it needs for a connection and the provider capabilities in use.

Rotate the signing secret

Use POST /connect/v1/connector-providers/:key/signing-secret/rotate to rotate the per-provider external adapter signing secret. The response includes the new data.signingSecret once, alongside the provider row. Deploy the adapter with the new secret before using it exclusively. The current dispatch code signs with the single encrypted secret stored on the provider row.

Grants and sharing

Creating a private provider automatically creates an active owner self-grant. The owning organization can share the provider with another organization using:
Grant request and response payloads use camelCase. A grant can be active, suspended, or revoked, and may include expiresAt.

Lifecycle

Disable a private provider with:
Disable is a kill switch. The provider remains visible to the owner, but access checks deny usage while disabled. Delete a private provider with:
If active connections reference the provider, the API returns 409 with the active connection count. To tear down active references, revoke grants, remove provider registrations and stored provider secret material, and hard-delete the provider row, call:
Hard deletion frees the provider key for re-registration.

Reference implementation

The TUI connector is the reference implementation for the hosted connector protocol. It is registered as an internal provider with metadata.hostedWorker.type = "hosted_worker_target" and protocol version 2026-05-28, and the Connect API dispatches TUI stays and packages operations through the same operation envelope and response envelope described here.