Skip to main content
POST
Create LinkedIn post

Authorizations

Authorization
string
header
required

Access token issued by gtm.service.id. Its access_identity claim carries team_sid, actor_sid and actor_type, and that team scope is authoritative.

Team-SID
string
header
required

Team scope for tokens that do not carry one. Ignored when the token already names a team.

Body

application/json

Request body of create_linkedin_post.

linkedin_account_sid
string
required

LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account.

Required string length: 18
Pattern: ^ln_ac_
text
string
required

Post body, always present. Empty is legal ONLY alongside an image. 3000 is LinkedIn's own cap, refused here rather than burning a posting slot. Published byte for byte, blank lines included, and so is each image's alt_text.

Maximum string length: 3000
images
object[]

Up to 20 images (the node's own cap; array order = carousel order). Mutually exclusive with video. The decoded bytes across ALL media must stay under 35 MB in total; over that is a 422, because a bigger body is refused by the node's JSON parser as a bare 413 with no response envelope. For 2+ images the backend supplies the account's own member id to the wire itself - no profile_id field exists here. Uploads are sequential node-side, so many large images make a SLOW synchronous call: the post can publish after your client times out, so repeat it only as the same request under the same client_reference, which is answered with the post (or held while LinkedIn is read), never published twice.

Maximum array length: 20
visibility
enum<string>

ANYONE (the node default) or CONNECTIONS_ONLY. Omit to let the node apply its own default. Mutually exclusive with group_id.

Available options:
ANYONE,
CONNECTIONS_ONLY
allowed_commenters_scope
enum<string>

Who may comment: ALL (the node default), CONNECTIONS_ONLY, or NONE to disable comments. Works on group posts too.

Available options:
ALL,
CONNECTIONS_ONLY,
NONE
video
object

ONE video, image-shaped minus alt_text. Mutually exclusive with images (LinkedIn does not mix them in a share - 422 here). Shares the 35 MB media budget. The upload is a single large PUT through the browser and is SLOW: the synchronous call can outlive your client timeout while the post still publishes, so repeat it only under the same client_reference.

scheduled_at
string

Schedule the post instead of publishing now: ISO 8601 with timezone, must be in the future (a strictly-past time is a 422; within a minute of now is passed through for LinkedIn to judge). A SCHEDULED share legitimately answers with null activity_urn/url - post_urn is the handle. Read and clean the queue with get_linkedin_scheduled_posts / delete_linkedin_scheduled_post. Scheduling is LinkedIn-side: the draft lives in ITS queue, nothing is stored here. The slot is no part of a key: a retry under the same client_reference that computes a new scheduled_at is the same post. Without a key the slot tells two posts apart.

mentions
object[]

Profile mentions as READY POSITIONS over text (2026-08-21) - unlike create_linkedin_comment's {profile_id, name} search pairs. Require non-blank text.

brand_partnership
boolean

true adds LinkedIn's "Brand partnership" label (paid endorsement). false and absent both send nothing - the wire's own shape.

author_organization_id
string

Post AS a company page the account administers: the bare numeric company id (same form get_linkedin_company_posts takes). Omit to post as the member.

Pattern: ^\d+$
group_id
string

Post INTO a group: the bare numeric group id. Mutually exclusive with visibility - a group post sets container visibility, not member-feed visibility. No read serves a group's feed, so a group post whose answer was lost stays in doubt until a person gives their word.

Pattern: ^\d+$
client_reference
string | null

Your key for this ONE post (max 255, byte for byte): one key per post, the same key on every repeat of it. The key and its place (where it lands: your own feed, the company page of author_organization_id or the group of group_id) are one post whatever it says, and a repeat never goes out twice: it answers 200 with what the first send made (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another post in doubt holds the place). The same key at another place is another post. Without a key the same words and pictures or video at the same place and slot count as a repeat for an hour after they went out. check_linkedin_posting_sent asks by it.

Maximum string length: 255
confirmed_not_sent
string | null

A person's word that an earlier attempt of THIS send is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_posting_sent, given only after someone looked on LinkedIn. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another send's sid is 422 not_this_message.

Required string length: 18
Pattern: ^ln_al_
confirmed_sent
string | null

A person's word that an earlier attempt of THIS send IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent while what it made is not known (LinkedIn is read for it), or 200 with it once a read has found it. Another send's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts.

Required string length: 18
Pattern: ^ln_al_

Response

action success envelope.

success
enum<boolean>
required
Available options:
true
operation
enum<string>
required
Available options:
action
action
string
required

kebab-case verb; matches the route segment.

item
any
required
result
object
required
meta
object
required
pacing
object