Weezly Outreach
|Developer Docs

Accounts API

Manage connected LinkedIn accounts. View status, update sending limits, check SSI scores, manage the proxy, clean up pending invitations, and monitor performance.

List Accounts

GET/api/accounts

List all connected LinkedIn accounts for the authenticated user. Each account includes live daily usage counters (null if temporarily unavailable) and, when an invitation cleanup is running, its live progress.

Request — cURLcURL
curl --location --request GET 'https://outreach.weezly.com/api/accounts' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response (200 OK)JSON
{
  "accounts": [
    {
      "id": "cm3acc123mno",
      "linkedinName": "John Smith",
      "linkedinHeadline": "Sales Director at Acme Corp",
      "linkedinProfileUrl": "https://linkedin.com/in/johnsmith",
      "linkedinPhotoUrl": "https://media.licdn.com/...",
      "accountType": "PREMIUM",
      "connectionCount": 2450,
      "status": "ACTIVE",
      "ssiScore": 72.5,
      "maxConnectionRequestsPerDay": 25,
      "maxConnectionRequestsPerWeek": 100,
      "maxMessagesPerDay": 40,
      "maxInMailsPerDay": 20,
      "maxFollowsPerDay": 30,
      "maxProfileViewsPerDay": 40,
      "maxPostLikesPerDay": 30,
      "rampUpDay": 0,
      "inboxMode": "platform_only",
      "pendingInvitesCount": 34,
      "pendingInvitesOldCount": 5,
      "usage": {
        "daily": {
          "connectionRequests": 12,
          "messages": 8,
          "profileViews": 4,
          "follows": 0,
          "inmails": 1,
          "postLikes": 2
        },
        "limits": {
          "connectionRequestsPerDay": 25,
          "messagesPerDay": 40,
          "profileViewsPerDay": 40,
          "followsPerDay": 30,
          "inmailsPerDay": 20,
          "postLikesPerDay": 30
        },
        "lastActionAt": "2026-08-18T09:30:00.000Z",
        "pausedUntil": null
      },
      "activeInviteCleanup": null,
      "createdAt": "2026-05-01T08:00:00.000Z"
    }
  ]
}

Get Account

GET/api/accounts/:id

Get detailed account information including SSI scores, all sending limits, and live daily usage.

Request — cURLcURL
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response (200 OK)JSON
{
  "account": {
    "id": "cm3acc123mno",
    "linkedinName": "John Smith",
    "linkedinHeadline": "Sales Director at Acme Corp",
    "linkedinProfileUrl": "https://linkedin.com/in/johnsmith",
    "linkedinPhotoUrl": "https://media.licdn.com/...",
    "accountType": "PREMIUM",
    "connectionCount": 2450,
    "status": "ACTIVE",
    "ssiScore": 72.5,
    "ssiPreviousScore": 68.0,
    "ssiEstablishBrand": 18.5,
    "ssiFindPeople": 20.0,
    "ssiEngageInsights": 16.0,
    "ssiBuildRelationships": 18.0,
    "ssiIndustryRank": 12,
    "ssiNetworkRank": 8,
    "ssiIndustry": "Computer Software",
    "ssiLastFetchedAt": "2026-08-18T06:00:00.000Z",
    "maxConnectionRequestsPerDay": 25,
    "maxConnectionRequestsPerWeek": 100,
    "maxMessagesPerDay": 40,
    "maxInMailsPerDay": 20,
    "maxFollowsPerDay": 30,
    "maxProfileViewsPerDay": 40,
    "maxPostLikesPerDay": 30,
    "rampUpDay": 0,
    "inboxMode": "platform_only",
    "createdAt": "2026-05-01T08:00:00.000Z"
  },
  "usage": {
    "daily": { "connectionRequests": 12, "messages": 8, "profileViews": 4, "follows": 0, "inmails": 1, "postLikes": 2 },
    "limits": { "connectionRequestsPerDay": 25, "messagesPerDay": 40, "profileViewsPerDay": 40, "followsPerDay": 30, "inmailsPerDay": 20, "postLikesPerDay": 30 },
    "lastActionAt": "2026-08-18T09:30:00.000Z",
    "pausedUntil": null
  }
}

Update Account Settings

PATCH/api/accounts/:id

Update an account's sending limits, warm-up, and inbox privacy mode. All fields are optional. Values that are missing, non-numeric, or outside the allowed range are silently ignored (the field keeps its current value); check the returned account to see what was actually saved. Manually saving a new maxConnectionRequestsPerDay clears the auto-lowered flag that is set when LinkedIn throttles invitations.

Request Body

