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
/api/accountsList 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.
curl --location --request GET 'https://outreach.weezly.com/api/accounts' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"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
/api/accounts/:idGet detailed account information including SSI scores, all sending limits, and live daily usage.
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"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
/api/accounts/:idUpdate 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
| Parameter | Type | Description |
|---|---|---|
maxConnectionRequestsPerDay | number | Daily connection request limit (0-40) |
maxConnectionRequestsPerWeek | number | Rolling 7-day connection request cap (0-200). LinkedIn enforces invitations weekly, so this cap applies in addition to the daily limit. |
maxMessagesPerDay | number | Daily message limit (0-40) |
maxInMailsPerDay | number | Daily InMail limit (0-40) |
maxFollowsPerDay | number | Daily follow limit (0-40) |
maxProfileViewsPerDay | number | Daily profile view limit (0-40) |
maxPostLikesPerDay | number | Daily post like limit (0-40) |
rampUpDay | number | Warm-up days remaining (0 = no ramp-up, max 30) |
inboxMode | string | "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. |
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"
}'{
"account": {
"id": "cm3acc123mno",
"maxConnectionRequestsPerDay": 20,
"maxConnectionRequestsPerWeek": 100,
"maxMessagesPerDay": 40,
"maxInMailsPerDay": 20,
"maxFollowsPerDay": 30,
"maxProfileViewsPerDay": 40,
"maxPostLikesPerDay": 30,
"rampUpDay": 0,
"inboxMode": "all"
}
}Get SSI Score
/api/accounts/:id/ssiGet 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
| Parameter | Type | Description |
|---|---|---|
force | boolean | Force refresh from LinkedIn (bypasses the 24h cache) |
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id/ssi' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"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
/api/accounts/:id/performanceGet 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
| Parameter | Type | Description |
|---|---|---|
days | number | Number of days (default: 30) |
campaignId | string | Filter by campaign |
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id/performance' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"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
/api/accounts/:id/proxyView 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.
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id/proxy' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"proxy": {
"mode": "managed",
"country": "us",
"host": null,
"port": null,
"protocol": null
}
}Response Codes
| 200 | Current proxy configuration |
| 404 | Account not found |
| 502 | The proxy configuration could not be read from the LinkedIn session |
Change Proxy
/api/accounts/:id/proxyReassign 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
| Parameter | Type | Description |
|---|---|---|
country | string | ISO 3166-1 alpha-2 country code (lowercase, e.g. "us", "de", "gb") from the supported managed-proxy country list. Unsupported countries return 400. |
proxy | object | Custom proxy: { protocol, host, port, username?, password? }. protocol must be "https", "http", or "socks5"; host is required; port must be 1-65535. |
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"
}'{
"proxy": {
"mode": "managed",
"country": "de",
"host": null,
"port": null,
"protocol": null
}
}Response Codes
| 200 | Proxy changed; fresh configuration returned |
| 400 | Unsupported country, invalid proxy details, or neither country nor proxy provided |
| 404 | Account not found |
| 502 | The proxy change was not accepted |
Reconnect Account
/api/accounts/:id/reconnectGet 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.
curl --location --request POST 'https://outreach.weezly.com/api/accounts/:id/reconnect' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"url": "https://account.example.com/hosted/reconnect/..."
}Response Codes
| 200 | Reconnect link generated |
| 404 | Account not found |
List Pending Invitations
/api/accounts/:id/pending-invitationsList 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.
curl --location --request GET 'https://outreach.weezly.com/api/accounts/:id/pending-invitations' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"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
| 200 | Pending invitations with analysis |
| 404 | Account not found |
Withdraw Pending Invitations
/api/accounts/:id/pending-invitationsStart 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
| Parameter | Type | Description |
|---|---|---|
olderThanDays | number | Withdraw all pending invitations at least this many days old (0 = all) |
invitationIds | string[] | Explicit invitation IDs to withdraw (from the GET endpoint), max 2000 |
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
}'{
"cleanup": {
"id": "cln_7d21ab",
"requested": 5,
"withdrawn": 0
}
}Response Codes
| 200 | Cleanup started |
| 400 | No selection provided, or nothing matches the selection anymore |
| 404 | Account not found |
| 409 | A withdrawal is already running for this account |
Pause Account
/api/accounts/:id/pausePause an account. Stops all outreach activity for this account across all campaigns until resumed.
curl --location --request POST 'https://outreach.weezly.com/api/accounts/:id/pause' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{ "account": { "id": "cm3acc123mno", "status": "PAUSED", "pausedUntil": "2027-08-18T09:00:00.000Z" } }Resume Account
/api/accounts/:id/resumeResume a paused account.
curl --location --request POST 'https://outreach.weezly.com/api/accounts/:id/resume' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{ "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").
| ACTIVE | LinkedIn session is healthy and the account is sending |
| PAUSED | Paused by the user, or auto-paused by rate limiting |
| WARNED | LinkedIn flagged unusual activity; sending is held back |
| CONNECTING | The LinkedIn session is still being established |
| DISCONNECTED | The LinkedIn session was lost; reconnect the account |
| STOPPED | The LinkedIn session was stopped; reconnect the account |
| CREDENTIALS | LinkedIn login expired; the user must log in again via a reconnect link |
| ERROR | The 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.