Skip to main content
Integrations (integrations:manage) deliver job events somewhere else. GET /v1/integrations/catalog lists the types, each with the JSON Schema of its config, its events and the module it needs.

A generic CRM endpoint

config.field_mapping maps target fields (dots nest) to paths into event, job and result; without one, the event’s summary is sent as is. secrets.authorization is the Authorization header to send; it is write-only and stored encrypted.

HubSpot and Salesforce

Installing answers an authorize_url. The integration stays pending until the person’s consent returns. Then each job event creates or updates the deal:
  • HubSpot finds the deal by match_field (default parser_merchant_id, the merchant’s fingerprint).
  • Salesforce upserts object (default Opportunity) by its external-id field.
field_mapping sets the CRM’s fields from the result (underwriting, status, positions), result_link_field the result’s URL, and defaults the fields every update carries. If the provider later refuses the grant, the integration becomes reauth_required; POST /v1/integrations/{id}/connect gives a new consent link, and the events in between are delivered once it is back.

Corrections

When a reviewer corrects a finished job, or reverts a correction, the job emits job.corrected. crm_push_generic, hubspot and salesforce can take it; Slack alerts do not. Every mapping reads the corrected result: result.* paths see the corrected underwriting, months and rows, and job.* is the event’s summary as corrected, with job.corrections saying what changed. HubSpot and Salesforce then update the same deal, found by its match_field, with the corrected figures. To add it to an installed integration, read its config, add job.corrected to config.events, and send the whole config back. PATCH replaces the config: fields you leave out take their defaults, except events, which keeps the integration’s own list when you leave it out.
The answer’s events lists what the integration now takes. Each correction or revert is one run per integration that takes it.

Delivery

Each event an integration takes becomes a run. 5xx, 429 and timeouts are retried on the webhook schedule; a 4xx ends the run as dead. GET /v1/integrations/{id}/runs shows every run, and POST /v1/integrations/{id}/test sends a ping. Targets must be https on public addresses.

Modules

Modules switch parts of the pipeline per tenant, and are all on by default: underwriting, positions, fraud, email_intake, email_routing, crm_sync and notifications. A module that is off is not computed: its section of the result is empty, result.pipeline.modules_off names it, and its routes answer 403. GET /v1/modules shows yours.