LinkedIn API - Post to LinkedIn via REST API

View as Markdown

Post to LinkedIn programmatically using the Publora REST API. A simpler alternative to the LinkedIn Marketing API, LinkedIn Share API, or LinkedIn Community Management API.

LinkedIn API Overview

Publora provides a unified REST API for professional content publishing to LinkedIn, including text posts, media attachments (images and videos), analytics retrieval (impressions, reactions, comments), reaction management, comments, and reshares (reposts). No need to manage LinkedIn OAuth flows, handle the LinkedIn API partner program requirements, or implement complex share creation endpoints.

Why Use Publora Instead of LinkedIn Marketing API?

Feature Publora API LinkedIn Marketing API
Authentication Single API key Complex OAuth 2.0 flow
API access Instant LinkedIn partner approval
Analytics Built-in Separate API calls
Multi-platform Post to 10 platforms LinkedIn only
Setup time 5 minutes Weeks (partner approval)
Reactions Full support Full support

Keywords: LinkedIn API, LinkedIn posting API, LinkedIn Share API, LinkedIn Marketing API, post to LinkedIn programmatically, LinkedIn REST API, LinkedIn developer API, LinkedIn automation API, LinkedIn content API, LinkedIn bot API, LinkedIn analytics API, LinkedIn UGC API

Platform ID Format

linkedin-{profileId}

Where {profileId} is your LinkedIn profile identifier assigned during account connection via OAuth.

Requirements

  • A LinkedIn account connected via OAuth through the Publora dashboard
  • API key from Publora (Pro or Premium plan required)

Note: The free Starter plan includes API access (apiAccess: true) — API key authentication works on all standard plans.

Supported Content

Type Supported Limits
Text Yes 3,000 characters
Images Yes JPEG, PNG (WebP auto-converted to JPEG), multiple supported
Videos Yes MP4 format
Analytics Yes IMPRESSION, MEMBERS_REACHED, RESHARE, REACTION, COMMENT
Reactions Yes LIKE, PRAISE, EMPATHY, INTEREST, APPRECIATION, ENTERTAINMENT
Comments Yes Create, delete, reply (raw input up to 10,000 characters; 1,250 after mention processing)
Reshares (Reposts) Yes Immediate or scheduled, with optional commentary (3,000 characters max)
Mentions Yes @mention people and organizations

API Limits

Character Limit

  • 3,000 characters maximum per post
  • First 210 characters visible before "see more" is shown

Image Limits (API)

Property Limit
Primary gate 36,152,320 pixels (about 6048×6048); 50 MB permissive byte ceiling
Max count 10 (multi-image posts)
Formats JPEG, PNG, GIF, WebP (WebP images are auto-converted to JPEG before upload to LinkedIn)

Note: GIF images are passed through without conversion — if the LinkedIn API rejects a GIF, consider converting to JPEG/PNG before uploading.

Important: Organic carousels (swipeable multi-image posts) are NOT supported via the API. The API only supports multi-image grid layouts. Swipeable carousels are only available for sponsored content.

Video Limits (API)

