ProvidersLinkedIn

LinkedIn

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 no dm surface: member messaging has no API an approved app can use.
  • A post is identified by the urn:li:share:… or urn:li:ugcPost:… URN LinkedIn created it under, verbatim. LinkedIn's notifications name the same post by a different urn: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 PUBLIC posts, 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 the ADMINISTRATOR role. 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

LinkedIn rate-limits per app and per member per day, resetting at midnight UTC, and publishes no numbers: Development Tier is 500 calls per app and 100 per member, and Standard Tier limits appear only in your app's Developer Portal. A throttled call fails with platform_rate_limit and a retry hint at the next UTC midnight.
Content typeOperationsEventsBackfill
linkedin.feed.itemslist, get, publish, deletecreatedyes
linkedin.feed.commentslist, get, publish, deletecreated, updated, deletedno
linkedin.feed.reactionslist, get, publish, deletenoneno
linkedin.feed.mentionsnonecreatedno

linkedin.feed.items

Posts on the organization's LinkedIn Page.

list

List the Page's posts, newest created first.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
cursorstringnoOpaque cursor for fetching the next result page.
limitnumbernoMaximum number of items to return.
includeProviderRawbooleannoWhether 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.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
externalIdstringyesThe post's urn:li:share:… or urn:li:ugcPost:… URN.
includeProviderRawbooleannoWhether 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.

FieldTypeRequiredDescription
textstringnoThe post text, up to 3000 characters, published as typed.
mediaobject | object[]noOne 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.
articleobjectnoA link preview. LinkedIn shows what is given here; it does not fetch the page.
visibility"PUBLIC" | "LOGGED_IN"noWho can see the post: everyone (the default), or signed-in LinkedIn members only. Only PUBLIC posts raise LinkedIn's comment notifications.
reshareDisabledbooleannoStop members from resharing the post.
schedulingobjectnoFuture 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.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
externalIdstringyes
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 implemented
  • moderate: 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.

FieldTypeRequiredDescription
externalIdstringyesProvider-owned content identifier.
organizationExternalIdstringyes
textstringnoCaption/body text for content.
mentionsobject[]no
hashtagsstring[]no
contentobjectyes
visibilitystringnoPUBLIC, CONNECTIONS, LOGGED_IN or CONTAINER. Only PUBLIC posts raise LinkedIn's comment notifications.
lifecycleStatestringnoPUBLISHED, or PUBLISH_REQUESTED while LinkedIn processes it, PUBLISH_FAILED, DRAFT.
reshareDisabledbooleanno
permalinkstringno
publishedAtstring (date-time)noProvider publish timestamp as an ISO-8601 string.
updatedAtstring (date-time)noProvider update timestamp as an ISO-8601 string.
providerRawunknownnoOptional 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.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
mediaExternalIdstringyesThe post's urn:li:share:… or urn:li:ugcPost:… URN.
parentExternalIdstringnoA comment URN on that post, to list its replies.
cursorstringnoOpaque cursor for fetching the next result page.
limitnumbernoMaximum number of items to return.
includeProviderRawbooleannoWhether 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.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
externalIdstringyesThe comment URN, urn:li:comment:({thread},{id}).
mediaExternalIdstringnoThe post's URN, echoed on the result; LinkedIn's comment read does not return it.
includeProviderRawbooleannoWhether 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.

FieldTypeRequiredDescription
targetobjectyesThe provider content this publish targets, identified as events identify it.
textstringyesThe 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.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
externalIdstringyes
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 implemented
  • moderate: 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

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.

FieldTypeRequiredDescription
externalIdstringyesProvider-owned content identifier.
commentIdstringyes
threadUrnstringyes
mediaExternalIdstringno
textstringnoCaption/body text for content.
mentionsobject[]no
mediaobject[]no
authorobjectnoProvider actor reference for observed content.
ownerAuthoredbooleanno
threadobjectnoParent/root identifiers for threaded contexts.
engagementobjectnoProvider-reported engagement counts.
publishedAtstring (date-time)noProvider publish timestamp as an ISO-8601 string.
updatedAtstring (date-time)noProvider update timestamp as an ISO-8601 string.
providerRawunknownnoOptional 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.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
entityExternalIdstringyesA post URN or a comment URN.
cursorstringnoOpaque cursor for fetching the next result page.
limitnumbernoMaximum number of items to return.
includeProviderRawbooleannoWhether 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.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
externalIdstringyesThe reaction URN, urn:li:reaction:({actor},{entity}).
includeProviderRawbooleannoWhether 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.

FieldTypeRequiredDescription
targetobjectyesThe provider content this publish targets, identified as events identify it.
reactionType"LIKE" | "PRAISE" | "EMPATHY" | "INTEREST" | "APPRECIATION" | "ENTERTAINMENT"yesLIKE, 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.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
externalIdstringyes
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.

FieldTypeRequiredDescription
externalIdstringyesProvider-owned content identifier.
entityExternalIdstringyes
reactionTypestringyesOne of LinkedIn's reaction types, passed through as LinkedIn reports it.
authorobjectnoProvider actor reference for observed content.
ownerAuthoredbooleanno
publishedAtstring (date-time)noProvider publish timestamp as an ISO-8601 string.
providerRawunknownnoOptional 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 applicable
  • moderate: provider not supported
  • delete: 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.

FieldTypeRequiredDescription
externalIdstringyesProvider-owned content identifier.
mentionedIn"post" | "comment"yes
organizationExternalIdstringyes
activityUrnstringno
textstringnoCaption/body text for content.
authorobjectnoProvider actor reference for observed content.
permalinkstringno
publishedAtstring (date-time)noProvider publish timestamp as an ISO-8601 string.
contentType"linkedin.feed.mentions"yes

On this page