修改内容
修改一条既有内容并决定落点(规则同新建)。只有草稿、被退回、已排期的内容可改;待审内容被锁定,已发布内容不可改。省略 media / targetAccountIds 即保留原值,传空数组才是清空 / 改回全部账号。
/api/v1/posts/{postId}鉴权与护栏
- 请求头
Authorization: Bearer <长期凭证>,凭证在设置页「接入外部系统 → 长期凭证」签发,见 鉴权与权限。 - 凭证需带 scope
posts:write/schedule:write/publish:execute(任一即可调用;具体能用哪一档由凭证的发布落点白名单决定);签发者在工作区里的角色也要允许该动作。 - 限流:写档每分钟 10 次;
action: "publish"时按发布档计,每分钟 5 次(均按凭证计)。 - 幂等:draft / schedule 档可选,
action: "publish"时必须带Idempotency-Key。
路径参数
postIdstring必填内容 id。
请求体(application/json)
actionenum: draft · schedule · publish必填落点档位,含义同新建;决定这次修改之后内容停在哪一档。
contentstring必填主文案;每个目标渠道都在 variants 里给了自己的文案时可留空字符串。
platformsstring[] (enum: x · youtube · instagram · tiktok · facebook · threads · douyin · xiaohongshu · wechat_mp)必填目标平台。
titlestring可选标题(YouTube 必填)。
targetAccountIdsstring[]可选省略 = 保留原有选号;传了就整组替换;传空数组 = 改回「全部可用账号」。
scheduledAtdatetime (ISO 8601, with timezone)可选schedule 档必填,必须带时区(Z 或 ±HH:MM)且至少比现在晚 60 秒;draft 档给了只作日历上的计划日期。
mediaobject[] { kind, dataUrl, platform?, durationSec? }可选省略 = 保留原有媒体,空数组 = 清空。kind 为 image / cover / video;dataUrl 必须是本站对象存储 URL(先用 POST /v1/media 换取),图片 / 封面也可用 image data URL;platform 表示只给某平台用的覆写媒体。
variantsobject[] { platform, content?, title? }可选逐平台文案覆写;只传与主文案不同的。
tiktokOptionsobject可选省略 = 保留原有设置;null = 清空。TikTok Direct Post 合规选项:privacyLevel(发 TikTok 时必须由人选定)、allowComment、allowDuet、allowStitch、commercial、yourBrand、brandedContent、coverTimestampMs。
youtubeOptionsobject { categoryId?, madeForKids?, playlistId? }可选省略 = 保留原有设置;null = 清空。YouTube 分类、「面向儿童」标记,以及发布成功后把视频加入的播放列表 id(须属于目标频道;稍后观看等系统列表不可用;加入失败不影响发布)。
threadsOptionsobject { replyControl?, topicTag?, linkAttachment?, replyApprovals? }可选省略 = 保留原有设置;null = 清空。Threads 发布选项:replyControl 谁可以回复(everyone / followers_only / accounts_you_follow / mentioned_only / parent_post_author_only,缺省所有人);topicTag 话题标签(1–50 字,不能含 . 与 &);linkAttachment 链接卡片(http(s) 链接,只对纯文字帖生效,计入每帖 5 个链接的上限);replyApprovals 回复审批(true = 别人的回复要作者批准才公开,缺省关)。
clientRequestIdstring可选幂等键(8–128 chars of [A-Za-z0-9_.:-]);推荐放在 Idempotency-Key 请求头,头与 body 都给时以头为准。publish 档必填。
响应
成功返回 HTTP 200,信封为 { data, meta };右侧(窄屏在本页末尾)给出了各状态码的示例。所有错误都是 { error: { code, message, params }, meta },按机器码处理而不是按 message 匹配,码表见 错误码。
| 状态码 | 可能的错误码 |
|---|---|
| 400 | invalid_input |
| 401 | unauthenticated |
| 402 | plan_limit |
| 403 | forbidden / workspace_not_found |
| 404 | not_found |
| 409 | no_account / needs_reauth / replay |
| 429 | rate_limited |
| 500 | internal |
| 502 | platform_error |
| 503 | external_writes_off |
示例
curl -X PATCH "https://popkit.loxily.com/api/v1/posts/pst_01J8ZK3R7QW6M2" \
-H "Authorization: Bearer popkit_it_••••••••" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: acme-2026-09-21-001" \
-d '{
"action": "schedule",
"content": "文案改了一版 ✨",
"platforms": [
"x",
"instagram"
],
"scheduledAt": "2026-09-22T09:30:00+08:00"
}'{
"data": {
"postId": "pst_01J8ZK3R7QW6M2",
"status": "scheduled",
"scheduledAt": "2026-09-21T10:00:00.000Z",
"deepLink": "https://popkit.loxily.com/calendar?post=pst_01J8ZK3R7QW6M2"
},
"meta": {
"requestId": "3f9c1e2a-7d4b-4c1e-9a6f-0b2d8e5c7a11"
}
}