Property Limit
Duration 30 minutes (more than native's 15 min desktop / 10 min mobile)
Max size 500 MB (native allows 5 GB)
Formats MP4 only

Important API Restrictions

  • Cannot mix media types: Images cannot be combined with videos or documents in the same post
  • No organic carousels: Swipeable multi-image posts are not available via API — only multi-image grid layout
  • Rate limit: 200+ API calls per hour, based on user count

Common Error Messages

Error Cause
MEDIA_ASSET_PROCESSING_FAILED File too large or unsupported format
Error 429 Rate limit exceeded

Mentioning People and Organizations

Publora supports @mentioning LinkedIn members and organizations in your posts. When the post is published, the mention becomes a clickable link and the mentioned person/organization receives a notification.

Mention Syntax

Use the following format in your post content:

@{urn:li:person:MEMBER_ID|Display Name}       # Mention a person
@{urn:li:organization:ORG_ID|Company Name}    # Mention an organization

Examples

Mentioning a person:

Great insights from @{urn:li:person:ACoAABcD1234EfG|Serge Bulaev} on building APIs!

Result: Great insights from @Serge Bulaev on building APIs!

Mentioning a company:

Excited to work with @{urn:li:organization:107107343|Creative Content Crafts Inc}!

Result: Excited to work with @Creative Content Crafts Inc!

Both mentions will be rendered as clickable links on LinkedIn.

How to Find LinkedIn URNs

  • Person URN: The member ID from LinkedIn's API. The format is urn:li:person:{member_id}. Member IDs are typically long alphanumeric strings (e.g. ACoAABcD1234EfG). You can find them via LinkedIn's API (/me endpoint) or browser developer tools.
  • Organization URN: Found in the company page URL or via LinkedIn's API. Format: urn:li:organization:{numeric_id}. Organization IDs are typically 8-digit numbers.

Important: You must use a valid LinkedIn URN ID. Invalid or made-up IDs will cause a 400 error: "Person URN ID in commentary field is invalid." Always verify the URN before posting. See the LinkedIn Mentions Guide for details.

Important: Name Matching Requirements

The display name must exactly match the name on LinkedIn (case-sensitive):

  • For people: Use their exact name as shown on their LinkedIn profile
  • For organizations: Use the exact registered company name including suffixes like "Inc", "LLC", etc.
Correct Incorrect
@{urn:li:organization:98765432|Acme Corp Inc} @{urn:li:organization:98765432|Acme Corp}
@{urn:li:person:ACoAADeFgHi5678|John Smith} @{urn:li:person:ACoAADeFgHi5678|john smith}

If the name doesn't match exactly, the mention will appear as plain text instead of a clickable link.

Code Example

JavaScript

const response = await fetch('https://api.publora.com/api/v1/create-post', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    content: 'Excited to collaborate with @{urn:li:person:ACoAABcD1234EfG|Serge Bulaev} on this project!',
    platforms: ['linkedin-987654321']
  })
});

Python

import requests
 
response = requests.post(
    'https://api.publora.com/api/v1/create-post',
    headers={
        'Content-Type': 'application/json',
        'x-publora-key': 'YOUR_API_KEY'
    },
    json={
        'content': 'Excited to collaborate with @{urn:li:person:ACoAABcD1234EfG|Serge Bulaev} on this project!',
        'platforms': ['linkedin-987654321']
    }
)

Analytics

Publora can retrieve analytics for your LinkedIn posts. Available metrics:

Metric Description
IMPRESSION Number of times the post was displayed
MEMBERS_REACHED Unique LinkedIn members who saw the post
RESHARE Number of times the post was shared
REACTION Total reactions on the post
COMMENT Number of comments on the post

Reactions

LinkedIn supports a richer set of reactions than a simple "like":

Reaction Description
LIKE Standard like (thumbs up)
PRAISE Clapping hands / applause
EMPATHY Heart / love
INTEREST Lightbulb / insightful
APPRECIATION Supportive
ENTERTAINMENT Funny / laughing

Create a Reaction

Endpoint: POST /api/v1/linkedin-reactions

Parameter Type Required Description
postedId string Yes LinkedIn post URN (e.g., urn:li:share:123 or urn:li:ugcPost:123)
reactionType string Yes One of: LIKE, PRAISE, EMPATHY, INTEREST, APPRECIATION, ENTERTAINMENT
platformId string Yes Your LinkedIn platform ID (e.g., linkedin-ABC123)

JavaScript

const response = await fetch('https://api.publora.com/api/v1/linkedin-reactions', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    postedId: 'urn:li:ugcPost:7429953213384187904',
    reactionType: 'INTEREST',
    platformId: 'linkedin-987654321'
  })
});
 
const data = await response.json();
// HTTP 201 Created
console.log(data);
// {
//   success: true,
//   reaction: {
//     id: "urn:li:reaction:(urn:li:person:xxx,urn:li:ugcPost:xxx)",
//     reactionType: "INTEREST",
//     ...
//   },
//   urnTranslated: { from: "original-urn", to: "translated-urn" }  // present when URN translation was needed
// }

Note: The create reaction endpoint returns HTTP 201 (not 200). The response may include an urnTranslated field when the provided URN needed to be translated to a different format for the LinkedIn API.

Note: POSTing a reaction that already exists returns 409 REACTION_ALREADY_EXISTS. Reactions are keyed by (account, post), so delete the existing reaction before applying a different type.

