Update Payloads

How TAMradar delivers updates

TAMradar supports two ways to receive radar findings:

  • Webhooks (push) — TAMradar POSTs events to your webhook_url in real-time. Set webhook_url when creating a radar to enable this.
  • Polling (pull) — Fetch findings on demand via GET /v1/updates. Works for all radars, including those created without a webhook_url.

Both delivery methods use the same payload format documented below.

Setting Up Webhook Delivery (optional)

If you want real-time push delivery, set up an HTTPS endpoint:

  1. Create an HTTPS endpoint on your server that can receive POST requests
  2. Pass webhook_url when creating your radar
  3. Ensure your endpoint returns a 2xx status code to acknowledge receipt

No webhook? Skip webhook_url entirely to create a poll-only radar. Findings are always available via GET /v1/updates regardless.

Webhook Payload Format

All webhook payloads follow this structure:

{
  "update_id": "550e8400-e29b-41d4-a716-446655440000",
  "update_type": "radar_finding",
  "record_id": "c4d5e6f7-g8h9-4i0j-k1l2-m3n4o5p6q7r8",

  "discovered_at": "2024-03-20T12:30:00Z",
  "data": {
    "radar_id": "54e32291-25a4-459f-8bd6-4f79489ea931",
    "radar_type": "job_openings",
    "domain": "example.com",
    "custom_fields": {
      "priority": "high",
      "target_account_id": "0011U00000TFV7MQAX"
    }
  },
  "content": {
    // Event-specific data
  }
}

Base Fields

FieldTypeRequiredDescription
update_idstringYesUnique identifier for this webhook update
update_typestringYesType of update (see Update Types below)
record_idstringNoUnique identifier for the detected record
radar_typestringYesType of radar that generated the event
discovered_atstringYesISO timestamp (UTC) when the update was detected

Update Types

Update TypeDescription
radar_findingNew data detected by a radar (default)
radar_failureRadar setup failed and credits were refunded

Radar Types

Radar TypeDescription
company_mentionsSocial media and article mentions of your company
company_social_postsCompany's own social media activity
company_social_posts_cxoSocial media posts from company executives
company_social_engagementsSocial media engagements (likes, comments) on company posts
company_job_openingsNew job postings from tracked companies
company_new_hiresNew employee detections
company_promotionsEmployee promotions and role changes
company_reviewsCustomer reviews across platforms
contact_job_changesIndividual contact career changes (departures, promotions, role changes)
contact_social_postsSocial media posts from tracked contacts
contact_social_engagementsSocial media engagements (likes, comments) by tracked contacts
industry_mentionsIndustry-wide mentions and news articles
industry_funding_roundsFunding rounds across companies in your industry
industry_job_openingsJob openings across companies in your industry
industry_new_companiesNew companies emerging in your industry

Radar Status Updates

When a radar's status changes, you'll receive a notification:

{
  "update_id": "550e8400-e29b-41d4-a716-446655440000",
  "update_type": "radar_failure",
  "discovered_at": "2024-03-20T12:30:00Z",
  "data": {
    "radar_id": "54e32291-25a4-459f-8bd6-4f79489ea931",
     "radar_type": "job_openings",
    "domain": "example.com",
    "custom_fields": {
      "priority": "high"
    }
  },
  "content": {
    "failure_reason": "insufficient_funds",
    "refund_amount": 0,
    "message": "Radar was deactivated due to insufficient credits."
  }
}

Status Change Reasons

ReasonDescription
user_deactivatedUser requested deactivation (grace period applies)
insufficient_fundsAccount ran out of credits
grace_period_endedRadar completed its grace period
system_deactivatedSystem-initiated deactivation

Radar Failure Notifications

When a radar setup fails, you'll receive a notification with refund details:

{
  "update_id": "550e8400-e29b-41d4-a716-446655440000",
  "update_type": "radar_failure",
  "discovered_at": "2024-03-20T12:30:00Z",
  "data": {
    "radar_id": "54e32291-25a4-459f-8bd6-4f79489ea931",
    "radar_type": "company_social_posts",
    "domain": "example.com",
    "custom_fields": {
      "priority": "high"
    }
  },
  "content": {
    "failure_reason": "missing_prerequisites",
    "refund_amount": 100,
    "message": "Radar creation failed because the domain does not have required social media accounts."
  }
}

Failure Reasons

ReasonDescription
missing_prerequisitesRequired accounts or data sources not found
setup_failureGeneral setup failure
insufficient_fundsRadar deactivated due to insufficient credits
source_inaccessibleTarget source (e.g. LinkedIn profile, domain) is inaccessible or private

Best Practices for Webhook Handling

  1. Respond Quickly: Return a 2xx status code immediately, then process asynchronously
  2. Implement Retry Logic: Be prepared to handle the same event multiple times
  3. Verify Signatures: Check webhook signatures to validate authenticity (documentation coming soon)
  4. Track Status Changes: Monitor status updates to understand radar lifecycle
  5. Handle Null Fields: Some fields like record_id may be null for certain event types

Testing Your Webhook

Quick test

Trigger a sample payload to your endpoint:

curl -X POST https://api.tamradar.com/v1/webhooks/test \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "webhook_url": "https://your-domain.com/webhook",
    "radar_type": "job_openings"            // any supported radar_type
    // "update_type": "radar_failure"        // optional, defaults to radar_finding
  }'

The test event is fire-and-forget—no retries or signatures—and uses the same payload format you'll receive in production.

Need help? Contact our team