ParameterTypeDescription
maxConnectionRequestsPerDaynumberDaily connection request limit (0-40)
maxConnectionRequestsPerWeeknumberRolling 7-day connection request cap (0-200). LinkedIn enforces invitations weekly, so this cap applies in addition to the daily limit.
maxMessagesPerDaynumberDaily message limit (0-40)
maxInMailsPerDaynumberDaily InMail limit (0-40)
maxFollowsPerDaynumberDaily follow limit (0-40)
maxProfileViewsPerDaynumberDaily profile view limit (0-40)
maxPostLikesPerDaynumberDaily post like limit (0-40)
rampUpDaynumberWarm-up days remaining (0 = no ramp-up, max 30)
inboxModestring"all" or "platform_only". Controls which conversations are visible in the inbox APIs: "platform_only" shows only conversations started from Weezly Outreach. Other values are ignored.
Request — cURLcURL
curl --location --request PATCH 'https://outreach.weezly.com/api/accounts/:id' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "maxConnectionRequestsPerDay": 20,
  "maxConnectionRequestsPerWeek": 100,
  "inboxMode": "all"
}'
Response (200 OK)JSON
{
  "account": {
    "id": "cm3acc123mno",
    "maxConnectionRequestsPerDay": 20,
    "maxConnectionRequestsPerWeek": 100,
    "maxMessagesPerDay": 40,
    "maxInMailsPerDay": 20,
    "maxFollowsPerDay": 30,
    "maxProfileViewsPerDay": 40,
    "maxPostLikesPerDay": 30,
    "rampUpDay": 0,
    "inboxMode": "all"
  }
}

Get SSI Score

GET/api/accounts/:id/ssi

Get the Social Selling Index score for an account plus recommended sending limits for its SSI tier. Cached for 24 hours. Use ?force=true to refresh. Returns ssi: null when no score is available yet.

Query Parameters

ParameterTypeDescription
forcebooleanForce refresh from LinkedIn (bypasses the 24h cache)
Request — cURLcURL
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id/ssi' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response (200 OK)JSON
{
  "ssi": {
    "total": 72.5,
    "previousScore": 68.0,
    "change": 4.5,
    "establishBrand": 18.5,
    "findPeople": 20.0,
    "engageInsights": 16.0,
    "buildRelationships": 18.0,
    "industryRank": 12,
    "networkRank": 8,
    "industry": "Computer Software",
    "industryAvg": 35.2,
    "networkAvg": 42.1,
    "lastFetchedAt": "2026-08-18T06:00:00.000Z",
    "cached": true
  },
  "recommendation": {
    "tier": "excellent",
    "tierLabel": "Excellent",
    "limits": {
      "maxConnectionRequestsPerDay": 25,
      "maxConnectionRequestsPerWeek": 150,
      "maxMessagesPerDay": 50,
      "maxInMailsPerDay": 10,
      "maxFollowsPerDay": 25,
      "maxProfileViewsPerDay": 80,
      "maxPostLikesPerDay": 25
    },
    "warning": null,
    "tips": []
  }
}

Account Performance

GET/api/accounts/:id/performance

Get daily performance metrics for an account over a time period, plus totals and the campaigns this account sends for. The acceptance rate is capped at 100 (acceptances in the window can belong to invites sent before it).

Query Parameters

ParameterTypeDescription
daysnumberNumber of days (default: 30)
campaignIdstringFilter by campaign
Request — cURLcURL
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id/performance' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response (200 OK)JSON
{
  "daily": [
    {
      "date": "2026-08-17",
      "connections_sent": 15,
      "connections_accepted": 4,
      "messages_sent": 8,
      "replies_received": 2,
      "inmails_sent": 1,
      "profile_views": 10,
      "follows": 0,
      "post_likes": 3,
      "engagements": 1
    }
  ],
  "totals": {
    "connections_sent": 450,
    "connections_accepted": 135,
    "messages_sent": 135,
    "replies_received": 18,
    "inmails_sent": 25,
    "profile_views": 500,
    "follows": 12,
    "post_likes": 40,
    "engagements": 9
  },
  "acceptanceRate": 30,
  "replyRate": 13,
  "campaigns": [
    { "id": "cm3camp456", "name": "Q3 SaaS Founders", "status": "ACTIVE" }
  ]
}

Get Proxy Configuration

GET/api/accounts/:id/proxy

View the proxy the account's LinkedIn session runs through, read live. mode is 'managed' (a managed proxy in a given country), 'custom' (your own proxy), or 'unknown'. Proxy passwords are never returned.

Request — cURLcURL
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id/proxy' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response (200 OK)JSON
{
  "proxy": {
    "mode": "managed",
    "country": "us",
    "host": null,
    "port": null,
    "protocol": null
  }
}

Response Codes

200Current proxy configuration
404Account not found
502The proxy configuration could not be read from the LinkedIn session

Change Proxy

PATCH/api/accounts/:id/proxy

Reassign the account's proxy. Send either country (a managed proxy in that country) or proxy (your own proxy server), not both. Warning: changing the proxy gives the account a new IP address in LinkedIn's eyes and can trigger a LinkedIn security checkpoint that requires the user to verify the login. Returns the fresh proxy configuration after the change; passwords are never returned.

Request Body

ParameterTypeDescription
countrystringISO 3166-1 alpha-2 country code (lowercase, e.g. "us", "de", "gb") from the supported managed-proxy country list. Unsupported countries return 400.
proxyobjectCustom proxy: { protocol, host, port, username?, password? }. protocol must be "https", "http", or "socks5"; host is required; port must be 1-65535.
Request — cURLcURL
curl --location --request PATCH 'https://outreach.weezly.com/api/accounts/:id/proxy' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "country": "de"
}'
Response (200 OK)JSON
{
  "proxy": {
    "mode": "managed",
    "country": "de",
    "host": null,
    "port": null,
    "protocol": null
  }
}

