Create or replay a ticket for one Context Capture report
const url = 'https://example.com/api/integrations/context-capture/v1/tickets';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"externalReportId":"example","title":"example","description":"example","projectId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","priority":"low","attachments":[{"kind":"screenshot","url":"https://example.com","contentType":"image/png"}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/api/integrations/context-capture/v1/tickets \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "externalReportId": "example", "title": "example", "description": "example", "projectId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "priority": "low", "attachments": [ { "kind": "screenshot", "url": "https://example.com", "contentType": "image/png" } ] }'Private integration endpoint. A project-bound ah_cc credential files
into its own project and ignores projectId. An account-scoped
credential requires projectId, which must belong to the credential’s
billing account.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”object
Target project. Required for an account-scoped credential and ignored by a project-bound one.
Reporter-chosen severity. Filed at medium when absent.
Files captured with the report. AppHandoff fetches each one server-side at create time (https only, 10 s, 5 MB, image/*) and keeps its own copy as a ticket attachment, so the copy outlives the share link. A copy that cannot be fetched is skipped; the ticket is still created.
object
Example
image/pngResponses
Section titled “ Responses ”Existing linked ticket
object
How the ticket was actually resolved, so a customer-facing status can say “merged into HO-n” or “closed, not built” instead of “Resolved”. Every closed ticket lands in stage live regardless of outcome, so stage alone cannot tell a shipped fix from a duplicate/cancelled/wont_fix close. Null on an open ticket, and null on a closed ticket that carries neither a stored resolution nor a merge — absence means “closed, nothing proven”, never “completed”.
For a duplicate close, the ticket that survived (e.g. HO-11216). Best-effort: no stored duplicate link type exists yet, so this is parsed from the free-prose resolution note and is absent when the note names no ticket. Absent on every non-duplicate resolution.
Ticket created
object
How the ticket was actually resolved, so a customer-facing status can say “merged into HO-n” or “closed, not built” instead of “Resolved”. Every closed ticket lands in stage live regardless of outcome, so stage alone cannot tell a shipped fix from a duplicate/cancelled/wont_fix close. Null on an open ticket, and null on a closed ticket that carries neither a stored resolution nor a merge — absence means “closed, nothing proven”, never “completed”.
For a duplicate close, the ticket that survived (e.g. HO-11216). Best-effort: no stored duplicate link type exists yet, so this is parsed from the free-prose resolution note and is absent when the note names no ticket. Absent on every non-duplicate resolution.
Not authenticated
object
Human-readable error message
Stable machine-readable error code for client branching
First validation message per field path
object
Structured validation issues (Zod)
object
Seconds until rate limit resets (429 responses)
True if re-linking GitHub may fix the issue
Invalid request
object
Human-readable error message
Stable machine-readable error code for client branching
First validation message per field path
object
Structured validation issues (Zod)
object
Seconds until rate limit resets (429 responses)
Rate limited