Idea board

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.

PATCH/api/v1/ideas/{ideaId}
ideas:writewrite tierIdempotency-Key optional

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-Key is present; optional otherwise.

Path parameters

ideaIdstringrequired

Idea id.

Request body (application/json)

contentstringoptional

Idea text; omit to keep it, and it must not be blank when given.

groupIdstringoptional

Move it to another group; the group must belong to this workspace.

tagsobject[] { label, color? }optional

Up 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)optional

Image URL; null removes it.

plannedAtdatetime (ISO 8601)optional

Carried 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[]optional

Pre-selected target accounts; giving it replaces the whole set, an empty list clears them.

clientRequestIdstringoptional

Idempotency 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.

StatusPossible codes
400invalid_input
401unauthenticated
402plan_limit
403forbidden / workspace_not_found
404not_found
409no_account / needs_reauth / replay
429rate_limited
500internal
502platform_error
503external_writes_off

Examples

Request
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"
    }
  ]
}'
Response
OK
{
  "data": {
    "id": "ide_01J8ZS…",
    "groupId": "idg_01J8…",
    "deepLink": "https://popkit.loxily.com/planning?idea=ide_01J8ZS…"
  },
  "meta": {
    "requestId": "6a1d0c9e-2b7f-4e3a-8c5d-1f0e9b8a7c7a"
  }
}