Response Codes

200Proxy changed; fresh configuration returned
400Unsupported country, invalid proxy details, or neither country nor proxy provided
404Account not found
502The proxy change was not accepted

Reconnect Account

POST/api/accounts/:id/reconnect

Get a hosted reconnect link for an account whose LinkedIn session has expired or been disconnected. Open the returned URL in a browser: the user logs in on the hosted page and the same account comes back to life. Campaigns, senders, and history stay attached; nothing is created or deleted.

Request — cURLcURL
curl --location --request POST 'https://outreach.weezly.com/api/accounts/:id/reconnect' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response (200 OK)JSON
{
  "url": "https://account.example.com/hosted/reconnect/..."
}

Response Codes

200Reconnect link generated
404Account not found

List Pending Invitations

GET/api/accounts/:id/pending-invitations

List the account's pending sent connection invitations (read live from LinkedIn) with age analysis, plus the active withdrawal cleanup if one is running. A large or old backlog of never-accepted invitations is one of LinkedIn's strongest throttle triggers. ageDays is approximate (LinkedIn reports age as a human string like 'Sent 3 weeks ago'); invitations older than oldThresholdDays (60) count toward oldCount.

Request — cURLcURL
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id/pending-invitations' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response (200 OK)JSON
{
  "invitations": [
    {
      "id": "inv_98f2c1",
      "date": "Sent 3 weeks ago",
      "ageDays": 21,
      "invitation_text": "Hi Sarah, great to meet you at SaaStr!",
      "invited_user": "Sarah Chen",
      "invited_user_id": "ACoAAB...",
      "invited_user_public_id": "sarahchen",
      "invited_user_profile_picture_url": "https://media.licdn.com/...",
      "invited_user_description": "VP Marketing at TechCo"
    }
  ],
  "total": 34,
  "oldCount": 5,
  "oldThresholdDays": 60,
  "activeCleanup": null
}

Response Codes

200Pending invitations with analysis
404Account not found

Withdraw Pending Invitations

POST/api/accounts/:id/pending-invitations

Start a paced background withdrawal of pending invitations. Provide either olderThanDays (withdraw everything at least that old) or invitationIds (an explicit selection, max 2000). For account safety, withdrawals are intentionally slow: small batches of 8 with 12-30 second gaps between withdrawals, about 45 seconds between batches, and a hard cap of 100 withdrawals per account per day (the job resumes the next day if needed). Only one cleanup can run per account at a time; poll the GET endpoint's activeCleanup for progress.

Request Body

ParameterTypeDescription
olderThanDaysnumberWithdraw all pending invitations at least this many days old (0 = all)
invitationIdsstring[]Explicit invitation IDs to withdraw (from the GET endpoint), max 2000
Request — cURLcURL
curl --location --request POST 'https://outreach.weezly.com/api/accounts/:id/pending-invitations' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "olderThanDays": 60
}'
Response (200 OK)JSON
{
  "cleanup": {
    "id": "cln_7d21ab",
    "requested": 5,
    "withdrawn": 0
  }
}

Response Codes

200Cleanup started
400No selection provided, or nothing matches the selection anymore
404Account not found
409A withdrawal is already running for this account

Pause Account

POST/api/accounts/:id/pause

Pause an account. Stops all outreach activity for this account across all campaigns until resumed.

Request — cURLcURL
curl --location --request POST 'https://outreach.weezly.com/api/accounts/:id/pause' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response (200 OK)JSON
{ "account": { "id": "cm3acc123mno", "status": "PAUSED", "pausedUntil": "2027-08-18T09:00:00.000Z" } }

Resume Account

POST/api/accounts/:id/resume

Resume a paused account.

Request — cURLcURL
curl --location --request POST 'https://outreach.weezly.com/api/accounts/:id/resume' \
  --header 'X-API-KEY: sk_live_YOUR_API_KEY'
Response (200 OK)JSON
{ "account": { "id": "cm3acc123mno", "status": "ACTIVE", "pausedUntil": null } }

Account Statuses

The status field reflects the state of the account's LinkedIn session. Some values are stored verbatim from the session state, so they can occasionally appear in lowercase (for example "stopped" or "credentials").

ACTIVELinkedIn session is healthy and the account is sending
PAUSEDPaused by the user, or auto-paused by rate limiting
WARNEDLinkedIn flagged unusual activity; sending is held back
CONNECTINGThe LinkedIn session is still being established
DISCONNECTEDThe LinkedIn session was lost; reconnect the account
STOPPEDThe LinkedIn session was stopped; reconnect the account
CREDENTIALSLinkedIn login expired; the user must log in again via a reconnect link
ERRORThe LinkedIn connection is in an error state

For DISCONNECTED, STOPPED, CREDENTIALS, and ERROR accounts, use POST /api/accounts/:id/reconnect to get a hosted login link that restores the same account.