Resource

Accounts

Accounts represent companies in your CRM (Salesforce "Accounts", HubSpot "Companies", etc.). Sync them so we can match funding events directly to entities in your pipeline.

POST /api/v1/accounts

Upserts up to 1,000 accounts in a single call. The upsert key is (your_user_id, external_id) — repeat calls with the same external_id update the row in place.

Request body

{
  "accounts": [
    {
      "external_id": "0014x000007xY3oAAE",  // required: your CRM's account ID
      "name": "Vellum AI",                   // required
      "domain": "vellum.ai",                 // optional but strongly recommended
      "metadata": {                          // optional: stored as JSONB, returned in matches
        "industry": "AI",
        "owner_email": "rep@yourco.com",
        "stage": "qualified"
      }
    }
  ]
}

Field reference

FieldTypeRequiredNotes
external_idstringyesYour CRM's ID for this account. Used as the upsert key.
namestringyesCompany name. Used for the account_name match path.
domainstringnoe.g. vellum.ai. Highest-precision match key. We normalize (strip https://, www., paths).
metadataobjectnoArbitrary JSON. Returned unchanged when this account is in a match payload.

Response (200)

{
  "upserted": 247,
  "errors": [
    { "index": 12, "error": "external_id is required and must be a non-empty string" }
  ]
}

Per-row errors don't fail the batch — valid rows are still upserted. Check the errors array for rows that didn't make it in.

Limits

  • Max 1,000 accounts per request
  • For larger CRMs, paginate client-side
  • Daily quota tracked under crm_accounts_upsert

DELETE /api/v1/accounts

Removes a single account by external_id. Cascade-deletes any match_notifications tied to this account.

curl -X DELETE "https://fundingscout.io/api/v1/accounts?external_id=001A1" \
  -H "Authorization: Bearer $FS_KEY"

# Response:
# { "deleted": 1 }

Best practices

  • Always send domain when you have it. Domain matching is the most precise of the three match paths. Without it, you fall back to fuzzy-name matching.
  • Don't send empty/test data. Each row counts against your account quota. Filter dummy records server-side.
  • Use stable external_ids. The external_id should be your CRM's primary key for the record (Salesforce ID, HubSpot vid, etc.) — not something that changes when the account is renamed or merged.
  • Run sync daily, not hourly. Funding rounds are emitted within ~60 seconds of press releases, so once a day is plenty. Hourly is fine if you want fresher data, but more than that is wasted compute.