API Changelog and Deprecation Ledger
This page records externally relevant REST and MCP contract changes. Dates are deployment or documentation publication dates, not announcement estimates.
Upcoming
2026-08-25 — scheduledTime strict-mode ramp
- Affected surface: REST
create-postandupdate-post, plus MCP tools that schedule through them. - Tag: Potentially breaking, configuration-dependent.
- Change: A
scheduledTimeat least five minutes in the past is scheduled to return400 SCHEDULED_TIME_IN_PASTstarting on 2026-08-25. This calendar behavior applies only when production configuration does not explicitly override it withSCHEDULED_TIME_STRICT; an explicit flag wins in either direction. - Migration action: Always send a future ISO 8601 UTC time. During the warn-first period, inspect
warnings[].code === "SCHEDULED_TIME_COERCED"and the returnedscheduledTimeto find callers that need correction.
2026-10-15
Post-log retention — publora.com #663
- Affected surface:
GET /api/v1/post-logs/:postGroupId. - Tag: Potentially breaking retention change.
- Change: Responses include events from the last 90 days by event
createdAt, oldest first, limited to 100 entries. Old diagnostic events expire asynchronously; post groups and published post history remain available. - Migration action: Handle HTTP 200 with
success: trueandlogs: []for an owned group without recent events. Events older than 90 days are no longer returned; store diagnostic events on your side if your integration requires a longer history. Ownership and 404 behavior are unchanged. See Post logs.
2026-10-02
Publish Now — publora.com #608, #610
- Affected surface: personal REST
create-postandupdate-post; MCPcreate_postandupdate_post;GET /account-contextand MCPaccount_contextqueue counts. - Tag: Additive.
- Change:
publishNow: truepublishes immediately at server time. It uses the monthly post allowance (POST_LIMIT_REACHEDstill applies) but takes no slot in the scheduled-post queue and ignores the schedule horizon. Combining it with a futurescheduledTimeorstatus: "draft"returns400 PUBLISH_NOW_CONFLICT; a non-boolean value returns400 INVALID_PUBLISH_NOW. Moving a scheduled post to Publish Now frees its queue slot and keeps its monthly reservation. AscheduledTimewithin a few seconds of server time is still treated as immediate for existing clients. - Docs:
GET /account-context, released with publora.com #589 on 2026-10-01, now has its own REST reference page and OpenAPI entry. - Migration action: None. New integrations should send
publishNow: trueinstead of a currentscheduledTime. See Publish now.
2026-10-01
YouTube granted scopes — publora.com #490
- Affected surface: REST
POST /test-connection/{platformId}, YouTube only. Released in backend PR #590 on 2026-10-01. - Tag: Potentially breaking permission values, with an additive
permissionsKnownfield. - Change:
permissionsreturns Google's recorded full scope URIs, such ashttps://www.googleapis.com/auth/youtube, instead of the fixed shortyoutube.uploadandyoutube.readonlylist. A broad grant is not expanded into narrower grants. Connections without recorded scopes returnpermissions: []withpermissionsKnown: false. - Migration action: Handle
permissionsKnown: falseas unknown; recognize broadyoutubeaccess when checking capabilities. Do not require the old short scope labels or treat an unknown empty list as denied access. See YouTube connection diagnostics.
account_context MCP tool — publora.com #589
- Affected surface: New MCP tool
account_context, which brings the personal MCP toolset from 19 to 20 tools. It reads the new REST endpointGET /api/v1/account-contextwith the same API key. - Tag: Additive.
- Changes:
account_contextis read-only. It returns the plan, available features, publishing quotas (monthly platform posts, scheduled posts, connected channels), the schedule horizon withmaxScheduledDate, andallowedPlatformsfor the personal account behind the key. Quotas count platform posts,limit: nullmeans unlimited, and a per-connection monthly limit (scope: "connection") is broken down inquotas.monthlyPosts.connections[].- The optional
scheduledTime(ISO 8601 withZor an offset) selects the monthly quota period of a planned batch. A past time resolves to the current period, andeffectiveQuotaTimeshows the date used. A malformed value returns400 INVALID_SCHEDULED_TIMEfrom the REST endpoint; the MCP tool rejects it before calling the API. - The response is an advisory snapshot (
advisory: true): it reserves nothing, and every write is still checked against the limits.
- Migration action: None. Optionally, call
account_contextbefore a batch of posts and after a quota or feature error. See account_context.
2026-09-30
connectionStatus on connections — publora.com #526
- Affected surface: REST
GET /platform-connections; MCPlist_connections. - Tag: Additive. The field has been returned since publora.com #526 was merged on 2026-09-25, and is documented from 2026-09-30.
- Changes:
- Each connection carries
connectionStatus:activeorreconnect_required, Publora's verdict on whether it can publish with the connection now. It is computed from stored data (reconnect flags, stored credentials, access-token expiry) without calling the platform. SeeconnectionStatusandtokenStatus. - It differs from
tokenStatusin two systematic cases. Telegram connections store no expiry date and are never flagged, sotokenStatusis alwaysunknownwhileconnectionStatusisactive. An X or YouTube account reported suspended isreconnect_requiredwhile itstokenStatusstaysvalid. - Documentation corrections, no behavior change:
displayNameandprofileImageUrlcan benull, andsubscriptionType(X only:None,Basic,Premium,PremiumPlus, re-checked when publishing to X at most once a day) is now in the OpenAPI schema.
- Each connection carries
- Migration action: Prompt a reconnect on
connectionStatus: "reconnect_required"instead oftokenStatus: "expired", and keep usingtokenStatus: "expiring_soon"for advance warnings. Clients generated from the OpenAPI spec should treatdisplayNameandprofileImageUrlas nullable.
2026-09-29
Ordered first comments and Agency first comment — publora.com #537, #538, #552
- Affected surface: personal REST
create-post,update-post,get-post; MCPcreate_post,update_post,get_post; Agency Company post save and detail routes and MCP tools. - Tag: Additive.
- Change: Personal posts accept
firstComments[]with up to three ordered{text, platforms?, delaySeconds?}items. Delay is 0–86,400 seconds and delivery runs on scheduler ticks. A later comment waits for the previous one to post; failure stops the sequence.firstComments: nullor[]clears it on update. Supplying bothfirstCommentandfirstCommentsreturns400 FIRST_COMMENT_INVALID. - Read contract:
get-post/get_postreturn groupfirstComments[]and per-targetfirstCommentResults[]. ExistingfirstComment/firstCommentResultfields remain aliases for item 0; old documents read as a one-element array. - Agency: Company draft save accepts one
firstComment; Company post detail returns its per-target result. Multiple comments and delays remain personal-only. See the Agency first comment guide. - Migration action: none for clients using the single-comment fields.
Telegram: private channels over a bot connection — publora.com #570
- Affected surface: Telegram bot connections (dashboard and client connection pages); REST
GET /platform-connectionsandPOST /test-connection/{platformId}; MCPlist_connections. - Tag: Additive; potentially breaking for clients that assume
usernameis always a string. Behavioral change fortest-connection: a Telegram bot connection whose token still works can now returnerrorwhere it returnedok, and its message strings changed. - Changes:
- The channel field accepts a public channel's
@usernameort.me/username, and for a private channel its-100…chat ID or at.me/c/…link to any of its messages. Invite links (t.me/+…,t.me/joinchat/…) are rejected with guidance, because the Bot API cannot identify a channel from them. See Telegram. - A channel without a public username is saved with
username: null, anddisplayNameholds the channel title.GET /platform-connections,test-connectionandlist_connectionsreturn thatnull. The platform ID comes from the chat ID, as for any bot connection, for exampletelegram--1001234567890. test-connectionon a Telegram bot connection now also checks that the bot can read the channel and is an administrator allowed to post, not only that the token works. A passing check returnsBot can post to <channel title>instead ofConnected as @<bot username>; the new failure messages includeChannel is unavailableandBot needs channel administrator posting rights, and Telegram API errors from the new channel checks (for example, a bot removed from a private channel) returnRequest failed with status code <code>. MTProto connections now fail withInvalid bot connectioninstead ofInvalid bot token. See Test Connection.
- The channel field accepts a public channel's
- Migration action: Treat
usernameas nullable and label connections bydisplayNamewhen it isnull. Keep targeting posts byplatformId. If you gate scheduling ontest-connection, a Telegram connection that now returnserrorneeds its bot's administrator posting rights restored in Telegram.
Media URL errors: hosts that resolve to private addresses report MEDIA_URL_BLOCKED_HOST — publora.com #565
- Affected surface: REST
create-postandupdate-post(mediaUrls) andPOST /attach-media/{postGroupId}; MCPcreate_post,update_postandattach_media. - Tag: Fix.
- Change: When a media URL's host, or a redirect target, resolves to a private or reserved address,
mediaResults[].codeis nowMEDIA_URL_BLOCKED_HOST. It was reported asMEDIA_URL_FETCH_FAILEDbefore. The download was refused then and still is; only the code and message change. A DNS lookup that fails is still reported asMEDIA_URL_FETCH_FAILED, whether the domain does not exist or the host has no A or AAAA records. SeemediaUrlsper-URL codes. - Migration action: Clients that treated
MEDIA_URL_FETCH_FAILEDas retryable for such hosts should not retryMEDIA_URL_BLOCKED_HOST; it needs a publicly reachable URL.
2026-09-28
ChatGPT file attachments — publora.com #539
- Affected surface: New REST endpoint
POST /attach-media/{postGroupId}and new MCP toolattach_media, which brings the personal MCP toolset from 18 to 19 tools. The existingmediaUrlsand presigned-upload flows are unchanged. - Tag: Additive.
- Changes:
attach_mediadeclares_meta["openai/fileParams"]: ["file"], so ChatGPT passes a file from the conversation as{ download_url, file_id, mime_type?, file_name? }. Images ChatGPT generates can be attached when the client exposes them as file references. Theopenai/fileParamsdeclaration is included in authenticatedtools/list, in unauthenticated discovery and in the server card.- The endpoint accepts only
{ file, fileName? }. It downloads the file right away through themediaUrlspipeline (images up to 25 MB, videos up to 150 MB, type detected from the bytes, then probed) and attaches it asready. It always leaves the post indraft, so a scheduled post is demoted (without apost.demotedwebhook), and it never publishes. The optionalfileName(1–255 characters, cleaned to a safe name) becomesmedia[].sourceFileName. Without it, the name comes fromfile.file_name, or ischatgpt-mediawhen that is absent. Idempotency-Keymatches on the post ID,file_idand file name, not the expiringdownload_url, so a retry with a refreshed URL replays the first result instead of attaching the file twice. The MCP tool sends a stable key by default. A failed download frees the key.- New top-level 400 code
INVALID_MEDIA_FILEfor any other body field, a malformed file object, adownload_urlthat fails the static URL checks, or an invalid file name.
- Migration action: None for existing callers. ChatGPT users who already added the Publora connector should refresh its tool list so
attach_mediaappears.
First comment for LinkedIn company Pages — publora.com #533, #534
- Affected surface: REST
create-post,update-post,get-post; MCPcreate_post,update_post,get_post— LinkedIn targets only. - Tag: Additive.
- Change: A LinkedIn company Page connection now gets the first comment too, posted as the organization (
urn:li:organization:<id>), the way its posts are published. Before this change, Page targets were recorded asskippedwithskipReason: "unsupported_account_type"; that reason now only remains on results recorded before the change. - Migration action: none.
First comment (wave 1) — publora.com #529, #530
- Affected surface: REST
create-post,update-postandget-post; MCPcreate_post,update_postandget_post. - Tag: Additive.
- Changes:
- New optional top-level
firstComment { text, platforms? }on create and update: a text comment posted under the account's own post right after it publishes.platformsare platform types (never connection IDs); omitted = every supported target. Wave 1 platforms: LinkedIn member profiles (company Pages followed in publora.com #534), X, Threads, Bluesky, Mastodon. - Length is validated per applicable platform (X 280 / 25,000 Premium-only, LinkedIn 1,250, Threads 500 code points, Bluesky 300 graphemes and 3,000 bytes, Mastodon 500 with links = 23) with an absolute cap of 25,000. New 400 codes
FIRST_COMMENT_INVALID,FIRST_COMMENT_PLATFORM_UNKNOWN,FIRST_COMMENT_TOO_LONG; new warningsFIRST_COMMENT_PLATFORM_NOT_TARGETED,FIRST_COMMENT_UNSUPPORTED_PLATFORMS. get-post/get_postreturn the storedfirstComment(ornull) and a per-targetposts[].firstCommentResult(pending | posted | failed | skipped,commentId,skipReason,attemptedAt,postedAt,errorwithoutcomeUnknown). The comment is attempted once, right after publish, and never retried; a failed comment never changes the published post.- On
update-post,firstComment: nullremoves the comment; changing only the time leaves it untouched; the stored comment is re-validated whenplatformschange.
- New optional top-level
- Migration action: none. Clients that mirror
get-postresponses should tolerate the two new keys.
2026-09-24
LinkedIn image-only comments
- Affected surface: REST
POST /linkedin-commentsand MCPlinkedin_create_comment. - Tag: Additive validation change.
- Change:
messageremains a required string, butmessage: ""with a validimageUrlis accepted for personal and organization comments. Text and image URLs are trimmed. Blank text without an image still returns HTTP 400, now withmessage cannot be empty without imageUrl. No placeholder text is inserted; failed image validation or upload prevents publication. - Migration action: Callers can send an empty string with
imageUrlinstead of padding image-only comments with text. Existing text comments are unchanged.
2026-09-14
Threads multi-part chains — publora.com #472, #474
- Affected surface: REST
create-post,update-postandget-post; MCPcreate_post,update_postandget_post;GET /platform-limits. - Tag: Additive, with one behaviour change for over-limit Threads content.
- Changes:
- Meta Threads now supports multi-part chains.
platforms.threads.requirements.supportsThreadinginGET /platform-limitsistrue; it wasfalse. - Threads content over 500 characters is no longer rejected. It is accepted and split into a chain instead of being rejected with
CONTENT_TOO_LONGinvalidation.errors[]. A successful request carries novalidationobject, so there is nothing new to read on success — the split is simply performed. A standalone---line, or a complete[n/m]marker set, splits the content explicitly; automatically derived parts get a(1/N)suffix, explicit ones are published verbatim. Media attach to the first part only. get-postposts[]entries gainedisThread(boolean) andthreadParts(array). Both are always present —falseand[]for a non-chain target. Each part carriesindex(zero-based),content,status(pending,published,failed) andpublishedId(nulluntil confirmed).postedIdis the first part's ID.list-postsdoes not include these fields. The same fields reach MCP throughget_post, which passes the REST body through unchanged. They are populated for X/Twitter chains as well as Threads.- Scheduling a Threads chain requires the connection to have granted
threads_manage_replies. The grant is checked at scheduling (from a per-connection cache up to five minutes old) and re-checked against Meta immediately before publishing: a missing grant returns400withTHREADS_PERMISSION_REQUIREDinvalidation.errors[]and nothing is published. A failure of the permission lookup itself returns503with{ "code": "THREADS_PERMISSIONS_UNAVAILABLE", "error": … }and novalidationobject — that one never means reconnect.GET /platform-connectionsdoes not report granted scopes, so the grant cannot be pre-checked. - New publish-time codes in
posts[].error.code:THREADS_INVALID_THREAD_PART, andTHREAD_PARTIALLY_PUBLISHED/PUBLISH_OUTCOME_UNKNOWNnow reachable for Threads. A chain with published parts is never republished from the beginning. - The error message
"Multi-part threads (nested replies) are temporarily blocked while we wait for Meta to approve additional permissions for our app."no longer occurs.
- Meta Threads now supports multi-part chains.
- Migration action: If your client special-cased Threads by truncating text at 500 characters or by treating over-limit content as a hard error, that workaround is now unnecessary. After a partial or unknown publication, read
threadPartsand publish only the missing parts — do not resubmit the post.
2026-09-08
Mastodon and Bluesky statistics — publora.com #460
- Affected surface: New REST endpoints
POST /post-statisticsandPOST /profile-statistics, and new MCP toolspost_statsandprofile_stats. Nothing existing changes shape. - Tag: Additive.
- Changes:
POST /post-statisticstakes{ posts: [{ platform, platformId, postedId }] }(1–50 entries,mastodonandbluesky, both platforms may be mixed in one request) and returnsstatskeyed bypostedId. Each value is a metric object —reactions,comments,reposts,quotes,saves,impressions,reach,clicks— ornull. Every key is always present; a metric the platform does not expose isnull, never0.POST /profile-statisticstakes{ platform, platformId }and returnsprofile(followers,following,posts) withcachedandfetchedAt, or404when the connection is not the caller's.platformIdis accepted with or without the<platform>-prefix returned byGET /platform-connections.- Per-connection problems do not fail the request:
post-statisticsreports them in anissuesobject keyed by connection ID (CONNECTION_NOT_FOUND,AUTH_REVOKED,FORBIDDEN,RATE_LIMITED,FETCH_FAILED), andprofile-statisticsreports them inunavailableandrateLimited. - Both endpoints, and both MCP tools, are gated by the analytics plan feature that already gated the LinkedIn analytics endpoints; a plan without it receives
403 ANALYTICS_PLAN_REQUIRED. A request that exceeds its 90-second budget returns504 ANALYTICS_REQUEST_TIMEOUT. - Values are fetched from the platform on request and cached for about 2 hours. Nothing is collected in the background, so there is no history — only the counters as they stand when you ask.
- Known limitation: only posts Publora published for you and stored a platform post ID for can be queried. Publora began storing
postedIdfor Mastodon and Bluesky on 2026-09-07; posts published before that have nopostedIdand are answerednull. For a thread, only the root part is addressable. - Migration action: None. New capability.
2026-08-27
Native Zapier app (beta)
- Affected surface: No REST or MCP contract change. Publora now has a native app on Zapier (beta, v1.2.0), built on the public API and webhooks: instant triggers New Published Post and New Scheduled Post, actions Create Post, Update Post and Delete Post, and searches Find Connected Account and Find Posts.
- Tag: Additive.
- Change: The Zapier guide was rewritten for the native app. It previously documented a workaround through Webhooks by Zapier; that approach still works and stays documented on the same page for endpoints the app does not expose.
- Migration action: None. Existing Webhooks-by-Zapier Zaps keep working; the native app is the recommended path for new Zaps.
2026-08-24
Connection health reporting corrected — publora.com #407
- Affected surface: REST
GET /platform-connectionsand the MCPlist_connectionstool, which passes that response through unchanged.test-connectionreports the same corrected expiry. - Tag: Behavioral correction. No request shape changes, no field is added or removed; two response fields now report different — and correct — values for some connections.
- Changes:
accessTokenExpiresAtnow carries the effective credential expiry, the same valuetokenStatusandtokenExpiresInare derived from, instead of the raw stored access-token timestamp. For YouTube it is now alwaysnull: the access token is refreshed on demand before each publish, and Google publishes no refresh-token lifetime, so no authoritative date exists. TikTok continues to report its real refresh-token expiry; every other platform is unchanged.- Previously, healthy YouTube and TikTok connections returned a timestamp already in the past alongside
tokenStatus: "valid". Clients that compared that date against the current time concluded the connection was dead and prompted users to reconnect working channels. tokenStatusnow returnsexpiredfor any connection Publora has flagged for reconnection after the platform rejected its credential — including on platforms that never expire on a schedule, where such a connection previously reportedvalid. In that caseaccessTokenExpiresAtmay benullor still in the future.
- Migration action: Decide about reconnecting from
tokenStatus, not by comparingaccessTokenExpiresAtagainst the clock. Treatexpiredas "prompt the user to reconnect" andexpiring_soonas "warn". Treat anullexpiry as "no scheduled expiry", never as a problem. The examples on the endpoint, guide and MCP pages were rewritten accordingly; code copied from earlier versions of those examples should be updated.
X replies and quote posts — publora.com #405
- Affected surface: REST
create-postandupdate-post, the MCPcreate_postandupdate_posttools, and theposts[].error.codereported byGET /get-postand thepost.failedwebhook. - Tag: Additive. No existing request shape changes behavior.
- Changes:
platformSettingsaccepts a new top-leveltwitterobject with two string keys,replyToandquoteTweet. Both take a fullx.com/twitter.comstatus URL or a bare 1–19 digit post ID, and both are normalized to the numeric ID before storage, soGET /get-postechoes the ID rather than the URL you sent.replyTopublishes the post — or the head part of a thread — as a reply to the target; the remaining thread parts chain under it as before.quoteTweetapplies to the single post or the thread head only. The two fields combine with each other and with media. An empty string clears either one.- A malformed reference is rejected at intake with
400and a plainerrormessage (platformSettings.twitter.replyTo must be a tweet URL (https://x.com/user/status/123...) or a numeric tweet ID); nocodefield accompanies it. An unknown key undertwitteris still400 PLATFORM_SETTING_UNKNOWN, which is evaluated first. - Two publish-time codes were added:
X_REPLY_NOT_AUTHORIZEDwhen X refuses the reply or quote relationship, andX_TARGET_REJECTEDwhen the target is deleted, protected, or its author blocked the account. Both are permanent —retryable: false. twitteris no longer an example of a rejectedplatformSettingsplatform; the allowlist now has seven platforms.
- Restriction to know before integrating: X allows a programmatic reply or quote on self-serve API tiers only when the target post's author mentioned the connected account in that same post, quoted one of the account's posts, or the connected account authored the target. Enterprise apps are exempt. Publora cannot check that relationship at intake, so an unrelated target is accepted by
create-post/update-postand fails later at publish time. - Migration action: None for existing callers. New integrations should treat these fields as inbound-engagement and own-post tools, match on
error.coderather than message text, and not retryX_REPLY_NOT_AUTHORIZEDorX_TARGET_REJECTEDwith the same target.
2026-08-03
MCP OAuth consent no longer asks for an API key
- Affected surface: the OAuth 2.1 flow on
mcp.publora.com(Dynamic Client Registration + PKCE), used by claude.ai's custom connector, Claude Code, Codex/ChatGPT, Cursor, VS Code, Manus and other browser-capable clients. - Tag: Behavioral, non-breaking for existing credentials.
- Change: The consent step is a sign-in-and-approve page — "An application is requesting access to your Publora account", naming the account being authorized, with Approve and Cancel. It no longer asks you to paste an
sk_...key; that step was replaced when SSO login shipped on 2026-07-27, and the wording was finalized on 2026-08-03. On approval Publora mints a dedicated API key for that client registration, namedMCP (<client> #<id>), and returns it as the access token. Static API-key headers (Authorization: Bearer sk_.../x-publora-key) are unaffected and remain the option for headless clients. - Migration action: None for connectors that already work. Re-authorizing a client mints a fresh key; per-client keys are listed and revocable on the API page in the dashboard. If you built on the old instructions and expected a key-paste page, drop that step.
2026-07-21
Editable draft and scheduled posts — publora.com #231
- Affected surface: REST
PUT /update-post/:postGroupIdand the MCPupdate_posttool. - Tag: Additive, with new stable conflict codes.
- Changes:
update-postaccepts two new optional patch fields:content(replacement base text) andplatforms(replacement target set). Omitting a field leaves the stored value unchanged.- A
contentedit rewrites every platform post to its effective text while preserving explicit per-account overrides; editing the text of a Twitter or Threads target clears its derived thread split. - A
platformsedit replaces the whole target set: dropped IDs have their platform posts deleted, added IDs are validated for ownership and plan entitlement, and adding a target to a scheduled post re-runs scheduling limits plus full content/media validation.[]is accepted only while the post remains a draft. - Added stable codes
POST_NOT_EDITABLE(400),POST_PUBLISH_IN_PROGRESS(409), andPOST_GROUP_VERSION_CONFLICT(409), plusINVALID_CONTENT,INVALID_PLATFORMS,INVALID_PLATFORM_CONNECTION, andINVALID_PLATFORM_ID(400). The pre-existing"Cannot update post: post is currently in {status} status"400 now also carriescode: "POST_NOT_EDITABLE". - The success snapshot's
postGroupnow always includes the effectivecontentandplatforms. - The "at least one field" error text changed to
"At least one of status, scheduledTime, content, platforms, platformSettings, or mediaUrls must be provided". platformsarrays on bothcreate-postandupdate-postnow reject duplicate connection IDs with400 "Platforms must not contain duplicates".- MCP
update_postexposescontentandplatforms, and instructs clients to calllist_connectionsbefore changing targets.
- Migration action: No change is required for existing callers. Integrations that previously deleted and recreated a post to fix its text or targets should switch to
update-post. Match on the newcodevalues rather than message text, send anIdempotency-Keywith content/platform edits, and re-read the post withGET /get-poston a 409 instead of blind-retrying. If you relied on a repeated connection ID inplatformsbeing tolerated, de-duplicate the array.
2026-07-17
LinkedIn mentionable-people directory — publora.com #218
- Affected surface: REST and MCP.
- Tag: Additive.
- Changes: Added
GET /linkedin-mentionablesand thelinkedin_list_mentionablesMCP tool (the 15th active tool). Both list the per-user directory of native LinkedIn member ids captured automatically from engagement on connected company pages, withq/limitfiltering and a ready-to-pastementiontoken per person. Paid plans only — free plans receive403 UPGRADE_REQUIRED. - Migration action: None. New integrations that build person mentions should prefer this directory over harvesting actor URNs manually.
2026-07-15
API/MCP correctness release — publora.com #198
- Affected surface: REST create/update/get-post, webhooks, MCP sessions and tool responses.
- Tags: Breaking for unknown
platformSettingspaths; additive/behavioral for the remaining items. - Changes:
- Added Mongo-backed
Idempotency-Keyhandling to create/update. - Added the warn-first
scheduledTimeramp and structured coercion/rejection codes. - Unknown
platformSettingspaths now return400 PLATFORM_SETTING_UNKNOWN; they are no longer silently discarded. - Added MCP session admission checks and more robust MCP response parsing.
- Publication identity now flows through get-post and
post.published, includingplatformId,postedId, and nullablepermalink.
- Added Mongo-backed
- Migration action: Remove unknown settings before retrying; add idempotency keys to retryable create/update workflows; read publication identity from documented fields; audit past-time warnings before strict mode.
LinkedIn repost/reshare — publora.com #194
- Affected surface: REST, MCP, and scheduled LinkedIn publishing.
- Tag: Additive.
- Changes: Added
POST /linkedin-reshare, thelinkedin_create_reshareMCP tool (the 14th active tool), andplatformSettings.linkedinwithrepostEnabled,repostParentUrn, andrepostVisibilityas the sixth accepted settings branch. - Migration action: No change is required for existing callers. New integrations should use a
urn:li:share:*orurn:li:ugcPost:*parent.CONNECTIONSvisibility is personal-profile-only; usePUBLICfor company-page reposts.
Correctness-release documentation — publora-api-docs #21
- Affected surface: Public API, MCP, webhook, and OpenAPI documentation.
- Tag: Documentation.
- Change: Published the idempotency, scheduled-time, strict-settings, MCP-draft, and publication-identity contract introduced by the correctness release.
- Migration action: Compare existing integrations with the updated create/update, get-post, webhook, and MCP reference pages; no separate runtime change was introduced by the docs release.
Deprecation policy
No additional public API deprecations are currently scheduled. Future entries will identify the affected surface, breaking behavior, effective date, and migration action.