API reference

Companies

A company groups the prospects that share an email domain or a company_name. Each company has an account temperature that anymail computes from the events of its people. Companies are read-only in the API.

Method Path Action
GET /api/v1/companies List companies with temperature
GET /api/v1/companies/{id} Get a company card

List companies#

Parameter Type Notes
search string Matches the name, the name given by the operator and the domain. A leading www. is ignored.
temperature string One of hot, warm, cold, quiet.
limit integer 1 to 100. Default 50.
cursor string An offset cursor. See Pagination.
curl "https://app.anymail.watch/api/v1/companies?temperature=hot&limit=2" \
  -H "Authorization: Bearer $ANYMAIL_TOKEN"

Response 200

{
  "data": [
    {
      "id": "1b4e28ba-2fa1-11d2-883f-0016d3cca427",
      "display_name": "Example Ltd",
      "name": "Example Ltd",
      "group_name": null,
      "domain": "example.com",
      "tags": ["enterprise"],
      "people": 3,
      "temperature": {
        "band": "hot",
        "score": 8,
        "replies": 1,
        "event_count": 5,
        "window_days": 7,
        "trend": { "direction": "up", "change_percent": 60, "previous_score": 5 }
      },
      "last_activity_at": "2026-09-03T10:00:00.000+00:00",
      "created_at": "2026-08-19T12:00:00.000+00:00"
    }
  ],
  "next_cursor": "eyJvIjo1MH0"
}

Account temperature#

The temperature is the value that the Companies screen draws as a bar. It sums the events of the last 7 days, weighted by type.

Event Weight
Reply with positive intent 5
Reply 3
Return to an offer 2.5
Click 2
Offer open 2
Delivery 0.5
Sent 0
Bounce or unsubscribe −2
Band Score
hot 6 or more
warm 2 or more
cold below 2
quiet no events in the window. The app shows this as "No signal".

trend compares the current 7 days with the previous 7 days. direction: "unknown" and change_percent: null mean there is no earlier period to compare with.

last_activity_at is the latest event in the whole history of the company, which can be older than the 7 day window. display_name is the name, then the name given by the operator, then the domain, then Unnamed company.

Errors: 400 for an invalid temperature, a search value that is too long, or an invalid limit or cursor.

Get a company#

GET /api/v1/companies/{id} returns the row above, with the same temperature value as the list, plus the company card.

curl "https://app.anymail.watch/api/v1/companies/1b4e28ba-2fa1-11d2-883f-0016d3cca427" \
  -H "Authorization: Bearer $ANYMAIL_TOKEN"

Response 200 (the fields of the list row are shortened)

{
  "id": "1b4e28ba-2fa1-11d2-883f-0016d3cca427",
  "display_name": "Example Ltd",
  "domain": "example.com",
  "people": 3,
  "people_list": [
    {
      "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
      "email": "ada@example.com",
      "name": "Ada Lovelace",
      "position": "CTO",
      "timezone": null,
      "enrollments": [
        { "campaignId": "3f2b1c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d", "campaignName": "Q3 outbound", "status": "stopped", "lastError": "replied" }
      ],
      "last_activity_at": "2026-09-03T10:00:00.000+00:00",
      "latest_reply": {
        "classification": "interested",
        "receivedAt": "2026-09-03T10:00:00.000+00:00",
        "campaignId": "3f2b1c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
        "campaignName": "Q3 outbound"
      },
      "has_responded": true
    }
  ],
  "campaigns": [
    { "id": "3f2b1c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d", "name": "Q3 outbound", "status": "active", "people": 3, "replies": 1 }
  ],
  "recent_events": [
    {
      "id": "c4d5e6f7-0000-4000-8000-000000000001",
      "type": "replied",
      "occurred_at": "2026-09-03T10:00:00.000+00:00",
      "prospect_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
      "campaign_id": "3f2b1c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
    }
  ]
}
  • people_list follows the order of the company view in the app: people who replied first, then by recent activity, then alphabetically.
  • position is a heuristic from custom fields and snippet slots. It is null when there is nothing to show.
  • The API returns the fact and the classification of a reply. The text of a reply is not returned.
  • campaigns[].people is the number of enrolled people from this company. campaigns[].replies is the number of replies from this company in that campaign. status is the status of the campaign.
  • recent_events holds up to 50 of the latest events of the people of this company, of every type.

Errors: 404 with {"error":"Company not found."}.