LeadPanther API Workflows
LeadPanther API v1 is currently available by approved API key. 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.
All list endpoints use limit and offset pagination unless otherwise documented. The default limit is generally 50 and the maximum is generally 100. 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 leads | leads:read |
| List activity | activity:read |
The * scope satisfies any required scope.
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": [],
"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": [],
"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"
}
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, and application/pdf. Images can be up to 5 MB. PDFs can be up to 15 MB.
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.
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"
}
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.
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",
"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"
}
}
],
"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, /workspaces, and /lead-magnet-posts.
Rate limits are not yet a published contract. Idempotency keys, webhooks, and SDKs are planned, not currently guaranteed or available as public API v1 features.