Credentials (
clientId/secret) are inbound-only: Matcher seals them before persistence and never returns them in a response, a log, or an error. 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: opaque vendor account reference (PluggyitemId, Belvo link id) threaded onto the webhook pull. It is optional. Leave it out to connect the account through hosted consent.clientId/secret: aggregator API credential, sealed and never emitted.
201 with the secret-free connection descriptor:
Link a reconciliation source
Matcher ingests the pulled data into the reconciliation source that names the connection. On exactly one source, set
config.connection_config_name to the configName of the connection:
List, get, update, delete
id, vendor, configName, baseUrl, accountRef, testable, and awaitingConsent.
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. The other fields are optional too: a field you leave out keeps its stored value.
Bind an account through hosted consent
A connection created withoutaccountRef waits for consent: it shows "awaitingConsent": true. POST /v1/discovery/aggregator-connections/{id}/connect-token returns a token for the consent widget of the vendor. Send the item or link id that the widget returns as accountRef in the update call above. Discovery describes the full flow.
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 connection using its already-sealed credential, addressed by
configName. Matcher reads the vendor from the stored connection. This call takes no credential and returns none.
A credentials-don’t-work outcome is an expected test result surfaced as
"healthy": false with a 200, not an error. A missing connection returns 404. Matcher cannot test Belvo connections, so a Belvo connection returns 422 (MTCH-0210). A connection that waits for consent returns 422 (MTCH-0211).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.
rest entry lists in requiredFields the credential fields that a REST connection of that type needs. This list excludes aggregator-vendor types (Pluggy/Belvo). The aggregator-connections surface above provisions them.
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.
Matcher verifies each vendor delivery by an HMAC-SHA256 signature of the raw body in X-Webhook-Signature, or by source IP. A delivery that fails verification receives 401.

