agentlyleads docs
Offerings API

GET /api/v1/products/{id}/communication

Returns a single offering's outreach activity: summaries of blast campaigns targeting it, plus a merged timeline of 1:1 communications (emails, calls, meetings, notes) tied to it, both sorted newest-first. Useful for building an "activity" view for a product/service/subscription/contract without querying campaigns and communications separately.

Requires the read:offerings scope (or * for full access). See Scopes.

Request

GET /api/v1/products/cmq1abc2def3ghi4jkl5/communication HTTP/1.1
Host: agentlyleads.com
Authorization: Bearer alk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Path parameters

ParameterDescription
idID of the offering (product/service/subscription/contract) to fetch activity for

Response — 200

{
  "offeringId": "cmq1abc2def3ghi4jkl5",
  "campaigns": [
    {
      "id": "cmq2xyz9abc1def2ghi3",
      "name": "Promo",
      "subject": "Introducing our new plan",
      "status": "SENT",
      "scheduledAt": "2026-06-01T12:00:00.000Z",
      "recipientCount": 120,
      "sentCount": 118,
      "openCount": 42
    }
  ],
  "timeline": [
    {
      "id": "cmq3lmn4opq5rst6uvw7",
      "kind": "email",
      "subject": "Following up on the demo",
      "snippet": "Hi Pat, just wanted to follow up on...",
      "direction": "OUTBOUND",
      "contact": { "id": "cmq4pat0000abc1def2g", "name": "Pat" },
      "occurredAt": "2026-06-02T09:15:00.000Z"
    }
  ]
}

campaigns[]

Blast campaigns that target this offering.

FieldTypeDescription
idstringCampaign ID
namestringCampaign name
subjectstringEmail subject line used by the campaign
statusstringCampaign lifecycle status (e.g. DRAFT, SCHEDULED, SENDING, SENT)
scheduledAtstring | nullISO 8601 date-time the campaign is/was scheduled to send, or null
recipientCountintegerTotal recipients targeted
sentCountintegerRecipients the campaign actually sent to
openCountintegerDistinct recipients who opened at least one email from the campaign — one recipient opening the same email multiple times still counts once

timeline[]

A merged, newest-first list of 1:1 communications tied to this offering. Blast campaign sends are not included here — they're summarized under campaigns instead.

FieldTypeDescription
idstringID of the underlying record (email message or communication log entry)
kindstringOne of email, call, meeting, note, other (see below)
subjectstring | nullSubject line, if applicable
snippetstringPlain-text preview, truncated to 140 characters
directionstring | nullINBOUND / OUTBOUND (or null if not applicable)
contactobject | null{ "id": string, "name": string } for the associated contact, or null
occurredAtstringISO 8601 date-time the communication occurred

kind values

ValueSource
emailA 1:1 EmailMessage sent to/from a contact (not part of a blast campaign)
callA logged call
meetingA logged meeting
noteA logged note
otherAny other logged communication type

Errors

StatusMeaning
401 UnauthorizedMissing, invalid, or expired API key
403 ForbiddenAPI key lacks the read:offerings scope
404 Not FoundNo offering with this id exists in the workspace (also returned for a foreign workspace's offering, to avoid leaking existence)
429 Too Many RequestsRate limit exceeded

See the Products API errors page for the shared error response shape.

On this page