LeadPanther API Overview#
LeadPanther API v1 is available to accounts with active billing. API keys can be created and managed from Dashboard Settings -> Developer. Suspended, past-due, canceled, unpaid, and incomplete accounts cannot create or use API keys. API keys are bearer tokens. Keep them server-side and never expose them in browser code.
The canonical base URL is:
https://app.leadpanther.ai/api/v1
https://api.leadpanther.ai/v1 is not the LeadPanther app API base URL.
Current Capabilities#
API v1 supports:
- Reading API key subject information.
- Listing accessible client accounts.
- Creating, reading, updating, and deleting draft or scheduled posts.
- Updating the live text of eligible published LinkedIn posts and deleting eligible published LinkedIn posts.
- Reading post engagement metrics.
- Creating, reading, updating, and archiving lead magnets.
- Reading lead magnet analytics.
- Creating signed media upload URLs and deleting uploaded media.
- Listing leads.
- Listing inbound activity.
- Scheduling workspace member comment and repost actions for enabled workspaces.
Do not guess endpoint names. Use only documented paths under https://app.leadpanther.ai/api/v1. Generic paths such as /accounts, /users, /lists, /campaigns, /organizations, /team, /workspaces, and /lead-magnet-posts are not API v1 endpoints. The only documented workspace path is /workspaces/{workspaceId}/social-actions.
Authentication#
Send your API key in the Authorization header:
Authorization: Bearer lp_live_REDACTED
Supported key prefixes are lp_live_ and lp_test_.
All authenticated endpoints require a valid API key. Most endpoints also require a specific scope. The * scope satisfies any required scope.
Direct And Agency Access#
Direct-user routes operate on the API key owner's account:
/posts
/lead-magnets
/leads
/activity
Agency client work uses nested client routes:
/clients/{clientId}/posts
/clients/{clientId}/lead-magnets
/clients/{clientId}/leads
/clients/{clientId}/activity
For agency access, use the nested client routes. A valid agency API key alone is not enough; the agency must also have an active grant for the target client account.
In API v1, clientId is the client account user_id. Use values returned by GET /clients; do not use account table IDs, API key IDs, key hashes, or private database fields.
Workspace social actions use:
/workspaces/{workspaceId}/social-actions
This route is not an agency-client route and does not use clientId.
Modify Or Delete A Published LinkedIn Post#
Published LinkedIn mutations are capability-driven. Do not infer availability from a post status, LinkedIn URL, or stored provider identifier.
- Fetch the post with
GET /posts/{id}for a direct user orGET /clients/{clientId}/posts/{id}for an agency client. - Read
data.published_mutation_capabilitiesfrom that response. - Update text only when
can_editistrue. Send a uniqueIdempotency-Keyand echo the returned opaqueetaginX-LeadPanther-Post-ETag. - Delete only when
can_deleteistrue. Send a uniqueIdempotency-Keyand require explicit user confirmation because deletion cannot be undone.
Direct-user text update:
curl "https://app.leadpanther.ai/api/v1/posts/00000000-0000-4000-8000-000000000002" \
-X PATCH \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 00000000-0000-4000-8000-000000000003" \
-H 'X-LeadPanther-Post-ETag: lp-post-REDACTED' \
-d '{"text":"Updated LinkedIn post text."}'
Direct-user published deletion:
curl "https://app.leadpanther.ai/api/v1/posts/00000000-0000-4000-8000-000000000002" \
-X DELETE \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Idempotency-Key: 00000000-0000-4000-8000-000000000004"
Agency actors use the same contract on the nested client route:
PATCH /clients/{clientId}/posts/{id}
DELETE /clients/{clientId}/posts/{id}
Both operations require posts:write. An agency key also requires an active grant and activation for the target client. The API resolves the post under that client account; an agency key cannot use these routes to mutate another client or the agency owner's own post.
Published text updates never add, replace, reorder, or remove attached media. A post can be delete-capable even when its text is not edit-capable. Deleting a published post removes it from LinkedIn, including its comments and reactions, then removes its LeadPanther record, tracking, and active automation.
Reuse an idempotency key only to replay the exact same request. If a response returns provider_state_refreshed or stale_provider_version, fetch the post again, show the refreshed text to the user, and require a new review before retrying with the new etag and a new mutation intent.
Response Format#
Success responses use a data envelope:
{
"data": {
"name": "LeadPanther API",
"version": "v1"
},
"request_id": "req_000000000000000000000001"
}
List responses include pagination:
{
"data": [],
"pagination": {
"limit": 50,
"offset": 0,
"has_more": false
},
"request_id": "req_000000000000000000000002"
}
Error responses include a stable error code and message:
{
"error": {
"code": "forbidden",
"message": "API key is missing a required scope."
},
"request_id": "req_000000000000000000000003"
}
Use the response request_id when contacting LeadPanther support about an API call.
Pagination#
All list endpoints use limit and offset pagination. Unless otherwise documented, limit defaults to 50 and is capped at 100.
GET /posts?limit=25&offset=0
Canonical pagination loop:
- Start with
offset=0. - Keep
limitand all filters the same for the full export. - Read
pagination.has_morefrom the response. - If
has_moreistrue, add the returnedpagination.limitto the currentoffsetand request the next page. - If a page fails, retry the same
offset; do not advance until that page succeeds.
Lead magnet analytics uses the same style for recent capture references.
Error Codes#
API v1 can return these error codes:
bad_requestunauthorizedforbiddennot_foundconflictmethod_not_allowednot_implementedinternal_error
If a call returns 403, check the API key scope and the route authorization model. Agency routes also require an active agency-client grant. Workspace social action routes require active workspace membership or an active workspace API grant.
Data Sensitivity#
Public examples in these docs are redacted and do not represent the full sensitivity of production data.
The leads:read scope can return personal data, including lead email fields and profile references. The activity:read scope can return message or comment content and platform identifiers. Store, process, and share responses according to your privacy and compliance obligations.
Current Limitations#
These features are planned or future-facing and are not currently available as a public API v1 contract:
- Published rate-limit semantics.
- Guaranteed idempotency key behavior for endpoints that do not explicitly document it.
- Webhook endpoints.
- Generated SDKs.
- A public changelog and deprecation policy.
Do not use Supabase REST, Supabase storage URLs, or api.leadpanther.ai as the app API unless LeadPanther support explicitly directs you to an internal integration path.
Endpoint Summary#
| Method | Path | Purpose | Required scope |
|---|---|---|---|
GET | / | API metadata | none |
GET | /me | API key owner and subject info | valid API key |
GET | /clients | List accessible client accounts | clients:read |
GET | /clients/{clientId} | Get one client account | clients:read |
GET | /posts | List posts for direct user | posts:read |
POST | /posts | Create post for direct user | posts:write |
GET | /posts/{id} | Get post for direct user | posts:read |
PATCH | /posts/{id} | Update a direct-user post, including eligible published LinkedIn text | posts:write |
DELETE | /posts/{id} | Delete a direct-user post, including eligible published LinkedIn posts | posts:write |
GET | /posts/{id}/engagement | Get post engagement for direct user | analytics:read |
GET | /lead-magnets | List lead magnets for direct user | lead_magnets:read |
POST | /lead-magnets | Create lead magnet for direct user | lead_magnets:write |
GET | /lead-magnets/{id} | Get lead magnet for direct user | lead_magnets:read |
PATCH | /lead-magnets/{id} | Update lead magnet for direct user | lead_magnets:write |
DELETE | /lead-magnets/{id} | Archive lead magnet for direct user | lead_magnets:write |
GET | /lead-magnets/{id}/analytics | Get lead magnet analytics for direct user | analytics:read |
POST | /media/upload-url | Create signed upload URL for direct user | media:write |
DELETE | /media | Delete uploaded media for direct user | media:write |
GET | /leads | List leads for direct user | leads:read |
GET | /activity | List inbound activity for direct user | activity:read |
GET | /workspaces/{workspaceId}/social-actions | List workspace social actions | social_actions:read |
POST | /workspaces/{workspaceId}/social-actions | Schedule workspace comment or repost action | social_actions:write |
GET | /workspaces/{workspaceId}/social-actions/{actionId} | Get workspace social action | social_actions:read |
POST | /workspaces/{workspaceId}/social-actions/{actionId}/cancel | Cancel queued workspace social action | social_actions:write |
POST | /posts/{id}/boost | Create a Team pod boost plan for a scheduled lead-magnet post | pods:write |
GET | /posts/{id}/boost | Get pod boost plan state and progress | pods:read |
DELETE | /posts/{id}/boost | Stop a pod boost plan (idempotent) | pods:write |
POST | /pods/actions/{actionId}/takedown | Take down a completed pod comment | pods:write |
GET | /pods/company-actors | List enrolled pod company actors for the direct owner | pods:read |
PUT | /pods/company-actors/{orgId} | Update an enrolled pod company actor (atomic toggle/cap/cancel) | pods:write |
POST | /linkedin/organizations/refresh | Refresh discovered LinkedIn organizations (throttled) | pods:write |
Agency equivalents use /clients/{clientId}/... for posts, lead magnets, media, leads, activity, and post boosts (/clients/{clientId}/posts/{id}/boost).