Update threads in bulk
Apply one patch to up to 100 threads. The batch counts as a single write against the rate limit and reports per-thread rejects in failed. Requires the threads:write scope.
curl -X POST "https://productlane.com/api/v2/threads/bulk-update" \
-H "Authorization: Bearer $PRODUCTLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"string"
]
}'Authorization
AuthorizationstringheaderrequiredBearer authentication header of the form
Bearer <token>, where<token>is your auth token.
Body
external_idsstring[]Caller-owned identifiers. Replaces the full set.
textstringtitlestring | nullpain_levelenum<string>One of:UNKNOWNLOWMEDIUMHIGHassignee_idstring | nullWorkspace user id. Pass
nullto unassign.contact_idstringcompany_idstring | nullPass
nullto detach. Also propagates onto the thread's contact.tag_idsstring[]Replaces the thread's full tag set.
project_idstring | nullstatusenum<string>When
snoozed,snoozed_untilis required.One of:opensnoozeddonesnoozed_untilstring<date-time>closed_loopbooleanWith
status=done, marks the thread as fully closed.ai_draft_htmlstring | nullHTML body prefilled into the composer for the next outbound reply. Setting this stamps
ai_draft_generated_atand clearsai_draft_started_at+ai_draft_error_at. Passnull(or an empty string) to clear the draft.ai_draft_sourcesany[] | nullSources the AI consulted while generating the draft. Surfaces in the composer's "Drafted by AI" tooltip. Shape:
{ type, title, identifier?, url? }[]. Passnullto clear.clear_ai_draft_errorbooleanWhen
true, clearsai_draft_error_at. Use this to dismiss a stuck error pill in the composer without writing a new draft.notifyobjectSide-channel notifications to fire alongside the write (Slack and/or email).
idsstring[]requiredThread ids, at most 100. The whole batch counts as one write against the rate limit.
Response
Successful response
updatedstring[]requiredfailedobject[]required
{
"updated": [
"string"
],
"failed": [
{
"id": "string",
"code": "string",
"message": "string"
}
]
}