Contacts

List activity for a contact

Lists what happened with a contact, newest first: its own events, the notes linked to it, and when it was added to or removed from a company. Company-level activity, such as a company being created or updated, is listed on the company's activity instead.

id identifies the occurrence, not the row: the same email thread, meeting, note or document send has the same id here and on the activity of each company the contact belongs to. contact_id is always this contact. company_id names the company an activity is tied to, such as the company a contact was added to or a document was sent for, and is null for the rest.

You only see the activity types your role can read. Email subjects and meeting titles are null when the mailbox they came from does not share them with you.

Pagination

Pages by page[number] like every other list, up to page 40. To read further back, set filter[occurred_to] to the day of the last activity you read, the date in its occurred_at, and start again from page 1; the activity of that day you already read comes back again. When all 40 pages fall on one day, that day holds more than paging can reach; split it with filter[type]. Activity that arrives while you page shifts later pages, so the same activity can also appear at the end of one page and the start of the next. Dedupe by id.

Filtering

  • filter[type] — activity types or groups, comma separated (invoice.paid, email). A group stands for every type in it that your role can read. A type your role cannot read, or a group with no type it can, is refused with 403. Company-level types (company.*) and form.sent, which is recorded on the company, are not on this feed and are refused with 400.
  • filter[occurred_from] / filter[occurred_to] — ISO 8601 dates (2026-10-31), UTC days, both inclusive.
get/public-api/v1/contacts/{id}/activities

Request

  • Base URL
    https://app.hellobonsai.com
  • URL
    https://app.hellobonsai.com/public-api/v1/contacts/{id}/activities
  • Auth
    • OAuth 2
      Authorization code: https://app.hellobonsai.com/oauth/authorize
      Token URL: https://app.hellobonsai.com/oauth/token
    • or HTTP bearer

Path parameters

idinteger required

Id of the contact.

Query parameters

page[number]integer

Page to return, starting at 1. At most 40.

page[size]integer

Activities per page. Defaults to 25; anything above 100 is reduced to 100.

filter[type]string

Activity types or groups, comma separated. Types: contact.created, contact.updated, contact.added_to_company, contact.removed_from_company, document.created, document.sent, document.viewed, document.accepted, document.reminder_sent, invoice.sent, invoice.viewed, invoice.paid, invoice.reminder_sent, note.added, deal.assigned, email.sent, email.received, calendar.event, form.submitted, portal.invitation_accepted, portal.message_sent. Groups: contact, document, invoice, note, deal, email, calendar, form, portal.

filter[occurred_from]string date

Keeps activity on or after this day, in UTC.

filter[occurred_to]string date

Keeps activity on or before this day, in UTC.

Response

A page of activity.

Example response

{
  "data": [
    {
      "id": "evt_48213377",
      "type": "invoice.paid",
      "occurred_at": "2026-04-14T09:12:04.000Z",
      "summary": "Invoice #1042 for $3,200 paid",
      "contact_id": 3184,
      "company_id": 42,
      "actor": {
        "kind": "member",
        "id": 15,
        "name": "Jane Doe"
      },
      "subject": {
        "kind": "invoice",
        "title": "Website redesign",
        "url": "https://app.hellobonsai.com/invoices/1042"
      },
      "details": {
        "field": "email",
        "old_value": "jane@acme.com",
        "new_value": "jane.doe@acme.com"
      }
    }
  ],
  "meta": {
    "request_id": "b1f0d2c4-7a9e-4c3b-8d5f-1e2a3b4c5d6e",
    "pagination": {
      "page": 1,
      "page_size": 25,
      "has_more": true
    }
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.