cURL

curl -X POST https://api.publora.com/api/v1/linkedin-reactions \
  -H "Content-Type: application/json" \
  -H "x-publora-key: YOUR_API_KEY" \
  -d '{
    "postedId": "urn:li:ugcPost:7429953213384187904",
    "reactionType": "INTEREST",
    "platformId": "linkedin-987654321"
  }'

Delete a Reaction

Endpoint: DELETE /api/v1/linkedin-reactions

Parameter Type Required Description
postedId string Yes LinkedIn post URN
platformId string Yes Your LinkedIn platform ID

cURL

curl -X DELETE https://api.publora.com/api/v1/linkedin-reactions \
  -H "Content-Type: application/json" \
  -H "x-publora-key: YOUR_API_KEY" \
  -d '{
    "postedId": "urn:li:ugcPost:7429953213384187904",
    "platformId": "linkedin-987654321"
  }'

Note: The delete reaction response includes the reaction field set to null (not the deleted reaction type). It may also include an urnTranslated field ({ from: "original-urn", to: "translated-urn" }) when URN translation was needed.

Response example:

{
  "success": true,
  "reaction": null,
  "urnTranslated": { "from": "original-urn", "to": "translated-urn" }
}

Comments

Publora supports creating and deleting comments on LinkedIn posts programmatically.

Create a Comment

Endpoint: POST /api/v1/linkedin-comments

Parameter Type Required Description
postedId string Yes LinkedIn post URN (e.g., urn:li:share:123 or urn:li:ugcPost:123)
message string Yes Raw input up to 10,000 characters; after mention processing, the text sent to LinkedIn must be at most 1,250 characters
platformId string Yes Your LinkedIn platform ID (e.g., linkedin-ABC123)
parentComment string No Comment URN for nested replies

JavaScript

const response = await fetch('https://api.publora.com/api/v1/linkedin-comments', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    postedId: 'urn:li:share:7434685316856377344',
    message: 'Great post! Thanks for sharing.',
    platformId: 'linkedin-987654321'
  })
});
 
const data = await response.json();
// HTTP 201 Created
console.log(data);
// {
//   success: true,
//   comment: {
//     id: "7434695495614312448",
//     commentUrn: "urn:li:comment:(urn:li:activity:xxx,7434695495614312448)",
//     message: "Great post! Thanks for sharing.",
//     ...
//   }
// }

Note: The create comment endpoint returns HTTP 201 (not 200).

cURL

curl -X POST https://api.publora.com/api/v1/linkedin-comments \
  -H "Content-Type: application/json" \
  -H "x-publora-key: YOUR_API_KEY" \
  -d '{
    "postedId": "urn:li:share:7434685316856377344",
    "message": "Great post! Thanks for sharing.",
    "platformId": "linkedin-987654321"
  }'

Delete a Comment

Endpoint: DELETE /api/v1/linkedin-comments

Parameter Type Required Description
postedId string Yes LinkedIn post URN the comment belongs to
commentId string Yes Comment URN to delete (also accepts plain numeric IDs, e.g., 7434695495614312448)
platformId string Yes Your LinkedIn platform ID

JavaScript

const response = await fetch('https://api.publora.com/api/v1/linkedin-comments', {
  method: 'DELETE',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    postedId: 'urn:li:share:7434685316856377344',
    commentId: 'urn:li:comment:(urn:li:activity:xxx,7434695495614312448)',
    platformId: 'linkedin-987654321'
  })
});
 
const data = await response.json();
console.log(data);
// { success: true, deleted: "urn:li:comment:(...)" }

cURL

curl -X DELETE https://api.publora.com/api/v1/linkedin-comments \
  -H "Content-Type: application/json" \
  -H "x-publora-key: YOUR_API_KEY" \
  -d '{
    "postedId": "urn:li:share:7434685316856377344",
    "commentId": "urn:li:comment:(urn:li:activity:xxx,7434695495614312448)",
    "platformId": "linkedin-987654321"
  }'

Replying to a Comment

To reply to an existing comment (nested comment), include the parentComment parameter:

