LeadPanther API Workflows
LeadPanther API v1 is available to accounts with active billing. API keys are bearer tokens. Keep them server-side and never expose them in browser code.
Base URL:
https://app.leadpanther.ai/api/v1
Use only documented paths under this base URL. https://api.leadpanther.ai/v1 is not the app API base URL.
All examples use anonymized IDs, keys, and personal data. Replace placeholder values such as lp_live_REDACTED, 00000000-0000-4000-8000-000000000001, 00000000-0000-4000-8000-000000000003, and 00000000-0000-4000-8000-000000000002 with values from your account.
Direct and Agency Patterns
Direct-user work uses the direct account routes:
/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. If a call returns 403, check both the API key scope and the agency-client grant.
Workspace social actions use /workspaces/{workspaceId}/social-actions. Those routes are workspace-scoped, not agency-client-scoped, and do not use clientId.
All list endpoints use limit and offset pagination unless otherwise documented. The default limit is generally 50 and the maximum is generally 100. For full exports, start at offset=0, keep filters stable, advance by the returned pagination.limit while pagination.has_more is true, and retry the same offset if a page fails. Use the response request_id when contacting LeadPanther support about an API call.
Scope Checklist
| Workflow | Required scope |
|---|---|
| Verify identity | valid API key |
| List clients | clients:read |
| Create hosted lead magnet | lead_magnets:write |
| Create media upload URL | media:write |
| Create or schedule post | posts:write |
| Get post engagement | analytics:read |
| Get lead magnet analytics | analytics:read |
| List lead magnet follow-up actions | lead_magnets:read |
| Cancel lead magnet follow-up action | lead_magnets:write |
| List leads | leads:read |
| List activity | activity:read |
| Read workspace social actions | social_actions:read |
| Schedule workspace social action | social_actions:write |
The * scope satisfies any required scope.
Fast Response Workflow
Fast Response polls only one selected, lead-magnet-linked post for 30 or 60 minutes. A connected account may have only one overlapping scheduled or active Fast Response session. The normal broad comment scan yields while the session is active and resumes automatically when it ends. Because the user explicitly starts or schedules this temporary mode, its single-post polling continues outside the account's ordinary work hours. Disabling automations or comment capture, pausing the account, or disconnecting LinkedIn still blocks Fast Response.
Fast Response API writes are released per direct-user account. The global API switch alone does not grant access: the resolved account must also have an enabled rollout grant. During the initial canary, agency-client Fast Response writes are unavailable. A create/update payload containing fast_response, or a start/stop action, returns 404 not_found when the feature is unavailable for the API subject. Post reads may still include the additive fast_response status summary.
To reserve Fast Response while scheduling a post, add this to the normal post create or update payload:
"fast_response": {
"enabled": true,
"interval_minutes": 10,
"duration_minutes": 60
}
Intervals are 2, 5, or 10 minutes and durations are 30 or 60 minutes. Omitted enabled values default to 10 and 60. On PATCH, omitting fast_response leaves the reservation unchanged; { "enabled": false } cancels a scheduled reservation.
Start a provider-confirmed published post manually with a required replay key:
curl -sS "https://app.leadpanther.ai/api/v1/posts/00000000-0000-4000-8000-000000000002/fast-response/start" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Idempotency-Key: fr_public_safe_example_001" \
-H "Content-Type: application/json" \
--data '{"interval_minutes":2,"duration_minutes":60}'
Stop the exact session with its public fast_response.id:
curl -sS "https://app.leadpanther.ai/api/v1/posts/00000000-0000-4000-8000-000000000002/fast-response/stop" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
--data '{"boost_id":"00000000-0000-4000-8000-000000000020"}'
Agency calls use the same payloads under /clients/{clientId}/posts/{id}/fast-response/.... Do not send a provider account ID or provider post ID; LeadPanther resolves them from the authorized post and connected account. A 409 with error.details.reason = "boost_window_conflict" identifies a safe same-account collision; change the schedule or disable Fast Response rather than replacing or queueing the existing session.
Verify Identity
Use GET /me to verify the API key, actor type, granted scopes, and subject account.
Required scope: valid API key.
curl -sS "https://app.leadpanther.ai/api/v1/me" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Example response:
{
"data": {
"owner": {
"user_id": "00000000-0000-4000-8000-000000000010",
"full_name": "Example Agency Owner",
"business_name": "Example Agency",
"account_status": "active"
},
"actor_type": "agency",
"scopes": ["clients:read", "lead_magnets:write", "posts:write"],
"subject": {
"user_id": "00000000-0000-4000-8000-000000000010"
}
},
"request_id": "req_000000000000000000000001"
}
List Clients
Use GET /clients to list accounts available to the API key.
Required scope: clients:read.
curl -sS "https://app.leadpanther.ai/api/v1/clients" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Example response:
{
"data": [
{
"user_id": "00000000-0000-4000-8000-000000000001",
"full_name": "Client A",
"business_name": "Client A Company",
"account_status": "active",
"grant": {
"id": "00000000-0000-4000-8000-000000000006",
"label": "Client A",
"status": "active",
"permissions": ["posts:read", "posts:write", "lead_magnets:write"],
"created_at": "2026-05-25T00:00:00.000Z",
"updated_at": "2026-05-25T00:00:00.000Z"
}
}
],
"pagination": {
"limit": 1,
"offset": 0,
"has_more": false
},
"request_id": "req_000000000000000000000002"
}
For agency workflows, use the returned user_id as {clientId} in nested routes.
Create Hosted Lead Magnet
Use POST /lead-magnets for direct-user work. Use POST /clients/{clientId}/lead-magnets for agency-client work.
Required scope: lead_magnets:write.
Hosted lead magnets use delivery_mode: "hosted_content" and require a hosted_page. If the hosted page is published, markdown_content must be non-empty. Hosted and gated templates should include {{resource_link}} unless confirm_missing_magnet_url is set to true.
Direct example:
curl -sS "https://app.leadpanther.ai/api/v1/lead-magnets" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data '{
"delivery_mode": "hosted_content",
"keyword": "GUIDE",
"resource_name": "Example Guide",
"description": "A public-safe guide description.",
"text_template": "Here is the guide: {{resource_link}}",
"not_connected_reply": "Connect with me and I will send it over.",
"linked_posts": [],
"followups": [
{
"enabled": true,
"trigger": "resource_dm_delivered",
"channel": "dm",
"delay_minutes": 1440,
"message_template": "Did you get a chance to use the guide?",
"skip_if_replied": true
}
],
"confirm_missing_magnet_url": false,
"confirm_legacy_placeholder": false,
"hosted_page": {
"title": "Example Guide",
"markdown_content": "# Example Guide\n\nPublic-safe guide content.",
"external_resource_url": null,
"cta_label": null,
"cta_url": null,
"status": "published"
}
}'
Agency example:
curl -sS "https://app.leadpanther.ai/api/v1/clients/00000000-0000-4000-8000-000000000001/lead-magnets" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data '{
"delivery_mode": "hosted_content",
"keyword": "CHECKLIST",
"resource_name": "Example Checklist",
"description": "A public-safe checklist description.",
"text_template": "Here is the checklist: {{resource_link}}",
"linked_posts": [],
"followups": [],
"hosted_page": {
"title": "Example Checklist",
"markdown_content": "# Example Checklist\n\nPublic-safe checklist content.",
"external_resource_url": null,
"cta_label": null,
"cta_url": null,
"status": "published"
}
}'
Example response:
{
"data": {
"lead_magnet": {
"id": "00000000-0000-4000-8000-000000000003",
"delivery_mode": "hosted_content",
"keyword": "GUIDE",
"resource_name": "Example Guide"
},
"result": {
"status": "saved"
}
},
"request_id": "req_000000000000000000000003"
}
Lead Magnet Follow-Up Workflow
Lead magnet follow-up rules are configured on the lead magnet create/update payload with followups. Including followups replaces the existing rules for that magnet. Omitting followups leaves existing rules unchanged on update.
LinkedIn safety requirement: do not configure lead magnet follow-ups so a large batch of DMs or public comments becomes due at the same time. Use randomized delays, spread actions across normal working hours, and avoid exact repeating intervals. See LinkedIn Safety for LeadPanther's provider-safe scheduling guidance.
Supported rule pairs are:
trigger: "resource_dm_delivered"withchannel: "dm"trigger: "public_comment_replied"withchannel: "comment"
Rules are limited to 5 per trigger/channel. delay_minutes is measured from the initial successful delivery event occurred_at. skip_if_replied defaults to true. Choose delay_minutes values with jitter across rules and campaigns; do not set every recipient or rule to the same due time.
When LeadPanther records a successful initial delivery, it materializes matching lead_magnet_followup_actions rows. Customer API clients do not call the internal delivery-event pipeline directly.
The API exposes materialized actions for read/cancel:
curl -sS "https://app.leadpanther.ai/api/v1/lead-magnets/00000000-0000-4000-8000-000000000003/followup-actions?status=pending&limit=25&offset=0" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
curl -sS "https://app.leadpanther.ai/api/v1/lead-magnets/00000000-0000-4000-8000-000000000003/followup-actions/00000000-0000-4000-8000-000000000032/cancel" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Agency-client routes use the same shape under /clients/{clientId}/lead-magnets/{id}/followup-actions.
To queue a one-off historical follow-up sweep through LeadPanther, call the collection route with POST. Use dry_run: true first to validate targeting, channel selection, template variables, duplicate targets, and skipped reasons without creating actions.
curl -sS "https://app.leadpanther.ai/api/v1/lead-magnets/00000000-0000-4000-8000-000000000003/followup-actions" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Idempotency-Key: manual-followup-2026-05-31-001" \
--data '{
"dry_run": true,
"targets": [
{
"activity_id": "00000000-0000-4000-8000-000000000041"
},
{
"lead_id": "00000000-0000-4000-8000-000000000042"
}
],
"channel": "auto",
"message_template": "Hey {{first_name}}, did you have a chance to check out the {{resource_name}}?",
"skip_if_replied": true,
"pacing": {
"min_seconds": 20,
"max_seconds": 45
}
}'
When the dry run looks correct, repeat the same request with dry_run: false and the same idempotency key if it is the same logical queue. The initial release accepts up to 100 targets per request. skip_if_replied must stay enabled.
Manual queue behavior:
- The lead magnet in the URL path controls the
{{resource_name}},{{resource_link}}, and{{keyword}}values. - The request body chooses targets only; it cannot override the owner, client, lead magnet, or resource context.
- Supported variables are
{{first_name}},{{recipient_name}},{{keyword}},{{resource_name}},{{resource_link}},{{magnet_url}}, and{{magnet_link}}. channel: "auto"sends DM only when LeadPanther has safe DM evidence, such as prior DM delivery or an existing inbound DM conversation. Otherwise, it uses a comment target when available or skips the target.- Explicit
channel: "dm"requires a known DM conversation target. Explicitchannel: "comment"requires comment thread fields. - Actions are inserted into the same follow-up action model as native future follow-ups, so existing list and cancel routes continue to apply.
- Historical queues must be paced. Avoid scheduling large same-account batches at identical times; random spacing is part of the safety model.
Execution worker behavior: Convex registers process-lead-magnet-followups to run every minute. The worker claims due pending rows, marks them processing, renders {{first_name}}, {{recipient_name}}, {{keyword}}, {{resource_name}}, {{resource_link}}, and legacy {{magnet_url}}/{{magnet_link}}, checks skip_if_replied when enabled, records the rendered message before any provider send, sends through Unipile, then marks rows completed, skipped, or failed. Retryable checks before provider send, such as unknown reply state, may reschedule back to pending. Once a provider send attempt starts, unconfirmed send outcomes fail for manual review instead of auto-retrying. The worker claims up to 10 rows per run, processes one action per user per run, defers additional due actions for the same user, and enforces same-user send cooldowns across overlapping cron runs. Native rule actions use the default 3-minute same-user cooldown and 20-45 second in-process delay. Manual historical queue actions use their action-level pacing.min_seconds/pacing.max_seconds for same-user cooldown/defer timing, with a runtime cap on in-process sleeps so a cron run cannot stall for many minutes. These worker safeguards are not a substitute for safe scheduling; if every action is due at once, the backlog still creates an automation pattern. Unknown reply state fails closed when skip_if_replied is true. Stale processing rows are marked failed for manual review rather than blindly retried.
Dashboard UI exposure is implemented in the lead magnet create/edit flow. The dashboard uses the same API contract documented above: lead magnet create/update for rules, follow-up action list for queue visibility, and follow-up action cancel for pending cancellations. UI saves that include followups replace the full follow-up rule set for that magnet, while saves that omit followups leave existing rules unchanged. UI testing should use draft magnets or controlled future-dated pending actions and must not trigger real LinkedIn sends unless an explicit production smoke window has been approved.
Expected dashboard behavior:
- Configure DM and public comment follow-up steps from the lead magnet create/edit experience.
- Default
skip_if_repliedto enabled. - Convert days/hours controls into
delay_minutesbefore saving. - Encourage randomized follow-up timing rather than identical delay presets across large campaigns.
- Show action status, channel, trigger, scheduled time, executed time, recipient summary, retry count, and a trimmed error summary.
- Explain
skippedas a safety outcome where no follow-up was sent. - Treat
failedas requiring review, especially if provider send confirmation is ambiguous. - Allow cancellation only for
pendingactions and refresh the queue after cancellation. - Never expose API keys, service-role credentials, delivery-event secrets, Unipile credentials, or internal webhook secrets in browser-visible payloads.
Create Media Upload URL
Use POST /media/upload-url for direct-user work. Use POST /clients/{clientId}/media/upload-url for agency-client work.
Required scope: media:write.
Allowed content types are image/jpeg, image/png, image/gif, image/webp, application/pdf, video/mp4, video/quicktime, and video/webm. Images can be up to 5 MB. PDFs can be up to 15 MB. Videos can be up to 100 MB and must be processed to 899 seconds or shorter before creating a post.
Direct example:
curl -sS "https://app.leadpanther.ai/api/v1/media/upload-url" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data '{
"filename": "example-image.png",
"content_type": "image/png",
"file_size": 102400
}'
Agency example:
curl -sS "https://app.leadpanther.ai/api/v1/clients/00000000-0000-4000-8000-000000000001/media/upload-url" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data '{
"filename": "example-document.pdf",
"content_type": "application/pdf",
"file_size": 204800
}'
Example response:
{
"data": {
"upload_url": "https://storage.example.com/upload/REDACTED",
"token": "REDACTED_UPLOAD_TOKEN",
"path": "api-uploads/00000000-0000-4000-8000-000000000001/example-image.png",
"public_url": "https://cdn.example.com/api-uploads/example-image.png",
"bucket": "content-images",
"content_type": "image/png"
},
"request_id": "req_000000000000000000000004"
}
The returned upload_url and token are sensitive and short-lived. Do not log them in places accessible to end users.
For video posts, upload or process the video and a JPEG thumbnail, then create the post with document_type: "video", video_url, video_thumbnail_url, video_duration_seconds, and video_processing_status: "ready". After a successful publish, LeadPanther deletes the stored video object and keeps the thumbnail for previews.
Create or Schedule a Lead Magnet Post
Use POST /posts for direct-user work. Use POST /clients/{clientId}/posts for agency-client work.
Required scope: posts:write.
To create a lead magnet post, set template_id to the lead magnet ID. Use status: "draft" to save a draft. Use status: "scheduled" with a future scheduled_at ISO datetime to schedule the post.
Direct draft example:
curl -sS "https://app.leadpanther.ai/api/v1/posts" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data '{
"text": "Public-safe post copy. Comment GUIDE and I will send the resource.",
"status": "draft",
"scheduled_at": null,
"theme_id": null,
"template_id": "00000000-0000-4000-8000-000000000003",
"images": [
{
"url": "https://cdn.example.com/api-uploads/example-image.png",
"type": "image"
}
],
"document_url": null,
"document_type": "image",
"notes": "Public-safe internal note.",
"followups": {
"reaction": {
"enabled": true,
"delay_minutes": 30,
"reaction_type": "like"
},
"repost": null,
"comments": [
{
"text": "Comment GUIDE if you want the resource.",
"delay_minutes": 60
}
]
}
}'
Agency scheduled example:
curl -sS "https://app.leadpanther.ai/api/v1/clients/00000000-0000-4000-8000-000000000001/posts" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data '{
"text": "Public-safe scheduled post copy. Comment CHECKLIST and I will send the resource.",
"status": "scheduled",
"scheduled_at": "2026-06-15T14:00:00.000Z",
"theme_id": null,
"template_id": "00000000-0000-4000-8000-000000000003",
"images": [],
"document_url": null,
"document_type": "image",
"notes": "Public-safe internal note.",
"followups": {
"reaction": {
"enabled": false,
"delay_minutes": 30,
"reaction_type": "like"
},
"repost": null,
"comments": []
}
}'
Example response:
{
"data": {
"id": "00000000-0000-4000-8000-000000000002",
"status": "scheduled",
"scheduled_at": "2026-06-15T14:00:00.000Z",
"template_id": "00000000-0000-4000-8000-000000000003",
"metrics": {},
"theme": null,
"followups": {
"reaction": {
"enabled": false,
"delay_minutes": 30,
"reaction_type": "like"
},
"repost": null,
"comments": []
}
},
"request_id": "req_000000000000000000000005"
}
Schedule Workspace Social Action
Use POST /workspaces/{workspaceId}/social-actions.
Required scope: social_actions:write.
The API key owner must be an active workspace member or have an active workspace API grant with social_actions:write or *. The actor and target post owner must both be active workspace members. The target post must be a LeadPanther content-calendar post in either published or scheduled status.
LinkedIn safety requirement: each workspace comment or repost must have a deliberately randomized scheduled_for. Do not queue many actors to comment or repost at the same timestamp, at fixed minute offsets, or in a tight burst. Spread actions across working hours and keep enough randomness that the pattern does not look automated. See LinkedIn Safety.
Published targets create queued actions and require LinkedIn publish identifiers. Scheduled targets create pending_target actions, then transition to queued after the target post publishes and has LinkedIn publish identifiers.
If scheduled_for is omitted, published targets schedule for now plus 1 minute; scheduled targets schedule for the later of now plus 1 minute or the target post scheduled_at plus 1 minute. If provided, it must be at least 1 minute in the future. For scheduled targets, it must also be after the target post scheduled_at.
Idempotency-Key header and body idempotency_key are both accepted. If both are provided, they must match. Reusing a key with the same payload returns the existing queued action. Reusing a key with a different payload returns 409 conflict.
Comment example:
curl -sS "https://app.leadpanther.ai/api/v1/workspaces/00000000-0000-4000-8000-000000000012/social-actions" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Idempotency-Key: ws-comment-0001" \
--data '{
"actor_user_id": "00000000-0000-4000-8000-000000000001",
"target_post_id": "00000000-0000-4000-8000-000000000002",
"action_type": "comment",
"comment_text": "Great post.",
"scheduled_for": "2026-06-15T14:01:00.000Z"
}'
Repost example:
curl -sS "https://app.leadpanther.ai/api/v1/workspaces/00000000-0000-4000-8000-000000000012/social-actions" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data '{
"actor_user_id": "00000000-0000-4000-8000-000000000001",
"target_post_id": "00000000-0000-4000-8000-000000000002",
"action_type": "repost",
"repost_text": "Worth reading.",
"scheduled_for": "2026-06-15T14:05:00.000Z",
"idempotency_key": "ws-repost-0001"
}'
Example response:
{
"data": {
"id": "00000000-0000-4000-8000-000000000011",
"workspace_id": "00000000-0000-4000-8000-000000000012",
"actor_user_id": "00000000-0000-4000-8000-000000000001",
"target_post_id": "00000000-0000-4000-8000-000000000002",
"action_type": "comment",
"status": "queued",
"scheduled_for": "2026-06-15T14:01:00.000Z",
"comment_text": "Great post.",
"repost_text": null,
"created_at": "2026-06-15T14:00:00.000Z",
"updated_at": null
},
"request_id": "req_000000000000000000000010"
}
Pre-Schedule Workspace Cross-Engagement
Use this workflow when a workspace wants to queue cross-engagement as soon as the parent posts are scheduled in LeadPanther.
Typical sequence:
- Schedule the parent posts through LeadPanther and keep each returned post
idandscheduled_at. - Build the workspace engagement matrix in your own system. For each target post, choose which workspace members should comment or repost. The target post owner should not be used as the actor unless that is intentional.
- For every planned action, choose a randomized
scheduled_forafter the target postscheduled_at. A safer pattern is comments staggered across a wider window after publish and reposts later, not all actions a few minutes after publish. - Call
POST /workspaces/{workspaceId}/social-actionsonce per planned comment or repost. Use a deterministicIdempotency-Keyper action so retries do not create duplicates. - Store the returned social action
id. - Use
GET /workspaces/{workspaceId}/social-actions?status=pending_targetto confirm actions are waiting on scheduled target posts. - If the plan changes before execution, call the cancel endpoint for any
pending_targetorqueuedaction.
For a scheduled target post, the create response returns status: "pending_target". LeadPanther automatically transitions the action to queued after the target post publishes and has LinkedIn publish identifiers. The normal worker then executes the action at scheduled_for; if that time is already due when the target publishes, it runs on the next worker pass.
If the target post is moved back to draft or fails to publish, LeadPanther cancels dependent pending_target actions and keeps the audit trail.
Comment against a scheduled target:
curl -sS "https://app.leadpanther.ai/api/v1/workspaces/00000000-0000-4000-8000-000000000012/social-actions" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Idempotency-Key: ws-000000000012-post-000000000002-actor-000000000001-comment" \
--data '{
"actor_user_id": "00000000-0000-4000-8000-000000000001",
"target_post_id": "00000000-0000-4000-8000-000000000002",
"action_type": "comment",
"comment_text": "Strong perspective here.",
"scheduled_for": "2026-06-15T14:05:00.000Z"
}'
Example scheduled-target response:
{
"data": {
"id": "00000000-0000-4000-8000-000000000011",
"workspace_id": "00000000-0000-4000-8000-000000000012",
"actor_user_id": "00000000-0000-4000-8000-000000000001",
"target_post_id": "00000000-0000-4000-8000-000000000002",
"action_type": "comment",
"status": "pending_target",
"scheduled_for": "2026-06-15T14:05:00.000Z",
"comment_text": "Strong perspective here.",
"repost_text": null,
"executed_at": null,
"created_at": "2026-06-15T13:00:00.000Z",
"updated_at": null
},
"request_id": "req_000000000000000000000011"
}
Check pending actions:
curl -sS "https://app.leadpanther.ai/api/v1/workspaces/00000000-0000-4000-8000-000000000012/social-actions?status=pending_target&target_post_id=00000000-0000-4000-8000-000000000002" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Cancel a planned action:
curl -sS "https://app.leadpanther.ai/api/v1/workspaces/00000000-0000-4000-8000-000000000012/social-actions/00000000-0000-4000-8000-000000000011/cancel" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Current limits:
- Bulk creation is not available yet. Create one action per API call.
- Arbitrary LinkedIn URLs are not supported for workspace social actions.
- Likes/reactions are not supported for workspace social actions.
- LeadPanther does not rewrite
scheduled_forvalues. The caller must randomize timing for each action before creating it.
Read Workspace Social Actions
Use GET /workspaces/{workspaceId}/social-actions to list actions, or GET /workspaces/{workspaceId}/social-actions/{actionId} to retrieve one action.
Required scope: social_actions:read.
Supported list filters are status, action_type, actor_user_id, target_post_id, limit, and offset. status=pending_target returns actions waiting for scheduled target posts to publish.
curl -sS "https://app.leadpanther.ai/api/v1/workspaces/00000000-0000-4000-8000-000000000012/social-actions?status=queued&limit=25&offset=0" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
curl -sS "https://app.leadpanther.ai/api/v1/workspaces/00000000-0000-4000-8000-000000000012/social-actions/00000000-0000-4000-8000-000000000011" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
The response uses the same public action shape as the schedule response. It does not include API key IDs, idempotency keys, payload hashes, raw failure details, retry counters, or vendor result identifiers.
Cancel Workspace Social Action
Use POST /workspaces/{workspaceId}/social-actions/{actionId}/cancel.
Required scope: social_actions:write.
Only pending_target and queued actions can be cancelled. Already-cancelled actions return 200. processing, completed, and failed actions return 409 conflict.
curl -sS "https://app.leadpanther.ai/api/v1/workspaces/00000000-0000-4000-8000-000000000012/social-actions/00000000-0000-4000-8000-000000000011/cancel" \
-X POST \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Get Post Engagement
Use GET /posts/{id}/engagement for direct-user work. Use GET /clients/{clientId}/posts/{id}/engagement for agency-client work.
Required scope: analytics:read.
Direct example:
curl -sS "https://app.leadpanther.ai/api/v1/posts/00000000-0000-4000-8000-000000000002/engagement" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Agency example:
curl -sS "https://app.leadpanther.ai/api/v1/clients/00000000-0000-4000-8000-000000000001/posts/00000000-0000-4000-8000-000000000002/engagement" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Example response:
{
"data": {
"post_id": "00000000-0000-4000-8000-000000000002",
"published_url": "https://www.linkedin.com/posts/example-post",
"metrics_available": true,
"metrics": {
"impressions": 1200,
"reactions": 42,
"comments": 8,
"reposts": 2
}
},
"request_id": "req_000000000000000000000006"
}
Get Lead Magnet Analytics
Use GET /lead-magnets/{id}/analytics for direct-user work. Use GET /clients/{clientId}/lead-magnets/{id}/analytics for agency-client work.
Required scope: analytics:read.
Direct example:
curl -sS "https://app.leadpanther.ai/api/v1/lead-magnets/00000000-0000-4000-8000-000000000003/analytics?limit=25&offset=0" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Agency example:
curl -sS "https://app.leadpanther.ai/api/v1/clients/00000000-0000-4000-8000-000000000001/lead-magnets/00000000-0000-4000-8000-000000000003/analytics?limit=25&offset=0" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Example response:
{
"data": {
"lead_magnet": {
"id": "00000000-0000-4000-8000-000000000003",
"keyword": "GUIDE",
"resource_name": "Example Guide"
},
"page": {
"id": "00000000-0000-4000-8000-000000000008",
"title": "Example Guide",
"slug": "example-guide",
"status": "published",
"published_at": "2026-06-15T14:00:00.000Z",
"created_at": "2026-06-15T14:00:00.000Z",
"updated_at": null
},
"metrics": {
"page_views": 300,
"unique_visitors": 240,
"unique_visitors_limited": false,
"unlocks": 24,
"conversion_rate": 0.1,
"content_access": 22,
"cta_clicks": 8,
"download_clicks": 16,
"captures": 24
},
"recent_captures": [
{
"id": "00000000-0000-4000-8000-000000000007",
"source": "comments",
"lead_id": "00000000-0000-4000-8000-000000000004",
"tracking_link_id": null,
"created_at": "2026-06-15T15:30:00.000Z"
}
],
"pagination": {
"limit": 25,
"offset": 0,
"has_more": false
}
},
"request_id": "req_000000000000000000000007"
}
List Leads
Use GET /leads for direct-user work. Use GET /clients/{clientId}/leads for agency-client work.
Required scope: leads:read.
leads:read can return personal data, including submitted, work, or personal email fields. Public examples are redacted and do not represent the full sensitivity of production data.
Supported filters include limit, offset, keyword, source, has_email, has_intent, qualification, and search.
For full lead exports, keep limit and all filters unchanged for the duration of the run. Continue until pagination.has_more is false; do not infer completion from a fixed number of pages.
Direct example:
curl -sS "https://app.leadpanther.ai/api/v1/leads?limit=50&offset=0&source=comments&has_email=true" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Agency example:
curl -sS "https://app.leadpanther.ai/api/v1/clients/00000000-0000-4000-8000-000000000001/leads?limit=50&offset=0&keyword=GUIDE" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Example response:
{
"data": [
{
"id": "00000000-0000-4000-8000-000000000004",
"linkedin_profile_url": "https://www.linkedin.com/in/example-profile",
"name": "Example Person",
"headline": "Example Headline",
"emails": {
"submitted": "person@example.com",
"work": null,
"personal": null
},
"submitted_name": "Example Person",
"submitted_at": "2026-06-15T15:30:00.000Z",
"submitted_via_magnet_id": "00000000-0000-4000-8000-000000000003",
"sources": {
"comments": true,
"dms": false,
"intent": false
},
"total_interactions": 1,
"latest_keyword": "GUIDE",
"keywords": ["GUIDE"],
"has_intent": true,
"intent_signals": ["Requested guide"],
"qualification_status": "qualified",
"last_delivery": {
"channel": "comment",
"event_at": "2026-06-15T15:46:00.000Z",
"template_id": "00000000-0000-4000-8000-000000000003"
},
"dm_capability": {
"can_dm": false,
"reason": "none",
"chat_id_available": false,
"last_seen_at": null
},
"first_seen_at": "2026-06-15T15:30:00.000Z",
"last_seen_at": "2026-06-15T15:30:00.000Z",
"created_at": "2026-06-15T15:30:00.000Z",
"updated_at": null
}
],
"pagination": {
"limit": 50,
"offset": 0,
"has_more": false
},
"request_id": "req_000000000000000000000008"
}
List Activity
Use GET /activity for direct-user work. Use GET /clients/{clientId}/activity for agency-client work.
Required scope: activity:read.
activity:read can return message or comment content and platform identifiers. Public examples are redacted and do not represent the full sensitivity of production data.
Supported filters include limit, offset, source, status, keyword, and search.
Direct example:
curl -sS "https://app.leadpanther.ai/api/v1/activity?limit=50&offset=0&source=comments&status=new" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Agency example:
curl -sS "https://app.leadpanther.ai/api/v1/clients/00000000-0000-4000-8000-000000000001/activity?limit=50&offset=0&search=GUIDE" \
-H "Authorization: Bearer lp_live_REDACTED" \
-H "Accept: application/json"
Example response:
{
"data": [
{
"id": "00000000-0000-4000-8000-000000000005",
"source": "comment",
"author_name": "Example Person",
"author_headline": "Example Headline",
"linkedin_profile_url": "https://www.linkedin.com/in/example-profile",
"content": "REDACTED_MESSAGE_CONTENT",
"keyword": "GUIDE",
"status": "new",
"occurred_at": "2026-06-15T15:45:00.000Z",
"metadata": {
"post_id": "00000000-0000-4000-8000-000000000002",
"comment_id": "REDACTED_PLATFORM_COMMENT_ID",
"is_lead_magnet_request": true,
"matched_template_id": "00000000-0000-4000-8000-000000000003",
"delivery_outcome": "comment_replied"
}
}
],
"pagination": {
"limit": 50,
"offset": 0,
"has_more": false
},
"request_id": "req_000000000000000000000009"
}
Unsupported Assumptions
Do not guess endpoint names. The following are not implemented API v1 paths: /accounts, /users, /lists, /campaigns, /organizations, /team, and /lead-magnet-posts. Generic workspace management paths such as /workspaces and /workspaces/{workspaceId} are not implemented API v1 paths. Use only the documented workspace social action route: /workspaces/{workspaceId}/social-actions.
Rate limits are not yet a published contract. Idempotency keys are documented only where explicitly specified, currently POST /workspaces/{workspaceId}/social-actions. Webhooks and SDKs are planned, not currently available as public API v1 features.