Skip to main content
GET
/
api
/
accounts
List connected accounts
curl --request GET \
  --url https://app.puffle.ai/api/accounts \
  --header 'Authorization: Bearer <token>'
{
  "accounts": [
    {
      "id": "aaaa1111-1111-1111-1111-111111111111",
      "user_id": "u1111111-1111-1111-1111-111111111111",
      "type": "email",
      "display_name": "Sarah at Acme",
      "status": "active",
      "created_at": "2026-04-20T10:00:00Z",
      "updated_at": "2026-04-21T09:00:00Z",
      "provider_account_id": null,
      "profile_url": null,
      "is_premium": null,
      "has_sales_navigator": null,
      "weekly_connection_limit": null,
      "weekly_message_limit": null,
      "email_address": "[email protected]",
      "domain_id": "dddd1111-1111-1111-1111-111111111111",
      "agentmail_inbox_id": "inbox_abc123",
      "instantly_account_id": null,
      "warmup_status": "active",
      "first_name": "Sarah",
      "last_name": "Chen",
      "signature": "Best,\nSarah",
      "daily_limit": 50,
      "instantly_tag_id": null,
      "instantly_warmup_tag_id": null,
      "email_domains": {
        "id": "dddd1111-1111-1111-1111-111111111111",
        "domain": "acme.com",
        "status": "verified"
      }
    },
    {
      "id": "bbbb1111-1111-1111-1111-111111111111",
      "user_id": "u1111111-1111-1111-1111-111111111111",
      "type": "linkedin",
      "display_name": "Sarah Chen",
      "status": "connected",
      "created_at": "2026-04-18T15:12:00Z",
      "updated_at": "2026-04-21T09:00:00Z",
      "provider_account_id": "unipile_acc_abc123",
      "profile_url": "https://linkedin.com/in/sarahchen",
      "is_premium": true,
      "has_sales_navigator": true,
      "weekly_connection_limit": 100,
      "weekly_message_limit": 150,
      "email_address": null,
      "domain_id": null,
      "agentmail_inbox_id": null,
      "instantly_account_id": null,
      "warmup_status": null,
      "first_name": "Sarah",
      "last_name": "Chen",
      "signature": null,
      "daily_limit": null,
      "instantly_tag_id": null,
      "instantly_warmup_tag_id": null
    }
  ]
}

Overview

Returns every sender account owned by the caller as a flat list. Sender accounts are the LinkedIn / email identities campaigns send from — without at least one account of the matching type, campaign creation fails. The ?type=linkedin|email query filter restricts the list to a single channel. Omit it to get both.

AI agent notes

This is a boot-sequence staple for campaigns. Call it with the appropriate ?type=... filter before createCampaign — the create call returns 400 if no sendable account of the requested channel exists. Filter by type rather than fetching everything and filtering client-side.Empty array is not an error. A filtered list with no matches means the user hasn’t connected an account of that channel yet. Direct the human to connect one:
  • LinkedIn: POST /api/unipile/connect — requires an interactive OAuth handshake you cannot complete autonomously
  • Email: POST /api/email/accounts — also OAuth-driven
Only certain statuses can send. Filter by account.status when picking a sender:
  • LinkedIn: connected only (or warming with admin override)
  • Email: active only (or warming with admin override)
Everything else (pending, credentials_required, error, disconnected, banned, suspended) is unsendable — surface the status to the human and stop.Ordering. Accounts come back newest-first by created_at.

Authorizations

Authorization
string
header
required

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

Query Parameters

type
enum<string>

Filter to a single channel. Use type=linkedin before creating a LinkedIn campaign and type=email before an email campaign. Campaign creation fails (400) if no account of the matching type exists.

Available options:
linkedin,
email

Response

Flat list of accounts. Empty array when the user has no accounts (or none match the filter) — this is not an error.

accounts
object[]
required

Ordered newest-first by created_at.