const response = await fetch('https://api.publora.com/api/v1/linkedin-comments', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    postedId: 'urn:li:share:7434685316856377344',
    message: 'I agree with this point!',
    platformId: 'linkedin-987654321',
    parentComment: 'urn:li:comment:(urn:li:activity:xxx,7434695495614312448)'
  })
});

Reshare

Reshare (repost) an existing LinkedIn post to your own feed, with optional commentary. Works for both personal profile and company-page connections — the reshare is authored as the member or the organization automatically.

Reshare a Post

Endpoint: POST /api/v1/linkedin-reshare

Parameter Type Required Description
platformId string Yes Your LinkedIn platform ID (e.g., linkedin-ABC123)
parent string Yes URN of the post to reshare (urn:li:share:<id> or urn:li:ugcPost:<id>)
commentary string No Text added above the reshare (max 3,000 characters)
visibility string No PUBLIC or CONNECTIONS (case-insensitive). Defaults to PUBLIC. CONNECTIONS is personal-profile-only.

For a company-page connection, CONNECTIONS returns 400: "LinkedIn organization reposts cannot use CONNECTIONS visibility; choose PUBLIC".

JavaScript

const response = await fetch('https://api.publora.com/api/v1/linkedin-reshare', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    platformId: 'linkedin-987654321',
    parent: 'urn:li:share:7434685316856377344',
    commentary: 'Great post! Sharing with my network.',
    visibility: 'PUBLIC'
  })
});
 
const data = await response.json();
// HTTP 201 Created
console.log(data.reshare.id); // urn:li:share:...

Note: The reshare endpoint returns HTTP 201 (not 200). The new reshare URN is in reshare.id.

cURL

curl -X POST https://api.publora.com/api/v1/linkedin-reshare \
  -H "Content-Type: application/json" \
  -H "x-publora-key: YOUR_API_KEY" \
  -d '{
    "platformId": "linkedin-987654321",
    "parent": "urn:li:share:7434685316856377344",
    "commentary": "Great post! Sharing with my network."
  }'

See the LinkedIn Reshare endpoint reference for the full parameter and error details.

Schedule a Reshare

Use create-post with platformSettings.linkedin.repostParentUrn to schedule a repost for a future time. The post content becomes the reshare commentary, and media is not allowed on repost groups.

const response = await fetch('https://api.publora.com/api/v1/create-post', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    content: 'My commentary on this great post.',
    platforms: ['linkedin-987654321'],
    scheduledTime: '2026-08-01T14:00:00.000Z',
    platformSettings: {
      linkedin: {
        repostParentUrn: 'urn:li:share:7434685316856377344',
        repostVisibility: 'PUBLIC'
      }
    }
  })
});

Note: If the parent post was deleted, made private, or has resharing disabled, the scheduled post fails at publish time with "LinkedIn rejected the repost — the original post may have been deleted, made private, or is not reshareable."

Examples

Post a Text Update

JavaScript (fetch)

const response = await fetch('https://api.publora.com/api/v1/create-post', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    content: 'Excited to announce our Series A funding! We are building the future of social media management for developer teams. More details coming soon.',
    platforms: ['linkedin-987654321']
  })
});
 
const data = await response.json();
console.log(data);
// Response: { "success": true, "postGroupId": "abc123...", "scheduledTime": null }

Python (requests)

import requests
 
response = requests.post(
    'https://api.publora.com/api/v1/create-post',
    headers={
        'Content-Type': 'application/json',
        'x-publora-key': 'YOUR_API_KEY'
    },
    json={
        'content': 'Excited to announce our Series A funding! We are building the future of social media management for developer teams. More details coming soon.',
        'platforms': ['linkedin-987654321']
    }
)
 
data = response.json()
print(data)
# Response: { "success": true, "postGroupId": "abc123...", "scheduledTime": null }

cURL

curl -X POST https://api.publora.com/api/v1/create-post \
  -H "Content-Type: application/json" \
  -H "x-publora-key: YOUR_API_KEY" \
  -d '{
    "content": "Excited to announce our Series A funding! We are building the future of social media management for developer teams. More details coming soon.",
    "platforms": ["linkedin-987654321"]
  }'
# Response: { "success": true, "postGroupId": "abc123...", "scheduledTime": null }

Node.js (axios)

const axios = require('axios');
 
