Integration documentation

Send opportunity rows into the tools your team already uses.

Each send delivers one workflow-ready opportunity as JSON to a Zapier, Make, n8n, or custom HTTPS webhook. This reference covers the current payload, delivery rules, and practical setup recipes.

Quick start

Connect a webhook in four steps

No API key or custom request code is needed for the standard in-product flow.

  1. Step 1

    Create the trigger

    Create a catch-hook or webhook trigger in your destination tool and copy its HTTPS URL.

  2. Step 2

    Open a full report

    Choose a row marked Workflow ready, then select Send to Workflow.

  3. Step 3

    Send a sample

    Paste the webhook URL and send. The destination uses this event to discover the fields.

  4. Step 4

    Map and verify

    Map the opportunity fields, activate the automation, and send another row to test the live path.

Payload

Delivery envelope

The webhook receives an HTTP POST with Content-Type: application/json.

product
String. Always Opportunity Scanner.
sent_at
String. ISO 8601 timestamp created when delivery begins.
opportunity
Object. The server-generated opportunity record described below.
Optional properties with no value are omitted from the JSON. Build mappings that tolerate missing optional fields.
{
  "product": "Opportunity Scanner",
  "sent_at": "2026-07-12T15:42:18.214Z",
  "opportunity": {
    "scanId": "scan_01JZ8Y3QF2",
    "opportunityId": "opp_01JZ8Y8K9M",
    "opportunity": "County behavioral health services procurement",
    "targetOrganization": "Example County Health Department",
    "targetAccount": "Example County Health Department",
    "source": "SAM.gov",
    "signalType": "Active procurement",
    "recordClass": "current",
    "currentValidatedAt": "2026-07-12T15:40:02.000Z",
    "opportunityType": "Agency procurement",
    "buyerPartnerType": "Public agency",
    "revenueMotion": "Sell to Agency",
    "actionability": "High Actionability",
    "actionabilityScore": 86,
    "contactPath": "Procurement office",
    "contactStrategy": "procurement_office",
    "recommendedContactRoles": ["Contracting officer", "Program manager"],
    "nextStep": "Review the notice and confirm response requirements.",
    "nextBestAction": "Review the notice and confirm response requirements.",
    "manualResearchInstruction": "Confirm the incumbent and submission method.",
    "crmNote": "Example County has an active behavioral health procurement...",
    "outreachAngle": "Connect the service to the county's stated access goal.",
    "followUpTask": "Assign an owner to review the source record today.",
    "timeSensitivity": "Immediate",
    "pursuitDifficulty": "Medium",
    "workflowPayloadReady": true,
    "workflowPayloadReason": "Source and next action are specific enough to route.",
    "sourceStatus": "Active",
    "sourceDeadline": "2026-08-14",
    "sourceEvidence": "The notice requests qualified behavioral health providers...",
    "sourceUrl": "https://sam.gov/opp/example"
  }
}

Field reference

Opportunity object

"Required" means the server will not attempt delivery without a usable value. "Conditional" means one of the two target fields must be present.

FieldJSON typeDeliveryMeaning
scanIdstringRequiredID of the scan that produced the opportunity.
opportunityIdstringRequiredID of the opportunity within the scan.
opportunitystringRequiredHuman-readable opportunity headline.
targetOrganizationstringConditionalAgency, buyer, recipient, partner, or other organization to pursue. At least this field or targetAccount is required.
targetAccountstringConditionalCRM-oriented alias for the target organization. At least this field or targetOrganization is required.
sourcestringRequiredName of the public source behind the signal.
signalTypestringOptionalDisplay label for the source category, such as Active procurement or Funded buyer.
recordClass"current" | "evidence"RequiredSeparates verified live postings from historical funded-buyer evidence.
currentValidatedAtstringCurrent onlyISO timestamp of the latest source validation. Omitted for evidence records.
awardYearnumberEvidence onlyPublic award year when the historical record provides one.
periodEndstringEvidence onlyHistorical period-of-performance end. This is not a deadline.
opportunityTypestringOptionalEstimated commercial opportunity classification.
buyerPartnerTypestringOptionalClassification of the likely buyer, recipient, partner, or channel target.
revenueMotionstringRequiredRecommended route to revenue, such as Sell to Agency, Direct Apply, or Partner with Recipient.
actionabilitystringOptionalActionability label: High Actionability, Medium Actionability, or Low Actionability.
actionabilityScorenumberOptionalNumeric actionability score generated by Opportunity Scanner.
contactPathstringOptionalHuman-readable label for the recommended route to the right office or person.
contactStrategystringRequiredMachine-friendly contact strategy used to route the opportunity.
recommendedContactRolesstring[]OptionalRecommended job functions or roles to locate.
nextStepstringOptionalHuman-readable next step. Currently mirrors nextBestAction.
nextBestActionstringRequiredThe recommended immediate action for the opportunity owner.
manualResearchInstructionstringOptionalSpecific research instruction when more qualification is useful.
crmNotestringRequiredContext formatted for a CRM note or account activity.
outreachAnglestringOptionalSuggested source-backed angle for outreach or internal positioning.
followUpTaskstringOptionalSuggested follow-up task for the opportunity owner.
timeSensitivitystringOptionalTiming classification generated from the source and pursuit context.
pursuitDifficultystringOptionalEstimated difficulty of pursuing the opportunity.
workflowPayloadReadybooleanRequiredAlways true for a delivered webhook. Opportunities that are not ready are rejected before delivery.
workflowPayloadReasonstringRequiredExplanation of why the opportunity is ready for workflow or what must be checked first.
sourceStatusstringOptionalCurrent status classification for the source record.
sourceDeadlinestringCurrent onlyVerified future close date for a current record. Never delivered for funded-buyer evidence.
sourceEvidencestringRequiredEvidence summary grounded in the public source record.
sourceUrlstringOptionalPublic source URL. Included when a full-report opportunity is sent.

