Skip to content

Create or replay a ticket for one Context Capture report

POST
/integrations/context-capture/v1/tickets
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.

Media type application/json
object
externalReportId
required
string
>= 1 characters <= 200 characters
title
required
string
>= 5 characters <= 140 characters
description
required
string
>= 10 characters <= 5000 characters
projectId

Target project. Required for an account-scoped credential and ignored by a project-bound one.

string format: uuid
priority

Reporter-chosen severity. Filed at medium when absent.

string
default: medium
Allowed values: low medium high
attachments

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.

Array<object>
<= 1 items
object
kind
required
string
Allowed values: screenshot
url
required
string format: uri
<= 2048 characters
contentType
required
string
<= 100 characters
Example
image/png

Existing linked ticket

Media type application/json
object
id
required
string format: uuid
number
required
integer
>= 1
title
required
string
status
required
string
Allowed values: open closed
stage
required
string
Allowed values: backlog up_next in_progress validation live
priority
required
string
Allowed values: low medium high
revision
required
string format: date-time
updatedAt
required
string format: date-time
portalUrl
required
string format: uri
resolutionType
required

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

string | null
survivingTicketRef

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.

string | null

Ticket created

Media type application/json
object
id
required
string format: uuid
number
required
integer
>= 1
title
required
string
status
required
string
Allowed values: open closed
stage
required
string
Allowed values: backlog up_next in_progress validation live
priority
required
string
Allowed values: low medium high
revision
required
string format: date-time
updatedAt
required
string format: date-time
portalUrl
required
string format: uri
resolutionType
required

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

string | null
survivingTicketRef

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.

string | null

Not authenticated

Media type application/json
object
error
required

Human-readable error message

string
code

Stable machine-readable error code for client branching

string
fieldErrors

First validation message per field path

object
key
additional properties
string
issues

Structured validation issues (Zod)

Array<object>
object
path
required
string
message
required
string
retryAfter

Seconds until rate limit resets (429 responses)

number
reconnect

True if re-linking GitHub may fix the issue

boolean

Invalid request

Media type application/json
object
error
required

Human-readable error message

string
code

Stable machine-readable error code for client branching

string
fieldErrors

First validation message per field path

object
key
additional properties
string
issues

Structured validation issues (Zod)

Array<object>
object
path
required
string
message
required
string
retryAfter

Seconds until rate limit resets (429 responses)

number

Rate limited