const response = await axios.post('https://api.publora.com/api/v1/create-post', {
  content: 'Excited to announce our Series A funding! We are building the future of social media management for developer teams. More details coming soon.',
  platforms: ['linkedin-987654321']
}, {
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  }
});
 
console.log(response.data);
// Response: { "success": true, "postGroupId": "abc123...", "scheduledTime": null }

Post with an Image

JavaScript (fetch)

const response = await fetch('https://api.publora.com/api/v1/create-post', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    content: 'Our team just wrapped up an incredible hackathon weekend. Here are some highlights from the event!',
    platforms: ['linkedin-987654321']
  })
});
 
const data = await response.json();
console.log(data);
// Response: { "success": true, "postGroupId": "abc123...", "scheduledTime": null }

Python (requests)

import requests
 
response = requests.post(
    'https://api.publora.com/api/v1/create-post',
    headers={
        'Content-Type': 'application/json',
        'x-publora-key': 'YOUR_API_KEY'
    },
    json={
        'content': 'Our team just wrapped up an incredible hackathon weekend. Here are some highlights from the event!',
        'platforms': ['linkedin-987654321']
    }
)
 
data = response.json()
print(data)
# Response: { "success": true, "postGroupId": "abc123...", "scheduledTime": null }

cURL

curl -X POST https://api.publora.com/api/v1/create-post \
  -H "Content-Type: application/json" \
  -H "x-publora-key: YOUR_API_KEY" \
  -d '{
    "content": "Our team just wrapped up an incredible hackathon weekend. Here are some highlights from the event!",
    "platforms": ["linkedin-987654321"]
  }'
# Response: { "success": true, "postGroupId": "abc123...", "scheduledTime": null }

Node.js (axios)

const axios = require('axios');
 
const response = await axios.post('https://api.publora.com/api/v1/create-post', {
  content: 'Our team just wrapped up an incredible hackathon weekend. Here are some highlights from the event!',
  platforms: ['linkedin-987654321']
}, {
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  }
});
 
console.log(response.data);
// Response: { "success": true, "postGroupId": "abc123...", "scheduledTime": null }

Note: To attach media to a LinkedIn post, first create the post, then upload media using the media upload workflow with the returned postGroupId.

Check Post Analytics

Endpoint: POST /api/v1/linkedin-post-statistics

Parameter Type Required Description
postedId string Yes LinkedIn post URN (e.g., urn:li:share:123 or urn:li:ugcPost:123)
platformId string Yes Your LinkedIn platform ID (e.g., linkedin-ABC123)
queryType string No Single metric to retrieve. Valid values: IMPRESSION, MEMBERS_REACHED, RESHARE, REACTION, COMMENT. ALL is only valid when used with the queryTypes array parameter, not with the singular queryType parameter. At least one of queryType or queryTypes is required. Without this parameter (and without queryTypes), the API returns 400: queryType or queryTypes is required.
queryTypes array of strings No Multiple metrics to retrieve in one request. Same valid values as queryType. At least one of queryType or queryTypes is required.

Response format differs by request type:

  • Single metric (using queryType): Returns { success: true, count: 123, cached: true/false }
  • Multiple metrics (using queryTypes): Returns { success: true/false, metrics: { IMPRESSION: 4521, ... }, cached: true/false, cachedMetrics: [...], errors: [...] }

Multi-metric response fields:

  • cached (boolean): Whether any metrics were served from cache.
  • cachedMetrics (array): Only present when non-empty. Lists which metrics came from cache.
  • errors (array): Present when some metrics failed to fetch.
  • success is false when one or more metrics failed to fetch (i.e., errors array is non-empty). The metrics object is still populated with null for failed metrics.

JavaScript (fetch) — multiple metrics

const response = await fetch('https://api.publora.com/api/v1/linkedin-post-statistics', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    postedId: 'urn:li:share:7434685316856377344',
    platformId: 'linkedin-987654321',
    queryTypes: ['IMPRESSION', 'MEMBERS_REACHED', 'RESHARE', 'REACTION', 'COMMENT']
  })
});
 
const analytics = await response.json();
console.log(analytics);
// {
//   success: true,
//   metrics: {
//     IMPRESSION: 4521,
//     MEMBERS_REACHED: 3200,
//     RESHARE: 12,
//     REACTION: 89,
//     COMMENT: 15
//   }
// }

