Update an idea
Edit an existing idea; no external side effects. Omitted fields keep their current values; pass null to clear (image / plannedAt). Editors can only change ideas they created. plannedAt is neither shown nor editable on the idea board, so this endpoint is the only way to change a value written at import or create time.
/api/v1/ideas/{ideaId}Authorization & guardrails
- Send
Authorization: Bearer <credential>; credentials are issued under Settings → Integrations → Long-lived credentials, see Authentication. - The credential needs scope
ideas:write; the issuer's workspace role must also allow the action. - Rate limit: write tier, 10/min per credential; over the cap returns 429 with
Retry-After. - Idempotency: honoured when
Idempotency-Keyis present; optional otherwise.
Path parameters
ideaIdstringrequiredIdea id.
Request body (application/json)
contentstringoptionalIdea text; omit to keep it, and it must not be blank when given.
groupIdstringoptionalMove it to another group; the group must belong to this workspace.
tagsobject[] { label, color? }optionalUp to 6 hashtags; giving it replaces the whole set, an empty list clears them. They're added to the start of the post when the idea is turned into a draft, so don't use them to track progress.
imagestring (URL)optionalImage URL; null removes it.
plannedAtdatetime (ISO 8601)optionalCarried over as the draft's scheduled time when the idea is converted (editable afterwards in the composer). It never publishes on its own and is not shown on the idea board. Pass null to clear it.
targetAccountIdsstring[]optionalPre-selected target accounts; giving it replaces the whole set, an empty list clears them.
clientRequestIdstringoptionalIdempotency key (8–128 chars of [A-Za-z0-9_.:-]); prefer the Idempotency-Key header, which wins over the body.
Responses
Success is HTTP 200 with a { data, meta } envelope; examples per status are on the right (at the end of the page on narrow screens). Every error is { error: { code, message, params }, meta } — branch on the code, not the message; see Errors.
| Status | Possible codes |
|---|---|
| 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 |
Examples
curl -X PATCH "https://popkit.loxily.com/api/v1/ideas/<ideaId>" \
-H "Authorization: Bearer popkit_it_••••••••" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: acme-2026-09-21-001" \
-d '{
"plannedAt": null,
"tags": [
{
"label": "教程",
"color": "blue"
}
]
}'{
"data": {
"id": "ide_01J8ZS…",
"groupId": "idg_01J8…",
"deepLink": "https://popkit.loxily.com/planning?idea=ide_01J8ZS…"
},
"meta": {
"requestId": "6a1d0c9e-2b7f-4e3a-8c5d-1f0e9b8a7c7a"
}
}