LinkedIn Pages (company and showcase pages) through your LinkedIn developer app with the Community Management API.
The permissions each capability needs are in App Review: LinkedIn.
- One Connected Profile is one LinkedIn Page, so connecting a member once discovers every Page they hold an approved role on.
- Only organization Pages are supported. A member's own posts are not readable (LinkedIn has closed
r_member_social), and there is nodmsurface: member messaging has no API an approved app can use. - A post is identified by the
urn:li:share:…orurn:li:ugcPost:…URN LinkedIn created it under, verbatim. LinkedIn's notifications name the same post by a differenturn:li:activity:…id that nothing maps back. - Comments are read per post, and a reply to a reply is posted under its top-level comment, because LinkedIn nests replies one level. There is no comment moderation: LinkedIn offers delete (the Page's own comments only) and no hide.
- A post is text, one image or video, or an article link; LinkedIn does not fetch a link, so the article's title and description are what the preview shows. Text is published as typed:
#and@never become hashtags or mentions. - Comment and mention events come from LinkedIn's organization notifications, which LinkedIn sends only for
PUBLICposts, only once your app has Standard Tier, and only while an event subscription exists for the Page and the admin who connected it. Koil answers the webhook URL's validation challenge and subscribes each Page when it is connected, which needs the admin to hold theADMINISTRATORrole. The Page's own posts are collected by polling at an hourly floor. - Each subscribed admin receives their own copy of every notification; the copies collapse to one event per Connected Profile.
Every call spends a daily budget only you can see
platform_rate_limit and a retry hint at the next UTC midnight.| Content type | Operations | Events | Backfill |
|---|---|---|---|
linkedin.feed.items | list, get, publish, delete | created | yes |
linkedin.feed.comments | list, get, publish, delete | created, updated, deleted | no |
linkedin.feed.reactions | list, get, publish, delete | none | no |
linkedin.feed.mentions | none | created | no |
linkedin.feed.items
Posts on the organization's LinkedIn Page.
list
List the Page's posts, newest created first.
| Field | Type | Required | Description |
|---|---|---|---|
connectedProfileId | string | yes | Koil Connected Profile associated with the operation. |
cursor | string | no | Opaque cursor for fetching the next result page. |
limit | number | no | Maximum number of items to return. |
includeProviderRaw | boolean | no | Whether to include transient provider-native payloads. |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"connectedProfileId": {
"description": "Koil Connected Profile associated with the operation.",
"minLength": 1,
"type": "string"
},
"cursor": {
"description": "Opaque cursor for fetching the next result page.",
"minLength": 1,
"type": "string"
},
"limit": {
"description": "Maximum number of items to return.",
"minimum": 1,
"type": "number"
},
"includeProviderRaw": {
"description": "Whether to include transient provider-native payloads.",
"type": "boolean"
}
},
"required": [
"connectedProfileId"
]
}get
Get one of the Page's posts by its share or ugcPost URN.
| Field | Type | Required | Description |
|---|---|---|---|
connectedProfileId | string | yes | Koil Connected Profile associated with the operation. |
externalId | string | yes | The post's urn:li:share:… or urn:li:ugcPost:… URN. |
includeProviderRaw | boolean | no | Whether to include transient provider-native payloads. |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"connectedProfileId": {
"description": "Koil Connected Profile associated with the operation.",
"minLength": 1,
"type": "string"
},
"externalId": {
"minLength": 1,
"description": "The post's urn:li:share:… or urn:li:ugcPost:… URN.",
"type": "string"
},
"includeProviderRaw": {
"description": "Whether to include transient provider-native payloads.",
"type": "boolean"
}
},
"required": [
"connectedProfileId",
"externalId"
]
}publish
Post as the Page: text, one image or video, or an article link, uploaded through LinkedIn's image or video protocol.
Submit through POST /v1/publish-requests with contentType: "linkedin.feed.items". These fields go in the item's args; connectedProfileId and variant are item fields.
| Field | Type | Required | Description |
|---|---|---|---|
text | string | no | The post text, up to 3000 characters, published as typed. |
media | object | object[] | no | One image (JPG, PNG or GIF) or one video (MP4, 3 s to 30 min, up to 500 MB). An asset's altText is published with it. |
article | object | no | A link preview. LinkedIn shows what is given here; it does not fetch the page. |
visibility | "PUBLIC" | "LOGGED_IN" | no | Who can see the post: everyone (the default), or signed-in LinkedIn members only. Only PUBLIC posts raise LinkedIn's comment notifications. |
reshareDisabled | boolean | no | Stop members from resharing the post. |
scheduling | object | no | Future operation time and optional wall-clock timezone. |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"text": {
"maxLength": 3000,
"description": "The post text, up to 3000 characters, published as typed.",
"type": "string"
},
"media": {
"minItems": 1,
"maxItems": 1,
"description": "One image (JPG, PNG or GIF) or one video (MP4, 3 s to 30 min, up to 500 MB). An asset's `altText` is published with it.",
"type": "array",
"items": {
"anyOf": [
{
"additionalProperties": false,
"type": "object",
"properties": {
"mediaId": {
"minLength": 1,
"type": "string"
},
"contentType": {
"minLength": 1,
"type": "string"
},
"altText": {
"minLength": 1,
"type": "string"
}
},
"required": [
"mediaId"
]
},
{
"additionalProperties": false,
"type": "object",
"properties": {
"sourceUrl": {
"minLength": 1,
"type": "string"
},
"contentType": {
"minLength": 1,
"type": "string"
},
"altText": {
"minLength": 1,
"type": "string"
}
},
"required": [
"sourceUrl"
]
}
]
}
},
"article": {
"additionalProperties": false,
"description": "A link preview. LinkedIn shows what is given here; it does not fetch the page.",
"type": "object",
"properties": {
"url": {
"format": "uri",
"type": "string"
},
"title": {
"minLength": 1,
"maxLength": 400,
"type": "string"
},
"description": {
"maxLength": 4086,
"type": "string"
}
},
"required": [
"url",
"title"
]
},
"visibility": {
"description": "Who can see the post: everyone (the default), or signed-in LinkedIn members only. Only PUBLIC posts raise LinkedIn's comment notifications.",
"anyOf": [
{
"const": "PUBLIC",
"type": "string"
},
{
"const": "LOGGED_IN",
"type": "string"
}
]
},
"reshareDisabled": {
"description": "Stop members from resharing the post.",
"type": "boolean"
},
"scheduling": {
"additionalProperties": false,
"description": "Future operation time and optional wall-clock timezone.",
"type": "object",
"properties": {
"at": {
"format": "date-time",
"description": "Future execution time as an ISO-8601 string.",
"type": "string"
},
"timezone": {
"minLength": 1,
"type": "string"
}
},
"required": [
"at"
]
}
},
"required": []
}delete
Delete one of the Page's posts.
| Field | Type | Required | Description |
|---|---|---|---|
connectedProfileId | string | yes | Koil Connected Profile associated with the operation. |
externalId | string | yes |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"connectedProfileId": {
"description": "Koil Connected Profile associated with the operation.",
"minLength": 1,
"type": "string"
},
"externalId": {
"minLength": 1,
"type": "string"
}
},
"required": [
"connectedProfileId",
"externalId"
]
}Not offered
update: not implementedmoderate: provider not supported — LinkedIn exposes no moderation action on a post.
Events
Backfill: supported (bounded coverage); see Backfill history.
Item schema
What list and get return and what events carry as data.
| Field | Type | Required | Description |
|---|---|---|---|
externalId | string | yes | Provider-owned content identifier. |
organizationExternalId | string | yes | |
text | string | no | Caption/body text for content. |
mentions | object[] | no | |
hashtags | string[] | no | |
content | object | yes | |
visibility | string | no | PUBLIC, CONNECTIONS, LOGGED_IN or CONTAINER. Only PUBLIC posts raise LinkedIn's comment notifications. |
lifecycleState | string | no | PUBLISHED, or PUBLISH_REQUESTED while LinkedIn processes it, PUBLISH_FAILED, DRAFT. |
reshareDisabled | boolean | no | |
permalink | string | no | |
publishedAt | string (date-time) | no | Provider publish timestamp as an ISO-8601 string. |
updatedAt | string (date-time) | no | Provider update timestamp as an ISO-8601 string. |
providerRaw | unknown | no | Optional provider-native payload included only for transient delivery/debug use. |
contentType | "linkedin.feed.items" | yes |
linkedin.feed.comments
Comments on the Page's posts, and replies to them.
list
List the comments on one of the Page's posts, or the replies to one of its comments.
| Field | Type | Required | Description |
|---|---|---|---|
connectedProfileId | string | yes | Koil Connected Profile associated with the operation. |
mediaExternalId | string | yes | The post's urn:li:share:… or urn:li:ugcPost:… URN. |
parentExternalId | string | no | A comment URN on that post, to list its replies. |
cursor | string | no | Opaque cursor for fetching the next result page. |
limit | number | no | Maximum number of items to return. |
includeProviderRaw | boolean | no | Whether to include transient provider-native payloads. |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"connectedProfileId": {
"description": "Koil Connected Profile associated with the operation.",
"minLength": 1,
"type": "string"
},
"mediaExternalId": {
"minLength": 1,
"description": "The post's urn:li:share:… or urn:li:ugcPost:… URN.",
"type": "string"
},
"parentExternalId": {
"minLength": 1,
"description": "A comment URN on that post, to list its replies.",
"type": "string"
},
"cursor": {
"description": "Opaque cursor for fetching the next result page.",
"minLength": 1,
"type": "string"
},
"limit": {
"description": "Maximum number of items to return.",
"minimum": 1,
"type": "number"
},
"includeProviderRaw": {
"description": "Whether to include transient provider-native payloads.",
"type": "boolean"
}
},
"required": [
"connectedProfileId",
"mediaExternalId"
]
}get
Get one comment by its URN.
| Field | Type | Required | Description |
|---|---|---|---|
connectedProfileId | string | yes | Koil Connected Profile associated with the operation. |
externalId | string | yes | The comment URN, urn:li:comment:({thread},{id}). |
mediaExternalId | string | no | The post's URN, echoed on the result; LinkedIn's comment read does not return it. |
includeProviderRaw | boolean | no | Whether to include transient provider-native payloads. |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"connectedProfileId": {
"description": "Koil Connected Profile associated with the operation.",
"minLength": 1,
"type": "string"
},
"externalId": {
"minLength": 1,
"description": "The comment URN, urn:li:comment:({thread},{id}).",
"type": "string"
},
"mediaExternalId": {
"minLength": 1,
"description": "The post's URN, echoed on the result; LinkedIn's comment read does not return it.",
"type": "string"
},
"includeProviderRaw": {
"description": "Whether to include transient provider-native payloads.",
"type": "boolean"
}
},
"required": [
"connectedProfileId",
"externalId"
]
}publish
Comment as the Page: a top-level comment on a post, or a reply to a comment.
Submit through POST /v1/publish-requests with contentType: "linkedin.feed.comments". These fields go in the item's args; connectedProfileId and variant are item fields.
| Field | Type | Required | Description |
|---|---|---|---|
target | object | yes | The provider content this publish targets, identified as events identify it. |
text | string | yes | The comment text. |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"target": {
"additionalProperties": false,
"description": "The provider content this publish targets, identified as events identify it.",
"type": "object",
"properties": {
"contentType": {
"anyOf": [
{
"const": "linkedin.feed.items",
"type": "string"
},
{
"const": "linkedin.feed.comments",
"type": "string"
}
]
},
"externalId": {
"description": "Provider-owned content identifier.",
"minLength": 1,
"type": "string"
}
},
"required": [
"contentType",
"externalId"
]
},
"text": {
"minLength": 1,
"description": "The comment text.",
"type": "string"
}
},
"required": [
"target",
"text"
]
}delete
Delete a comment the Page wrote.
| Field | Type | Required | Description |
|---|---|---|---|
connectedProfileId | string | yes | Koil Connected Profile associated with the operation. |
externalId | string | yes |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"connectedProfileId": {
"description": "Koil Connected Profile associated with the operation.",
"minLength": 1,
"type": "string"
},
"externalId": {
"minLength": 1,
"type": "string"
}
},
"required": [
"connectedProfileId",
"externalId"
]
}Not offered
update: not implementedmoderate: provider not supported — LinkedIn has no hide, spam or review action on a comment. The only thread-wide control, closing comments on a post, deletes every existing comment on it, so Koil does not offer it as moderation.
Events
content.linkedin.feed.comments.createdcontent.linkedin.feed.comments.updatedcontent.linkedin.feed.comments.deleted
Backfill: not offered — not implemented — LinkedIn keeps 60 days of comment notifications behind organizationalEntityNotifications, which backfill cannot read yet; see docs/todo.md..
Item schema
What list and get return and what events carry as data.
| Field | Type | Required | Description |
|---|---|---|---|
externalId | string | yes | Provider-owned content identifier. |
commentId | string | yes | |
threadUrn | string | yes | |
mediaExternalId | string | no | |
text | string | no | Caption/body text for content. |
mentions | object[] | no | |
media | object[] | no | |
author | object | no | Provider actor reference for observed content. |
ownerAuthored | boolean | no | |
thread | object | no | Parent/root identifiers for threaded contexts. |
engagement | object | no | Provider-reported engagement counts. |
publishedAt | string (date-time) | no | Provider publish timestamp as an ISO-8601 string. |
updatedAt | string (date-time) | no | Provider update timestamp as an ISO-8601 string. |
providerRaw | unknown | no | Optional provider-native payload included only for transient delivery/debug use. |
contentType | "linkedin.feed.comments" | yes |
linkedin.feed.reactions
Reactions on the Page's posts and comments.
list
List the reactions on one post or comment, newest first.
| Field | Type | Required | Description |
|---|---|---|---|
connectedProfileId | string | yes | Koil Connected Profile associated with the operation. |
entityExternalId | string | yes | A post URN or a comment URN. |
cursor | string | no | Opaque cursor for fetching the next result page. |
limit | number | no | Maximum number of items to return. |
includeProviderRaw | boolean | no | Whether to include transient provider-native payloads. |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"connectedProfileId": {
"description": "Koil Connected Profile associated with the operation.",
"minLength": 1,
"type": "string"
},
"entityExternalId": {
"minLength": 1,
"description": "A post URN or a comment URN.",
"type": "string"
},
"cursor": {
"description": "Opaque cursor for fetching the next result page.",
"minLength": 1,
"type": "string"
},
"limit": {
"description": "Maximum number of items to return.",
"minimum": 1,
"type": "number"
},
"includeProviderRaw": {
"description": "Whether to include transient provider-native payloads.",
"type": "boolean"
}
},
"required": [
"connectedProfileId",
"entityExternalId"
]
}get
Get one reaction by its URN.
| Field | Type | Required | Description |
|---|---|---|---|
connectedProfileId | string | yes | Koil Connected Profile associated with the operation. |
externalId | string | yes | The reaction URN, urn:li:reaction:({actor},{entity}). |
includeProviderRaw | boolean | no | Whether to include transient provider-native payloads. |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"connectedProfileId": {
"description": "Koil Connected Profile associated with the operation.",
"minLength": 1,
"type": "string"
},
"externalId": {
"minLength": 1,
"description": "The reaction URN, urn:li:reaction:({actor},{entity}).",
"type": "string"
},
"includeProviderRaw": {
"description": "Whether to include transient provider-native payloads.",
"type": "boolean"
}
},
"required": [
"connectedProfileId",
"externalId"
]
}publish
React as the Page to a post or a comment.
Submit through POST /v1/publish-requests with contentType: "linkedin.feed.reactions". These fields go in the item's args; connectedProfileId and variant are item fields.
| Field | Type | Required | Description |
|---|---|---|---|
target | object | yes | The provider content this publish targets, identified as events identify it. |
reactionType | "LIKE" | "PRAISE" | "EMPATHY" | "INTEREST" | "APPRECIATION" | "ENTERTAINMENT" | yes | LIKE, PRAISE (celebrate), EMPATHY (love), INTEREST (insightful), APPRECIATION (support) or ENTERTAINMENT (funny). |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"target": {
"additionalProperties": false,
"description": "The provider content this publish targets, identified as events identify it.",
"type": "object",
"properties": {
"contentType": {
"anyOf": [
{
"const": "linkedin.feed.items",
"type": "string"
},
{
"const": "linkedin.feed.comments",
"type": "string"
}
]
},
"externalId": {
"description": "Provider-owned content identifier.",
"minLength": 1,
"type": "string"
}
},
"required": [
"contentType",
"externalId"
]
},
"reactionType": {
"description": "LIKE, PRAISE (celebrate), EMPATHY (love), INTEREST (insightful), APPRECIATION (support) or ENTERTAINMENT (funny).",
"anyOf": [
{
"const": "LIKE",
"type": "string"
},
{
"const": "PRAISE",
"type": "string"
},
{
"const": "EMPATHY",
"type": "string"
},
{
"const": "INTEREST",
"type": "string"
},
{
"const": "APPRECIATION",
"type": "string"
},
{
"const": "ENTERTAINMENT",
"type": "string"
}
]
}
},
"required": [
"target",
"reactionType"
]
}delete
Remove the Page's own reaction.
| Field | Type | Required | Description |
|---|---|---|---|
connectedProfileId | string | yes | Koil Connected Profile associated with the operation. |
externalId | string | yes |
JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"connectedProfileId": {
"description": "Koil Connected Profile associated with the operation.",
"minLength": 1,
"type": "string"
},
"externalId": {
"minLength": 1,
"type": "string"
}
},
"required": [
"connectedProfileId",
"externalId"
]
}Not offered
update: not applicable — Publishing a reaction again replaces the Page's reaction on that entity.moderate: provider not supported
Events
None: this content type is read-only.
Backfill: not offered — not implemented.
Item schema
What list and get return and what events carry as data.
| Field | Type | Required | Description |
|---|---|---|---|
externalId | string | yes | Provider-owned content identifier. |
entityExternalId | string | yes | |
reactionType | string | yes | One of LinkedIn's reaction types, passed through as LinkedIn reports it. |
author | object | no | Provider actor reference for observed content. |
ownerAuthored | boolean | no | |
publishedAt | string (date-time) | no | Provider publish timestamp as an ISO-8601 string. |
providerRaw | unknown | no | Optional provider-native payload included only for transient delivery/debug use. |
contentType | "linkedin.feed.reactions" | yes |
linkedin.feed.mentions
Members' posts and comments that mention the Page.
Not offered
list: provider no endpoint — Reading a member's post needs r_member_social, which LinkedIn has closed to new requests; mentions arrive only as events.get: provider no endpoint — Reading a member's post needs r_member_social, which LinkedIn has closed to new requests.publish: not applicable — A mention is written by a member, never by the Page.update: not applicablemoderate: provider not supporteddelete: not applicable
Events
Backfill: not offered — not implemented — LinkedIn keeps 60 days of mentions behind organizationalEntityNotifications, which backfill cannot read yet; see docs/todo.md..
Item schema
What list and get return and what events carry as data.
| Field | Type | Required | Description |
|---|---|---|---|
externalId | string | yes | Provider-owned content identifier. |
mentionedIn | "post" | "comment" | yes | |
organizationExternalId | string | yes | |
activityUrn | string | no | |
text | string | no | Caption/body text for content. |
author | object | no | Provider actor reference for observed content. |
permalink | string | no | |
publishedAt | string (date-time) | no | Provider publish timestamp as an ISO-8601 string. |
contentType | "linkedin.feed.mentions" | yes |