Recipes

Zapier, Make, and n8n setup

Zapier

Create or update a CRM record and assign a follow-up task.

Destination fieldPayload value
Account / companyopportunity.targetAccount
Deal / opportunity nameopportunity.opportunity
Pipeline or motionopportunity.revenueMotion
Notesopportunity.crmNote
Taskopportunity.nextBestAction
Source URLopportunity.sourceUrl
  1. 1Create a Zap with Webhooks by Zapier as the trigger and choose Catch Hook.
  2. 2Copy the HTTPS hook URL. In a full Opportunity Scanner report, choose Send to Workflow on a workflow-ready row, paste the URL, and send the opportunity.
  3. 3In Zapier, test the trigger and confirm that product, sent_at, and the nested opportunity object appear.
  4. 4Add your CRM action. Map opportunity.targetAccount to the company or account, opportunity.opportunity to the deal name, opportunity.crmNote to notes, and opportunity.sourceUrl to the source-link field.
  5. 5Add a task action using opportunity.nextBestAction as the task title. Use opportunity.sourceDeadline only after checking that the destination accepts its text format.
  6. 6Turn on the Zap, then send a second opportunity to verify the live path.
Make

Add a qualified row to Airtable, a CRM, or a shared opportunity table.

Destination fieldPayload value
Targetopportunity.targetOrganization
Signalopportunity.opportunity
Evidenceopportunity.sourceEvidence
Contact routeopportunity.contactPath
Owner actionopportunity.nextBestAction
Source statusopportunity.sourceStatus
  1. 1Create a scenario and add Webhooks > Custom webhook as the first module.
  2. 2Create the webhook, copy its HTTPS address, and leave Make waiting for a sample.
  3. 3Send a workflow-ready opportunity from the full report to that address. Make will infer the nested opportunity fields from the sample.
  4. 4Add the destination module. Map the target, headline, evidence, motion, contact strategy, next action, and source URL into separate fields.
  5. 5Add a filter after the webhook if needed: opportunity.workflowPayloadReady equals true. Delivered Opportunity Scanner webhooks already satisfy this rule, but the filter documents the scenario's expectation.
  6. 6Run once with another row, inspect the created record, then schedule or activate the scenario.
n8n

Route opportunities by revenue motion and create an owned action.

Destination fieldPayload value
Switch value{{$json.opportunity.revenueMotion}}
Account{{$json.opportunity.targetAccount}}
Record title{{$json.opportunity.opportunity}}
CRM note{{$json.opportunity.crmNote}}
Task{{$json.opportunity.nextBestAction}}
Evidence link{{$json.opportunity.sourceUrl}}
  1. 1Add a Webhook node, set the HTTP Method to POST, and use the node's HTTPS test URL while building the workflow.
  2. 2Listen for a test event, then send a workflow-ready opportunity from Opportunity Scanner to the test URL.
  3. 3Add a Switch node using {{$json.opportunity.revenueMotion}}. Create routes such as Sell to Agency, Sell to Funded Buyer, and Partner with Recipient.
  4. 4On each route, add the appropriate CRM, project, email, or messaging node. Reference nested values with expressions such as {{$json.opportunity.nextBestAction}}.
  5. 5Configure the Webhook node to respond immediately or otherwise return a successful 2xx response within eight seconds.
  6. 6Activate the workflow and replace the test URL in Opportunity Scanner with n8n's HTTPS production URL for future sends.

Delivery rules

What your endpoint must do

These limits apply to the current webhook sender.

HTTPS only

The destination URL must use HTTPS and cannot contain embedded username/password credentials.

Return 2xx

Any non-2xx destination response is treated as a failed delivery.

Eight seconds

The destination must accept the request within eight seconds.

One attempt

Opportunity Scanner does not currently retry a failed webhook automatically. Send the row again after correcting the issue.

Errors shown in Opportunity Scanner

StatusMeaningWhat to check
400Invalid requestThe webhook URL is missing, is not HTTPS, includes embedded credentials, or the scan/opportunity IDs are missing.
403Full report requiredSending to workflow is available only for a full report.
404Record not foundThe scan or opportunity no longer matches a stored record.
413Payload too largeThe opportunity object exceeds 25,000 bytes.
422Not workflow readyA required field is empty or the opportunity needs more research.
502Delivery failedThe destination rejected the request with a non-2xx response or could not be reached.
504Delivery timed outThe destination did not accept the request within eight seconds.

Operational note

Webhook requests are server-generated from the stored scan and opportunity. The current sender does not add a signature or authorization header, so treat the destination URL as a secret, use the access controls offered by your automation platform, and avoid logging the full URL.

Always recheck the live source before outreach, submission, or a deadline-sensitive action. The webhook moves research into workflow; it does not replace source verification.