JavaScript (fetch) — single metric

const response = await fetch('https://api.publora.com/api/v1/linkedin-post-statistics', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    postedId: 'urn:li:share:7434685316856377344',
    platformId: 'linkedin-987654321',
    queryType: 'IMPRESSION'
  })
});
 
const analytics = await response.json();
console.log(analytics);
// { success: true, count: 4521, cached: false }

Python (requests)

import requests
 
response = requests.post(
    'https://api.publora.com/api/v1/linkedin-post-statistics',
    headers={
        'Content-Type': 'application/json',
        'x-publora-key': 'YOUR_API_KEY'
    },
    json={
        'postedId': 'urn:li:share:7434685316856377344',
        'platformId': 'linkedin-987654321',
        'queryTypes': ['IMPRESSION', 'MEMBERS_REACHED', 'RESHARE', 'REACTION', 'COMMENT']
    }
)
 
analytics = response.json()
print(analytics)

cURL

curl -X POST https://api.publora.com/api/v1/linkedin-post-statistics \
  -H "Content-Type: application/json" \
  -H "x-publora-key: YOUR_API_KEY" \
  -d '{
    "postedId": "urn:li:share:7434685316856377344",
    "platformId": "linkedin-987654321",
    "queryTypes": ["IMPRESSION", "MEMBERS_REACHED", "RESHARE", "REACTION", "COMMENT"]
  }'

Node.js (axios)

const axios = require('axios');
 
const response = await axios.post('https://api.publora.com/api/v1/linkedin-post-statistics', {
  postedId: 'urn:li:share:7434685316856377344',
  platformId: 'linkedin-987654321',
  queryTypes: ['IMPRESSION', 'MEMBERS_REACHED', 'RESHARE', 'REACTION', 'COMMENT']
}, {
  headers: {
    'Content-Type': 'application/json',
    'x-publora-key': 'YOUR_API_KEY'
  }
});
 
console.log(response.data);

Additional Analytics Endpoints

Beyond post-level statistics, Publora provides additional LinkedIn analytics endpoints:

  • Followers Statistics (POST /api/v1/linkedin-followers) — Retrieve follower demographics and growth data for your LinkedIn account. See the LinkedIn Followers endpoint docs.
  • Account Statistics (POST /api/v1/linkedin-account-statistics) — Get aggregate account-level statistics including total impressions, engagement, and reach. See the LinkedIn Statistics endpoint docs.
  • Profile Summary (POST /api/v1/linkedin-profile-summary) — Retrieve your LinkedIn profile summary information. See the LinkedIn Profile Summary endpoint docs.

Platform Quirks

  • URN formats differ: LinkedIn URLs use urn:li:activity:xxx but the API requires urn:li:share:xxx or urn:li:ugcPost:xxx. For posts created via Publora, use the postedId from the get-post endpoint. For external posts, you may need to look up the correct URN format.
  • WebP auto-conversion: If you provide a WebP image URL, Publora automatically converts it to JPEG before uploading to LinkedIn. No action needed on your part.
  • 3,000-character limit: LinkedIn enforces a strict 3,000-character limit for post text. Publora will return an error if your content exceeds this.
  • Multiple images: LinkedIn supports posting multiple images at once. They will appear as a multi-image grid layout (not a swipeable carousel — organic carousels are not supported via the API).
  • Rich text not supported via API: LinkedIn's API does not support bold, italic, or other rich text formatting. Use plain text or Unicode characters for emphasis.
  • Analytics delay: LinkedIn analytics may take up to 24 hours to fully populate. Querying immediately after posting will return partial data.
  • Hashtags: LinkedIn hashtags are supported in the content body. They are treated as plain text but become clickable on the platform.
  • Reactions on external posts: You can only react to posts visible in your LinkedIn network. Ensure your account is connected to the post author.

Character Limits

Element Limit
Post body 3,000 characters
Comment 1,250 characters after mention processing (raw input cap 10,000; see the exact errors in LinkedIn Comments)

Publora is built by Creative Content Crafts, Inc. Need AI-powered content creation for LinkedIn, Threads, and X? Try Co.Actor — the best AI service for authentic thought leadership at scale.