Overview

FirstQuadrant supports webhook-based imports as a powerful way to send contact and company data directly into your workspace in real time. This is particularly useful for integrating external systems such as CRMs, marketing platforms, signup forms, or internal tools with FirstQuadrant.

Webhooks allow you to push data into FirstQuadrant automatically whenever a new contact is created or updated externally.

Where to find your webhook

Navigate to the Imports section in your workspace. From there:

  • Click new import
  • You will be provided with a webhook URL specific to that import.
  • This URL includes a secure hash and should be kept private.

FirstQuadrant provides webhooks as a powerful way to automatically import contacts and companies from external systems. Webhooks allow you to send real-time data to FirstQuadrant whenever new contacts are created in your CRM, marketing automation platform, or any other system.

Webhook URL format

Your webhook URL will follow this format:

https://api.us.firstquadrant.ai/v5/imports/{importId}/trigger/{hash}

Where:

  • {importId} is your unique import identifier
  • {hash} is a secure hash that validates webhook requests

Making webhook requests

Send a POST request to your webhook URL with a JSON body containing contact and company data. The minimum required structure is:

{
  "contact": {
    "email": "jane.doe@example.com"
  }
}

Complete data structure

You can provide comprehensive contact and company information using the following schema:

{
  "contact": {
    "email": "jane.doe@example.com",
    "name": "Jane Doe",
    "nickname": "Jane",
    "bio": "Senior Sales Manager at Acme Corp",
    "avatar": "https://example.com/avatar.jpg",
    "website": "https://janedoe.com",
    "domain": "janedoe.com",
    "location": "San Francisco, CA",
    "timeZone": "America/Los_Angeles",
    "facebookHandle": "janedoe",
    "gitHubHandle": "janedoe",
    "instagramHandle": "janedoe",
    "linkedInHandle": "jane-doe",
    "xHandle": "janedoe",
    "externalIdApollo": "apollo_123",
    "note": "Met at conference, interested in enterprise plan"
  },
  "employment": {
    "title": "Senior Sales Manager",
    "seniority": "SENIOR",
    "history": [
      {
        "current": true,
        "start": "2022-01",
        "organization": "Acme Corporation",
        "title": "Senior Sales Manager"
      },
      {
        "current": false,
        "start": "2020-03",
        "end": "2021-12",
        "organization": "Previous Company",
        "title": "Sales Manager"
      }
    ]
  },
  "company": {
    "name": "Acme Corporation",
    "nickname": "Acme",
    "bio": "Leading provider of innovative solutions",
    "subtitle": "Innovation at its finest",
    "avatar": "https://example.com/logo.png",
    "website": "https://acme.com",
    "domain": "acme.com",
    "location": "San Francisco, CA",
    "timeZone": "America/Los_Angeles",
    "facebookHandle": "acmecorp",
    "gitHubHandle": "acmecorp",
    "instagramHandle": "acmecorp",
    "linkedInHandle": "acme-corporation",
    "xHandle": "acmecorp",
    "annualRevenue": "10000000",
    "employeesCount": 250,
    "foundedYear": 2015,
    "fundingStage": "Series B",
    "fundingTotal": "25000000",
    "retailLocationsCount": 5,
    "ticker": "ACME",
    "industries": ["Technology", "SaaS"],
    "languages": ["English", "Spanish"],
    "stack": ["React", "Node.js", "PostgreSQL"],
    "tags": ["enterprise", "b2b"],
    "externalIdApollo": "apollo_company_456"
  }
}

Field descriptions

Contact fields

  • email (string, nullable): Primary email address
  • name (string, nullable): Full name of the contact
  • nickname (string, nullable): Common or preferred name
  • bio (string, nullable): Description or bio from social media
  • avatar (string, nullable): URL to profile picture
  • website (string, nullable): Personal website URL
  • domain (string, nullable): Domain of personal website
  • location (string, nullable): Geographic location
  • timeZone (string, nullable): Time zone (e.g., “America/Los_Angeles”)
  • social handles: Facebook, GitHub, Instagram, LinkedIn, X (Twitter) handles
  • externalIdApollo (string, nullable): External ID from Apollo.io
  • note (string, nullable): Additional context or notes

Employment fields

  • title (string, nullable): Job title
  • seniority (string, nullable): Seniority level (JUNIOR, MID, SENIOR, EXECUTIVE)
  • history (array): Work history with start/end dates, organization, and title

Company fields

  • name (string, nullable): Legal company name
  • nickname (string, nullable): Common or brand name
  • bio (string, nullable): Company description
  • subtitle (string, nullable): Short company description
  • avatar (string, nullable): Company logo URL
  • website (string, nullable): Company website URL
  • domain (string, nullable): Company domain
  • location (string, nullable): Company headquarters location
  • timeZone (string, nullable): Company time zone
  • social handles: Company social media handles
  • financial data: Revenue, employee count, funding information
  • industries (array): Industry categories
  • languages (array): Languages supported
  • stack (array): Technology stack
  • tags (array): Custom tags
  • externalIdApollo (string, nullable): External ID from Apollo.io

Response format

Successful webhook requests return a JSON response with the created row data:

{
  "id": "row_123456789",
  "object": "row",
  "status": "PENDING",
  "createdAt": "2024-01-15T10:30:00Z",
  "updatedAt": "2024-01-15T10:30:00Z"
}

Error handling

Webhook requests may return the following HTTP status codes:

  • 200: Success - Contact imported successfully
  • 400: Bad Request - Invalid data format
  • 404: Not Found - Invalid webhook URL or hash
  • 429: Rate Limited - Too many requests
  • 500: Internal Server Error - Server error

Best practices

Data quality

  • Always provide an email address when possible
  • Use consistent formatting for names and company information
  • Include relevant social media handles for better enrichment
  • Add notes to provide context about the contact

Rate limiting

  • Implement exponential backoff for failed requests
  • Don’t send duplicate data for the same contact
  • Batch multiple contacts when possible

Security

  • Keep your webhook URL and hash secure
  • Use HTTPS for all webhook requests
  • Validate data before sending to FirstQuadrant

Monitoring

  • Monitor webhook response codes
  • Set up alerts for failed webhook requests
  • Track the number of contacts imported via webhooks

Integration examples

Zapier integration

  1. Create a new Zap with your trigger app
  2. Add FirstQuadrant as an action
  3. Use the webhook URL as the endpoint
  4. Map your trigger data to the webhook payload

Custom application

const webhookUrl = "https://api.us.firstquadrant.ai/v5/imports/imp_123/trigger/fqw_abc123";

const contactData = {
  contact: {
    email: "new.contact@example.com",
    name: "John Smith",
    note: "Imported from CRM system",
  },
  company: {
    name: "Example Corp",
    website: "https://example.com",
  },
};

fetch(webhookUrl, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify(contactData),
})
  .then((response) => response.json())
  .then((data) => console.log("Contact imported:", data))
  .catch((error) => console.error("Error:", error));

Additional notes

  • Notes added via webhook are treated the same way as manual notes.
  • These notes are processed by FirstQuadrant’s AI to guide next-step decisions in conversation workflows.
  • To fine-tune how notes are handled, visit Fine-Tune Settings in your workspace.