Send CLEATUS opportunities to your CRM with webhooks
Push matching opportunities and pipeline changes from CLEATUS into your own CRM or alerting system with a Webhook action in an AI Workflow.
Use a CLEATUS Workflow to send opportunity data to any Hypertext Transfer Protocol Secure (HTTPS) endpoint when an event happens. For example, send data when CLEATUS finds a new match, when a contract enters your pipeline, or when a pursuit changes phase. Use webhooks to feed your own customer relationship management (CRM) system, alert your team about strong leads, or drive any system that accepts a webhook.
Who this is for
Teams that want CLEATUS to push opportunity data out to their own systems, such as a custom CRM, HubSpot, Salesforce, or an internal application programming interface (API). For a no-code path into 5,000+ apps, see the Zapier integration. Webhooks are the direct option.
What you'll need
- A DATA + AI + Automations plan or higher, which includes Workflows.
- An endpoint in your CRM or middleware that accepts a JavaScript Object Notation (JSON) request. It must be a public HTTPS URL.
- Access to Automation > Workflows in CLEATUS.
How it works
A webhook in CLEATUS is an action step inside a Workflow. It is not a separate API subscription.
- A trigger starts the workflow, for example New recommendation.
- Optional If / Else and Filter steps select which items continue.
- A Webhook action sends an HTTP request to your endpoint.
CLEATUS sends the request. Your CRM receives it. You supply the URL and the authentication headers.
Note:
This guide covers CLEATUS sending data to you. A separate Webhook trigger lets an external system send a contract into CLEATUS to start a workflow. That is a different use case.
Configure the Webhook action
| Setting | What it does |
|---|---|
| Method | GET, POST, PUT, PATCH, or DELETE. The default is POST. |
| Endpoint URL | The HTTPS URL of your endpoint. |
| Headers | Values that are not secret. Values can contain variables. CLEATUS sets Content-Type: application/json for every method that sends a body. |
| Secret Headers | API keys and bearer tokens. CLEATUS encrypts the values at rest (AES-256-GCM) and decrypts them only to send the request. After you save, the editor hides the value. To change it, type a new value. |
| Request Body | Optional. The JSON that your endpoint expects, with variables. Leave it empty to send the default payload. All methods except GET can send a body. |
To authenticate to most CRMs, add a Secret Header, for example Authorization with the value Bearer <your-token>, or X-API-Key with your key.
Note:
CLEATUS does not sign outbound webhook requests. There is no hash-based message authentication code (HMAC) signature. Authenticate each request with the API key or bearer token that you set as a Secret Header, and accept requests only over HTTPS. If your security model needs signature checks, contact support.
Endpoint rules
- HTTPS only. CLEATUS rejects URLs that do not use HTTPS.
- Public hosts only. CLEATUS resolves your host name and blocks private and internal Internet Protocol (IP) addresses and cloud metadata addresses. CLEATUS then sends the request to the IP address that it checked. Your endpoint must resolve to a public IP address.
- No redirects. A
3xxredirect response fails the step. Use the final URL.
What CLEATUS sends
The request body depends on the Request Body setting.
| Request Body | What CLEATUS sends |
|---|---|
| Empty | One request with the default payload, even when several items reach the step. |
| Filled in | One request for each item that reaches the step, each built from your template. CLEATUS sends the requests one at a time. |
The default payload
The default payload is a JSON object. The trigger key holds the trigger data. If the workflow has AI Agent steps, their output is also included, under keys such as agent and agent_2.
Example for the New recommendation trigger:
{
"trigger": {
"entityId": "…",
"contractId": "…",
"bestQualityScore": 87,
"scoreCriteria": [],
"title": "…",
"agencyName": "…",
"naicsId": "…",
"solicitationNumber": "…",
"type": "solicitation",
"sourceType": "sam",
"setAside": "SDVOSBC",
"state": "TX",
"postedDate": "2026-07-20T00:00:00.000Z",
"deadlineDate": "2026-08-15T00:00:00.000Z"
}
}
A custom request body
Most third-party APIs need their own JSON shape. Write that shape in Request Body and insert variables:
| Expression | Resolves to |
|---|---|
{{ trigger.<field> }} | A field from the trigger data |
{{ nodes.<StepName>.json.<field> }} | The output of an earlier step |
{{ json.<field> }} | A field of the current item |
A variable with no value becomes an empty string. In a JSON body, CLEATUS escapes text values for you, so quotes and line breaks in the data do not break the JSON.
Example for the Contract added to pipeline trigger:
{
"source": "CLEATUS",
"cleatusContractId": "{{ trigger.contractId }}",
"title": "{{ trigger.title }}",
"agency": "{{ trigger.agencyName }}",
"solicitationNumber": "{{ trigger.solicitationNumber }}",
"naicsCode": "{{ trigger.naicsCode }}",
"deadline": "{{ trigger.deadlineDate }}",
"summary": "{{ trigger.overview }}",
"estimatedValueHigh": "{{ trigger.estimatedValueHigh }}",
"contractingOfficer": "{{ trigger.primaryContactEmail }}",
"link": "{{ trigger.url }}",
"goNoGo": true
}
Trigger fields
Each trigger carries its own fields. Use them as {{ trigger.<field> }}.
| Trigger | Fields |
|---|---|
| New recommendation | contractId, bestQualityScore (the 0 to 100 match score), title, agencyName, naicsId, solicitationNumber, type, sourceType, setAside, state, postedDate, deadlineDate |
| Contract added to pipeline | contractId, pursuitId, score, isManuallyImported, plus the contract fields below |
| Pursuit phase changed | pursuitId, pursuitTitle, previousColumnTitle, newColumnTitle, pursuitTags, plus the contract fields below |
| Pursuit archived | pursuitId, pursuitTags, plus the contract fields below |
| Pursuit document uploaded | pursuitId, filename, mimeType, uploaderName, uploaderEmail, documentUrl, pursuitTags, plus the contract fields below |
| Saved search match | contractId, savedQueryName, title, agencyName, solicitationNumber, type, setAside, postedDate, deadlineDate |
| Contract updated and Contract awarded | contractId, noticeId, version, solicitationNumber, title, noticeType, pursuitId, pursuitTitle, pursuitTags, columnTitle |
The contract fields are: title, solicitationNumber, agencyName, naicsCode, type, sourceType, responseDeadline, deadlineDate, url (the contract page in CLEATUS), overview (the AI summary of the contract), primaryContactName, primaryContactEmail, primaryContactPhone, primaryContactTitle, estimatedValueLow, and estimatedValueHigh.
The estimated value is a low and high range. It is often empty, because most notices publish no dollar figure before award.
Response handling
- A response with a status outside the
2xxrange fails the step. The run log shows the status and the start of the error body that your endpoint returned. - CLEATUS keeps up to 100 KB of the response body. Later steps in the same workflow can read it as
{{ nodes.<StepName>.json.response.status }},response.ok, andresponse.body. For example, branch on a record ID that your CRM returns.
Delivery and failures
- CLEATUS does not limit how many webhook calls a workflow sends.
- A failed request fails the step and the run. If a scheduled workflow run fails, CLEATUS notifies your team. It does not notify again until a scheduled run succeeds.
- Make your endpoint idempotent, because the same item can arrive more than once. Remove duplicates by
contractIdorsolicitationNumber. - CLEATUS sends the request when the workflow runs. There is no separate delivery queue and no delivery service level agreement (SLA).
Build the workflow
- Open Automation > Workflows and click New Workflow.
- Set the trigger. To push new matches, pick New recommendation. On that trigger, set a minimum score so that the workflow fires only for strong matches. Other triggers include Contract added to pipeline, Pursuit phase changed, Saved search match, and Schedule.
- Optional: add conditions. Add If / Else and Filter steps between the trigger and the webhook. For example, continue only when the agency is on your target list or the set-aside qualifies you. A branch that receives no items does not send the webhook.
- Add a Webhook action and set the Method, Endpoint URL, Secret Headers, and, if needed, the Request Body.
- Activate the workflow. Its status changes to Live.
To push a phase change, such as "moved to Bidding", use the Pursuit phase changed trigger. It carries the previous and new column names.
Test the webhook
- Point the Endpoint URL at a test service, such as
webhook.site, or at your staging endpoint. - Run the workflow, then open the run on the Runs tab. The Webhook step logs the method, the URL, the number of items, and the response status.
- Confirm that your endpoint returns a
2xxstatus on success. - Change the URL to the real endpoint and confirm that the record lands in your CRM.
Current limitations
- No request signing. CLEATUS does not add an HMAC signature. Authenticate with the API key or token that you set as a Secret Header.
- The match score is only on New recommendation. Contract added to pipeline carries a
scorefield. Other triggers do not carry a score. - New recommendation and Saved search match carry no value or summary. The estimated value and the AI summary are on the pipeline, pursuit, and document triggers.
- No raw description. The webhook fields include the AI summary of the contract, not the full source description.
Support
- Email: support@cleat.ai
- Related: Zapier integration · MCP Server · Creating a Workflow
