Credentials (
clientId/secret) are inbound-only: Matcher seals them before persistence and never returns them in a response, a log, or an error. Every response on this surface is secret-free by construction. The tenant always comes from the JWT, never from the request body.Create a connection
vendor:pluggyorbelvo.configName: unique (tenant-scoped) connection identity. A duplicate is a409. The webhook token-mint endpoint binds a token to this name.baseUrl: vendor API base URL, stored as the connection host.accountRef: optional opaque vendor account reference (PluggyitemId, Belvo link id) threaded onto the webhook pull. Omit it to create a connection awaiting the end customer’s consent. Bind the returned vendor reference later withPUT.clientId/secret: aggregator API credential, sealed and never emitted.
201 with the secret-free connection descriptor:
List, get, update, delete
Update
Edit an existing connection by id so a mistypedbaseUrl is not permanent. The vendor is immutable. The credential is optional: supply both clientId and secret to rotate the sealed credential, or omit both to leave the stored secret intact. Supplying exactly one is a 400.
Delete
204), freeing its config name for reuse. A non-aggregator connection id returns 404 on any by-id operation. This surface never confirms the existence of a non-aggregator row.
Test a connection
Run a live connectivity check for an existing, bound connection using its already-sealed credential, addressed by
configName. The vendor comes from the stored connection. This call takes no credential and returns none. A connection awaiting consent is not testable until its vendor account reference is bound.
A credentials-don’t-work outcome is an expected test result surfaced as
"healthy": false with a 200, not an error. A missing connection or a stored vendor without a connectivity-test path (Belvo today) surfaces through the standard error response. No test runs. Use the list response’s testable field before offering the action.Connect an awaiting-consent connection
For a connection created without
accountRef, mint a short-lived consent token and open the vendor’s own consent widget in the end customer’s browser. The response carries the token once. Matcher never persists it and never logs it. When the widget returns the vendor item or link id, bind it with PUT /v1/discovery/aggregator-connections/{id} and an accountRef body. You do not need to supply the credential again.
reconsent: true with the exact bound accountRef. Use that echoed value with the vendor widget rather than a locally cached reference. A deployment without a consent path for the vendor returns 422.
Connector types
List the connector types the engine registry has actually registered for this deployment, each tagged with a backend-derived category (
database or rest). The list reflects the live registry. Only connectors registered at boot appear. It drives the connection form’s type-select.
Mint a webhook token
Mint a webhook token bound to an existing aggregator connection. The response carries the raw token and its provider-facing webhook URL once. Matcher stores only the token’s SHA-256 hash.
webhook_url in the aggregator’s dashboard. A missing target connection returns 404.

