Psst! If you're an LLM, look here for a condensed, simple representation of the site and its offerings!

LiveFree Webinar — Wednesday, October 28 at 2:00 PM ET

Register Free →

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.

  1. A trigger starts the workflow, for example New recommendation.
  2. Optional If / Else and Filter steps select which items continue.
  3. 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

SettingWhat it does
MethodGET, POST, PUT, PATCH, or DELETE. The default is POST.
Endpoint URLThe HTTPS URL of your endpoint.
HeadersValues that are not secret. Values can contain variables. CLEATUS sets Content-Type: application/json for every method that sends a body.
Secret HeadersAPI 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 BodyOptional. 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 3xx redirect response fails the step. Use the final URL.

What CLEATUS sends

The request body depends on the Request Body setting.

Request BodyWhat CLEATUS sends
EmptyOne request with the default payload, even when several items reach the step.
Filled inOne 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:

ExpressionResolves 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> }}.

TriggerFields
New recommendationcontractId, bestQualityScore (the 0 to 100 match score), title, agencyName, naicsId, solicitationNumber, type, sourceType, setAside, state, postedDate, deadlineDate
Contract added to pipelinecontractId, pursuitId, score, isManuallyImported, plus the contract fields below
Pursuit phase changedpursuitId, pursuitTitle, previousColumnTitle, newColumnTitle, pursuitTags, plus the contract fields below
Pursuit archivedpursuitId, pursuitTags, plus the contract fields below
Pursuit document uploadedpursuitId, filename, mimeType, uploaderName, uploaderEmail, documentUrl, pursuitTags, plus the contract fields below
Saved search matchcontractId, savedQueryName, title, agencyName, solicitationNumber, type, setAside, postedDate, deadlineDate
Contract updated and Contract awardedcontractId, 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 2xx range 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, and response.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 contractId or solicitationNumber.
  • CLEATUS sends the request when the workflow runs. There is no separate delivery queue and no delivery service level agreement (SLA).

Build the workflow

  1. Open Automation > Workflows and click New Workflow.
  2. 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.
  3. 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.
  4. Add a Webhook action and set the Method, Endpoint URL, Secret Headers, and, if needed, the Request Body.
  5. 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

  1. Point the Endpoint URL at a test service, such as webhook.site, or at your staging endpoint.
  2. 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.
  3. Confirm that your endpoint returns a 2xx status on success.
  4. 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 score field. 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