Skip to main content
GET
/
api
/
campaigns
/
{id}
/
senders
List sender accounts assigned to a campaign
curl --request GET \
  --url https://app.puffle.ai/api/campaigns/{id}/senders \
  --header 'Authorization: Bearer <token>'
{
  "senders": [
    {
      "account_id": "aaaa1111-1111-1111-1111-111111111111",
      "display_name": "Sarah",
      "email_address": "[email protected]",
      "profile_url": null,
      "status": "active",
      "type": "email",
      "is_premium": false,
      "warmup_status": "completed",
      "weekly_connection_limit": 80,
      "weekly_message_limit": 100,
      "daily_limit": 50,
      "weekly_connections_sent": 0,
      "weekly_messages_sent": 142,
      "campaign_messages_sent": null
    }
  ],
  "campaign_total_sent": 34,
  "campaign_type": "email"
}

Overview

Returns every sender account attached to the campaign plus the rate-limit context an agent needs to reason about throughput:
  • Per-account weekly limits (with defaults filled in based on is_premium)
  • Rolling 7-day usage for connections + messages, aggregated globally across all the caller’s campaigns (not just this one)
  • Per-campaign sent count — only populated as campaign_messages_sent for LinkedIn campaigns with exactly one sender, where attribution is unambiguous. Email and multi-sender LinkedIn expose campaign_total_sent at the top level instead.
The response also includes campaign_total_sent (total sent messages for this campaign) and campaign_type (channel) so a single call is enough to render a sender dashboard.

AI agent notes

Default limits. When an account has no per-account override, the weekly limits come from is_premium:
ChannelFreePremium
Weekly connection requests80100
Weekly messages100150
Daily default for every account is 30 unless overridden.Usage is global, not per-campaign. weekly_connections_sent / weekly_messages_sent sum activity across every campaign this account is attached to — not just this one. That matches how the rate limiter actually decides whether to throttle a send, so it’s the correct signal to surface “is this sender about to hit its cap?”Attribution caveat. campaign_messages_sent is deliberately null for email and multi-sender LinkedIn because there’s no cheap way to map a sent message back to a specific sender when round-robin is in play. Use campaign_total_sent for the aggregate.No mutations here. Adding or removing senders happens via PATCH /api/campaigns/{id} with a sender_account_ids field on draft campaigns. This endpoint is read-only.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

id
string<uuid>
required

Campaign UUID

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$

Response

Sender list with limits + usage. Empty senders is valid for a freshly-created campaign.

Sender accounts attached to the campaign, with rolling weekly usage and per-campaign attribution.

senders
object[]
required
campaign_total_sent
integer
required

Total sent messages across all senders on this campaign (sum over campaign_prospect_messages rows with status === 'sent').

Required range: 0 <= x <= 9007199254740991
campaign_type
enum<string>
required

Channel of the campaign itself.

Available options:
linkedin,
email