1. How PostEngine Reaches LinkedIn
PostEngine's servers reach LinkedIn only through LinkedIn's official REST API, with the permissions each member grants. They do not engage in:
- Web scraping or screen scraping of LinkedIn pages from our servers
- Automated browsing or headless browser interactions with LinkedIn
- Reverse engineering of LinkedIn's private APIs or protocols
- Circumventing LinkedIn's authentication or rate-limiting mechanisms
PostEngine also offers an optional browser extension on paid plans, which each member installs and switches on themselves. It runs only in that member's own browser. On the LinkedIn page the member has open, it reads the posts shown there, and it sends PostEngine only the posts whose authors are on the workspace's engagement list, without their text (each post's link, author and counts), so they appear in that workspace's engagement queue as reminders. Every other post stays in the member's browser, unless the extension had already sent it while its author was on the list, or the member asks for a comment on it: when the member opens a post's comment or reply box and presses the extension's keyboard shortcut, clicks its toolbar icon or chooses its item in the box's right-click menu, the extension sends that one post's text and author (and, for a reply, the comment being answered) so that PostEngine can draft comments in the member's voice. When the member opens the extension's panel while writing in LinkedIn's post box, it reads that draft and sends it only when the member presses one of the panel's post-check buttons; it can put an opening or a version the member chose into that box. Its right-click item that turns selected text into a post does not work on LinkedIn's pages. The extension adds nothing to LinkedIn's page, does not open, scroll or load a LinkedIn page by itself, and does not post, comment or react: it can place text the member chose in the comment box or post box the member opened, and that text goes out only when the member presses LinkedIn's own button. Section 2.6 on our privacy page lists exactly what it sends.
How the browser extension follows LinkedIn's rules
LinkedIn's User Agreement (section 8.2) does not allow members to use software that overlays or otherwise changes LinkedIn's pages, or to copy other members' content except through LinkedIn's own sharing tools, and LinkedIn treats a comment as automated when no person pressed Comment. Here is what the extension does, and does not do, against each of them:
- Nothing is added to LinkedIn's page: no button, panel, badge or mark. The extension works from the browser's toolbar, its own panel and the browser's right-click menu, and it declares no web-accessible files, so a web page cannot load any of its files. The only thing it ever writes into LinkedIn's page is text the member chose, in the comment box or post box the member opened, after the member's own action there: Insert, Use this opening or Use this version, the right-click item, or, for a draft from the engagement list, a click into that comment box.
- It reads a post only when the member asks: the one post whose comment box the member opened and asked a comment for, or the member's own draft in LinkedIn's post box when the member opens its panel. The one exception is the engagement list, which the member switches on themselves: the extension then looks at the posts on the page the member is reading and sends only those by accounts on that list that the member actually saw, without their text.
- It keeps the text of no other member's post. The text of a post or comment the member asks it to answer, and the member's draft from LinkedIn's post box unless the member presses Save to PostEngine, are used to write or check, then dropped. A post by an account on the engagement list reaches PostEngine as its link, author and counts, with no text: version 1.9.0 sends none, and the text an older version still sends is discarded on arrival. What PostEngine keeps is listed in section 4 and on our privacy page; the only post text it keeps is a post the member pastes into the Engagement page themselves, deleted within a day once 7 days have passed since PostEngine first saw it.
- It copies nothing from LinkedIn into a post: its right-click item that turns selected text into a post refuses every LinkedIn page, and LinkedIn posts embedded in other sites, so another member's post is never turned into the member's own.
- The member presses every LinkedIn button. The extension never presses Comment, Post, Like, Repost, Send or Follow, and never submits a form: every comment, and every post written in LinkedIn's post box, goes out because the member read it and pressed LinkedIn's own button. Posts that PostEngine itself publishes do not go through the extension: they go out through LinkedIn's API after the member approves them in the app or, if the account owner has set the workspace's Publishing Mode to Auto Publish, on that standing instruction, as section 5 describes.
- No automation: it does not open, scroll or load LinkedIn pages by itself, does not like, react, follow, connect or send messages, and runs nothing on LinkedIn on a schedule. Behind every comment it drafts there is a person pressing Comment, which is where LinkedIn draws the line between a member's comment and an automated one.
LinkedIn does not endorse or sponsor PostEngine, and PostEngine is not affiliated with LinkedIn. This section is our account of how PostEngine applies LinkedIn's published rules, not an approval from LinkedIn.
2. OAuth Scopes & Data Minimization
We request only the minimum OAuth scopes necessary to provide the service:
- openid — Identity verification via OpenID Connect (required by LinkedIn)
- profile — Read public name, profile picture, and headline for display
- email — Read email address for account linking and notifications
- w_member_social — Publish posts to the member's own LinkedIn feed. A post goes out either after the user approves it in the app, or — if the user has set their workspace's Publishing Mode to Auto Publish — on that standing instruction.
Connecting a company page asks for the permissions below as well. PostEngine requests them only when a workspace owner chooses to connect a company page, and that option opens only after LinkedIn approves PostEngine for its Community Management API.
- w_organization_social — Publish posts to the connected company page, as the page. A page post follows the same rules as a post on your own profile: it goes out after you approve it in the app, or on your Auto Publish instruction if you turned Auto Publish on.
- r_organization_social — Read the company page's own recent posts, to confirm whether a post whose publishing was interrupted already reached the page, so that one post does not go out twice.
- rw_organization_admin — Read the totals LinkedIn reports for posts PostEngine published on the page: impressions, unique impressions, clicks, likes, comments and shares. LinkedIn grants this permission only to administrators of the page. PostEngine does not use it to change the page's settings.
We never request scopes beyond what is needed. If LinkedIn grants additional scopes, we do not access data beyond our declared purpose.
3. Rate Limit Compliance
PostEngine implements comprehensive rate-limit compliance:
- We honor LinkedIn's Retry-After header: on a 429 or 503 the retry happens at the exact time LinkedIn asks for, on every queue that calls the API — publishing, analytics sync, comment sync and auto-replies. We also read the X-RateLimit-* headers on every response, store them per account, and act on them before the next call for that account: below ten percent remaining we stop the analytics and comment syncs for that account until LinkedIn's own reset time, and space publishing and replies by up to ten seconds each rather than deferring them; with nothing remaining, every call for that account waits for the reset. The same threshold raises an alert.
- Per-connection publish limits: a minimum of 30 seconds between two posts on the same LinkedIn connection, and at most 100 posts per connection per day, both enforced before the request is made. Workspace-level API budgets additionally cap publishing and commenting, so no single customer can exhaust a shared limit.
- Exponential backoff with randomised jitter on transient failures (429, 503) for every queue that talks to LinkedIn, so many workspaces hitting one limit do not all retry on the same tick. Where LinkedIn names a retry time, that time wins over the computed backoff.
- Cooldown periods between analytics reads: forty-five minutes per post, four hours per connected account, and longer backoffs — six hours, or twenty-four for a permanent refusal — after LinkedIn declines a read.
4. User Privacy Respect
We respect LinkedIn member privacy settings:
- Through the API, we access only the data the connected member has explicitly authorized via OAuth consent. The optional browser extension described in section 1 reads only what that member's own browser shows them on LinkedIn.
- We keep data about other LinkedIn members only where a feature needs it. Through the API: the text of comments left on the member's own posts and the LinkedIn identifier of each commenter, so the member can read and answer them. Through the optional browser extension described in section 1: for each post by an account on a workspace's engagement list, the author's public name and no text of the post (version 1.9.0 sends none, and the text an older version sends is discarded on arrival; text kept from before is deleted within a day once 7 days have passed since the post was first seen), the reaction and comment counts shown with it, when the extension first saw it, the time the post itself was published if a version of the extension reports one (1.9.0 does not), the post's LinkedIn identifier when the page carries one, and a fingerprint of the text so the same post is recognised when it is seen again; and for each post or comment a member asked the extension to write a comment on, the name of its author (the post's, or for a reply the comment's), the post's link or, when LinkedIn shows no identifier, its fingerprint, for a reply the comment's LinkedIn identifier, the member's own drafts, and when a draft was placed and posted. The text of that post or comment is used to write the drafts and is not kept. And what a workspace enters itself: the profile addresses on its engagement list and its Competitors list, and the names shown beside them, which the extension may update to the name the account shows on LinkedIn.
- Users can disconnect their LinkedIn account at any time. We call LinkedIn's token revocation endpoint immediately, mark the connection revoked, and detach it from every pending post. If LinkedIn refuses the revocation we tell the user the token was not revoked rather than reporting success, and record the failure on the connection; the encrypted token is kept only so the revocation can be retried, and is never used to call LinkedIn again.
- Upon account deletion, all LinkedIn-derived data is permanently deleted within 30 days
5. Content & Publishing Standards
PostEngine ensures responsible content publishing:
- Nothing is published to LinkedIn unless it is approved by the user in the app, or the user has set their workspace's Publishing Mode to Auto Publish. Auto Publish is off by default, is chosen by the account owner in Settings, can be switched off at any time, and every change to it is written to our audit log with the user and the timestamp. While it is on, drafts that pass the workspace's own quality threshold are published on that standing instruction without a per-post click. The user is notified before each of those posts goes out, and that post is held for at least 15 minutes from the moment it is scheduled; the notice names the exact time the post will reach LinkedIn, and until that time they can stop that individual post from the notification itself. If we cannot deliver that notice, we do not publish the post: it is returned to the user's drafts for review, and the withholding is written to our audit log. If the publish has already started when they press it, we say so rather than claim it was stopped, and every cancellation and every refusal is written to our audit log with the user and the timestamp.
- AI-generated content is always written to a draft first and is never posted straight from the model. In Draft Approval and Batch Approval — Draft Approval being the default — it cannot reach LinkedIn without human review. In Auto Publish it is published only after passing the workspace's own quality threshold; a draft that does not pass is never auto-published and is kept for review.
- We prohibit and actively prevent spam, fake engagement, or any content that violates LinkedIn's Professional Community Policies
- Separately, the product can draft AI replies to comments on the member's own posts. Auto-sending them is disabled platform-wide and no reply has ever been sent this way. Were it enabled, a reply would still be auto-sent only after the account owner turns on Auto-Reply, which is off by default, and only within a quality threshold, a daily cap and a per-commenter cap; everything else is held for the member to send by hand. A reply that clears those limits is held for 15 minutes from the moment it is scheduled. The member is shown its exact wording in the app before it goes out and can stop that individual reply from the notice itself. If the send has already started when they press it, we say so rather than claim it was stopped. Every auto-send, every cancellation and every refusal is written to our audit log with the user and the timestamp.
6. Data Security
We protect LinkedIn data with industry-standard security measures:
- LinkedIn OAuth access tokens and refresh tokens are encrypted at rest using AES-256-GCM
- All API communication uses TLS encryption
- Token refresh follows LinkedIn's standard OAuth 2.0 flow with secure storage
- Access to LinkedIn data is restricted to signed-in members of the workspace it belongs to. PostEngine's own operators can also see it through an internal console, to give support and keep the service secure.
7. Contact
For questions about our API usage practices, contact us at our support address.