API reference

Issue tracking

Search, create, edit, transition, rank, link, comment on and log work on issues.
GET/v1/orgs/:orgId/issues/calendar/agenda

The caller's dates between from and to (YYYY-MM-DD, at most 100 days); tzOffset in minutes east of UTC dates sprint boundaries.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Query parameters

  • fromstringrequired

    Matches ^\d{4}-\d{2}-\d{2}$.

  • tostringrequired

    Matches ^\d{4}-\d{2}-\d{2}$.

  • tzOffsetinteger

    -840–840. Coerced from a string.

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/calendar/agenda?from=example&to=example' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  entries: {
    id: string
    kind: "due" | "start" | "sprintStart" | "sprintEnd" | "release"
    date: string
    title: string
    key?: string
    spaceKey: string
    done?: boolean
    url: string
  }[]
}
POST/v1/orgs/:orgId/issues/calendar/schedule/:issueKey

Books time for an issue in one of the caller's Mail calendars (a mailbox they're a member of; its default calendar unless calendarId): the event links back to the issue, and the issue lists the event. Guests aren't invited.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • mailboxIdstringrequired

    Up to 64 characters.

  • calendarIdstring

    Up to 64 characters.

  • startstringrequired

    Matches ^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2})?$.

  • endstringrequired

    Matches ^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2})?$.

  • timeZonestringrequired

    1–64 characters.

  • allDayboolean

    Default false.

  • titlestring

    Up to 500 characters. Trimmed.

Errors

  • 403Calendars are for people.
  • 404Mailbox not found
  • 404Calendar not found
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/calendar/schedule/{issueKey}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "mailboxId": "<mailboxId>",
    "start": "example",
    "end": "example",
    "timeZone": "example"
  }'
Send it from this page with your session or a key.

Response 201

{
  event: {
    eventId: string
    calendarId: string
    uid: string
    version: number
    summary: string
    description: string
    location: string
    allDay: boolean
    start: number
    end: number
    startLocal: string
    endLocal: string
    timeZone: string
    organizer: null | {
      email: string
      name?: string
    }
    attendees: {
      email: string
      name?: string
      role: "optional" | "required" | "chair" | "non-participant"
      status: "accepted" | "delegated" | "tentative" | "needs-action" | "declined"
      rsvp: boolean
      kind: "unknown" | "resource" | "group" | "individual" | "room"
      delegatedTo?: string[]
      delegatedFrom?: string[]
    }[]
    isOrganizer: boolean
    myStatus: null | "accepted" | "delegated" | "tentative" | "needs-action" | "declined"
    status: "cancelled" | "confirmed" | "tentative"
    busyStatus: "busy" | "free" | "tentative" | "oof" | "workingElsewhere"
    sensitivity: "private" | "personal" | "normal" | "confidential"
    reminders: number[]
    categories: string[]
    url: null | string
    recurrence: null | {
      count?: number
      byDay?: {
        day: "SA" | "SU" | "MO" | "TU" | "WE" | "TH" | "FR"
        nth?: number
      }[]
      interval: number
      weekStart?: "SA" | "SU" | "MO" | "TU" | "WE" | "TH" | "FR"
      freq: "daily" | "weekly" | "monthly" | "yearly"
      byMonthDay?: number[]
      byMonth?: number[]
      bySetPos?: number[]
      until?: string
    }
    rrule: null | string
    exceptions: {
      recurrenceId: number
      start: number
      end: number
      startLocal: string
      endLocal: string
      summary: string
      location: string
      status: "cancelled" | "confirmed" | "tentative"
      myStatus: null | "accepted" | "delegated" | "tentative" | "needs-action" | "declined"
    }[]
    sequence: number
  }
  linkId: string
  url: string
}
POST/v1/orgs/:orgId/issues/search

The same search as GET /issues with the query in the body (long queries).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • jqlstring

    Default "". Up to 10,000 characters.

  • startAtinteger

    Default 0. 0–100000. Coerced from a string.

  • maxResultsinteger

    Default 50. 1–1000. Coerced from a string.

  • order"rank" | "updated" | "created" | "key"
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/search' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "jql": "",
    "startAt": 0,
    "maxResults": 50
  }'
Send it from this page with your session or a key.

Response 200

{
  issues: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }[]
  total: number
  startAt: number
  maxResults: number
  scanned: number
}
POST/v1/orgs/:orgId/issues/links/among

Links among up to 500 issues (by id), each once from its outward side: timeline dependencies.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • issuesstring[]required

    Up to 500 items. Each up to 64 characters.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/links/among' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "issues": [
      "example"
    ]
  }'
Send it from this page with your session or a key.

Response 200

{
  links: {
    linkId: string
    typeId: string
    label: string
    from: string
    to: string
    fromKey: string
    toKey: string
  }[]
}
GET/v1/orgs/:orgId/issues

Searches with the query language (jql), paged. Default order: most recently updated.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Query parameters

  • jqlstring

    Default "". Up to 10,000 characters.

  • startAtinteger

    Default 0. 0–100000. Coerced from a string.

  • maxResultsinteger

    Default 50. 1–1000. Coerced from a string.

  • order"rank" | "updated" | "created" | "key"
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  issues: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }[]
  total: number
  startAt: number
  maxResults: number
  scanned: number
}
GET/v1/orgs/:orgId/issues/export

Issues matching a query as a CSV (Jira-style columns) or JSON download, up to 10,000.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Query parameters

  • jqlstring

    Default "". Up to 10,000 characters.

  • format"csv" | "json"

    Default "csv".

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/export' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200 with no body

POST/v1/orgs/:orgId/issues/import

Imports a Jira CSV export (or this API's JSON export) into a space, 200 rows per call: pass startRow and keyMap from the previous answer until done. Space admins only.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body (up to 5,120 KB)

  • spacestringrequired

    1–64 characters.

  • format"csv" | "json"required
  • contentstringrequired

    1–5,242,880 characters.

  • startRowinteger

    ≥ 0.

  • keyMapobject

    Keys up to 64 characters. Values: string (up to 64 characters).

  • createMissingboolean

Errors

  • 413Import files can be up to 5 MB.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/import' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "space": "example",
    "format": "csv",
    "content": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  total: number
  processed: number
  done: boolean
  nextRow: null | number
  keyMap: {
    [key: string]: string
  }
  results: {
    row: number
    key?: string
    from?: string
    error?: string
    warnings?: string[]
  }[]
}
GET/v1/orgs/:orgId/issues/places

Places for an issue's location (docs/tasks/locations.md): up to 5 named like q (3 to 200 characters), nearest near (lat,lon) first. Shown to pick from, never kept: saving { address } looks the pick up again as a place to keep. Counts against the hour's address lookups (maps.places.searchHour); 429 past it.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Query parameters

  • qstringrequired

    Up to 200 characters.

  • nearstring

    Matches ^-?\d{1,2}(\.\d+)?,-?\d{1,3}(\.\d+)?$.

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/places?q=example' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  places: {
    name: string
    detail?: string
    lat: number
    lon: number
  }[]
}
GET/v1/orgs/:orgId/issues/labels

Labels in use (most used first), for suggestions; space narrows to one space.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Query parameters

  • spacestring

    Up to 64 characters.

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/labels' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  labels: string[]
}
POST/v1/orgs/:orgId/issues

Creates an issue. Catalog fields take names or ids, people take ids or emails, parent an issue key.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • typestring

    Up to 80 characters.

  • summarystring

    Up to 255 characters.

  • descriptionstring

    Up to 65,536 characters.

  • prioritystringor null

    Up to 80 characters.

  • assigneestringor null

    Up to 320 characters.

  • reporterstringor null

    Up to 320 characters.

  • labelsstring[]

    Up to 30 items. Each up to 64 characters.

  • componentsstring[]

    Up to 50 items. Each up to 100 characters.

  • fixVersionsstring[]

    Up to 50 items. Each up to 100 characters.

  • affectsVersionsstring[]

    Up to 50 items. Each up to 100 characters.

  • dueDatestringor null

    Matches ^\d{4}-\d{2}-\d{2}$.

  • startDatestringor null

    Matches ^\d{4}-\d{2}-\d{2}$.

  • storyPointsnumberor null

    0–10000.

  • originalEstimatenumber | stringor null

    0–315360000. Up to 40 characters.

  • remainingEstimatenumber | stringor null

    0–315360000. Up to 40 characters.

  • environmentstringor null

    Up to 32,768 characters.

  • locationobject | objector null
  • parentstringor null

    Up to 64 characters.

  • sprintstringor null

    Up to 100 characters.

  • securityLevelstringor null

    Up to 80 characters.

  • resolutionstringor null

    Up to 80 characters.

  • fieldsobject

    Keys up to 100 characters. Values: any JSON.

  • requestTypestring

    Up to 80 characters.

  • participantsstring[]

    Up to 100 items. Each up to 320 characters.

  • spacestringrequired

    1–64 characters.

  • summarystringrequired

    1–255 characters. Trimmed.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "space": "example",
    "summary": "Example"
  }'
Send it from this page with your session or a key.

Response 201

{
  issue: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }
}
POST/v1/orgs/:orgId/issues/rank

Reorders issues: puts them (in order) right before or after another issue.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • issuesstring[]required

    1–200 items. Each up to 64 characters.

  • beforestring

    Up to 64 characters.

  • afterstring

    Up to 64 characters.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/rank' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "issues": [
      "example"
    ]
  }'
Send it from this page with your session or a key.

Response 200

{
  issues: {
    issueId: string
    key: string
    rank: string
  }[]
}
POST/v1/orgs/:orgId/issues/bulk

Runs one operation (edit, labels, transition, comment, move, delete, watch, unwatch) on up to 200 issues; each reports its own result.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • issuesstring[]required

    1–200 items. Each up to 64 characters.

  • operation"edit" | "labels" | "transition" | "comment" | "move" | "delete" | "watch" | "unwatch"required
  • fieldsobject
  • fields.typestring

    Up to 80 characters.

  • fields.summarystring

    Up to 255 characters.

  • fields.descriptionstring

    Up to 65,536 characters.

  • fields.prioritystringor null

    Up to 80 characters.

  • fields.assigneestringor null

    Up to 320 characters.

  • fields.reporterstringor null

    Up to 320 characters.

  • fields.labelsstring[]

    Up to 30 items. Each up to 64 characters.

  • fields.componentsstring[]

    Up to 50 items. Each up to 100 characters.

  • fields.fixVersionsstring[]

    Up to 50 items. Each up to 100 characters.

  • fields.affectsVersionsstring[]

    Up to 50 items. Each up to 100 characters.

  • fields.dueDatestringor null

    Matches ^\d{4}-\d{2}-\d{2}$.

  • fields.startDatestringor null

    Matches ^\d{4}-\d{2}-\d{2}$.

  • fields.storyPointsnumberor null

    0–10000.

  • fields.originalEstimatenumber | stringor null

    0–315360000. Up to 40 characters.

  • fields.remainingEstimatenumber | stringor null

    0–315360000. Up to 40 characters.

  • fields.environmentstringor null

    Up to 32,768 characters.

  • fields.locationobject | objector null
  • fields.parentstringor null

    Up to 64 characters.

  • fields.sprintstringor null

    Up to 100 characters.

  • fields.securityLevelstringor null

    Up to 80 characters.

  • fields.resolutionstringor null

    Up to 80 characters.

  • fields.fieldsobject

    Keys up to 100 characters. Values: any JSON.

  • fields.requestTypestring

    Up to 80 characters.

  • fields.participantsstring[]

    Up to 100 items. Each up to 320 characters.

  • transitionstring

    Up to 80 characters.

  • commentstring

    Up to 32,768 characters.

  • addLabelsstring[]

    Up to 30 items. Each up to 255 characters.

  • removeLabelsstring[]

    Up to 30 items. Each up to 255 characters.

  • spacestring

    Up to 64 characters.

  • typestring

    Up to 80 characters.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/bulk' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "issues": [
      "example"
    ],
    "operation": "edit"
  }'
Send it from this page with your session or a key.

Response 200

{
  results: {
    issue: string
    ok: true
  } | {
    issue: string
    ok: false
    error: string
  }[]
  done: number
  failed: number
}
GET/v1/orgs/:orgId/issues/:issueKey

Everything the issue page shows: fields, description, comments, links, attachments, children, transitions.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Query parameters

  • remember"0" | "1"
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  issue: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }
  space: {
    spaceId: string
    key: string
    name: string
    template: "basic" | "service" | "scrum" | "kanban" | "bugs"
    icon?: string
    color?: string
    leadId?: string
    archived: boolean
  }
  description: string
  comments: {
    commentId: string
    issueId: string
    body: string
    authorId: string
    authorType: string
    visibility: "public" | "internal"
    mentions: string[]
    reactions: {
      [key: string]: string[]
    }
    editedAt?: number
    createdAt: number
    updatedAt: number
  }[]
  links: {
    issue: {
      issueId: string
      key: string
      summary: string
      typeId: string
      statusId: string
      statusCategory: "done" | "todo" | "inprogress"
      priorityId?: string
      assigneeId?: string
    }
    linkId: string
    typeId: string
    direction: "outward" | "inward"
    label: string
  }[]
  remoteLinks: {
    linkId: string
    kind: "deployment" | "branch" | "pull" | "event" | "commit" | "page" | "web"
    url?: string
    title: string
    ref?: string
    meta: {
      [key: string]: unknown
    }
    createdBy?: string
    createdAt: number
    updatedAt: number
  }[]
  attachments: {
    attachmentId: string
    name: string
    size: number
    contentType: string
    uploadedBy: string
    createdAt: number
  }[]
  children: {
    issueId: string
    key: string
    summary: string
    typeId: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    priorityId?: string
    assigneeId?: string
  }[]
  parent?: {
    issueId: string
    key: string
    summary: string
    typeId: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    priorityId?: string
    assigneeId?: string
  }
  worklogs: {
    worklogId: string
    issueId: string
    spaceId: string
    authorId: string
    started: number
    seconds: number
    comment: string
    createdAt: number
    updatedAt: number
  }[]
  transitions: {
    id: string
    name: string
    to: string
    toName: string
    toCategory: string
    fields: string[]
    blocked?: string
  }[]
  workflow: {
    workflowId: string
    name: string
  }
  sla: {
    elapsed: number
    remaining?: number
    breached: boolean
    running: boolean
    paused: boolean
    stopped: boolean
    breachAt?: number
    id: string
    name: string
    goalMinutes?: number
    calendar: "business" | "always"
  }[]
  approvals: {
    approverNames: {
      userId: string
      name: string
    }[]
    mine: boolean
    id: string
    statusId: string
    approvers: string[]
    needed: "all" | "one"
    decisions: {
      userId: string
      decision: "approved" | "declined"
      at: number
    }[]
    state: "pending" | "approved" | "declined"
    createdAt: number
    decidedAt?: number
  }[]
  permissions: {
    edit: boolean
    delete: boolean
    link?: boolean
    move?: boolean
    comment?: boolean
    worklog?: boolean
    create?: boolean
    browse?: boolean
    editOwn?: boolean
    transition?: boolean
    assign?: boolean
    assignable?: boolean
    deleteOwn?: boolean
    editComments?: boolean
    deleteComments?: boolean
    attach?: boolean
    deleteAttachments?: boolean
    manageWatchers?: boolean
    manageSprints?: boolean
    administer?: boolean
    serviceAgent?: boolean
  }
}
PATCH/v1/orgs/:orgId/issues/:issueKey

Edits fields (status changes go through transitions).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • typestring

    Up to 80 characters.

  • summarystring

    Up to 255 characters.

  • descriptionstring

    Up to 65,536 characters.

  • prioritystringor null

    Up to 80 characters.

  • assigneestringor null

    Up to 320 characters.

  • reporterstringor null

    Up to 320 characters.

  • labelsstring[]

    Up to 30 items. Each up to 64 characters.

  • componentsstring[]

    Up to 50 items. Each up to 100 characters.

  • fixVersionsstring[]

    Up to 50 items. Each up to 100 characters.

  • affectsVersionsstring[]

    Up to 50 items. Each up to 100 characters.

  • dueDatestringor null

    Matches ^\d{4}-\d{2}-\d{2}$.

  • startDatestringor null

    Matches ^\d{4}-\d{2}-\d{2}$.

  • storyPointsnumberor null

    0–10000.

  • originalEstimatenumber | stringor null

    0–315360000. Up to 40 characters.

  • remainingEstimatenumber | stringor null

    0–315360000. Up to 40 characters.

  • environmentstringor null

    Up to 32,768 characters.

  • locationobject | objector null
  • parentstringor null

    Up to 64 characters.

  • sprintstringor null

    Up to 100 characters.

  • securityLevelstringor null

    Up to 80 characters.

  • resolutionstringor null

    Up to 80 characters.

  • fieldsobject

    Keys up to 100 characters. Values: any JSON.

  • requestTypestring

    Up to 80 characters.

  • participantsstring[]

    Up to 100 items. Each up to 320 characters.

curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "example",
    "summary": "Example",
    "description": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  issue: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }
  changes: {
    field: string
    from?: unknown
    to?: unknown
    fromText?: string
    toText?: string
  }[]
}
DELETE/v1/orgs/:orgId/issues/:issueKey

Deletes an issue with its comments, attachments, work logs and subtasks.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  issueId: string
  key: string
  subtasks: number
}
GET/v1/orgs/:orgId/issues/:issueKey/transitions

Transitions available from the issue's status, with the reason when a condition blocks one.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/transitions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  transitions: {
    id: string
    name: string
    to: string
    toName: string
    toCategory: string
    fields: string[]
    blocked?: string
  }[]
  workflow: {
    workflowId: string
    name: string
    definition: {
      initialStatusId: string
      statuses: {
        statusId: string
        x?: number
        y?: number
      }[]
      transitions: {
        id: string
        name: string
        from: string[]
        to: string
        fields?: string[]
        conditions?: {
          type: "orgRole"
          roles: object
        } | {
          type: "spaceRole"
          roles: object
        } | {
          type: "assignee"
        } | {
          type: "reporter"
        } | {
          type: "permission"
          permission: "link" | "move" | "edit" | "comment" | "worklog" | "delete" | "create" | "browse" | "editOwn" | "transition" | "assign" | "assignable" | "deleteOwn" | "editComments" | "deleteComments" | "attach" | "deleteAttachments" | "manageWatchers" | "manageSprints" | "administer" | "serviceAgent"
        } | {
          type: "fieldSet"
          field: string
        } | {
          type: "subtasksDone"
        }[]
        validators?: {
          type: "required"
          fields: object
          message?: string
        } | {
          type: "query"
          query: string
          message: string
        }[]
        postFunctions?: {
          type: "assign"
          to: "reporter" | "currentUser" | "lead" | "unassigned"
        } | {
          type: "setResolution"
          resolutionId: null | string
        } | {
          type: "setField"
          field: string
          value: unknown
        } | {
          type: "clearField"
          field: string
        } | {
          type: "comment"
          body: string
        }[]
      }[]
      autoResolution?: boolean
    }
  }
}
POST/v1/orgs/:orgId/issues/:issueKey/transitions

Moves the issue through its workflow (by transition id or name, or the target status name).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • transitionstringrequired

    1–80 characters.

  • fieldsobject
  • fields.typestring

    Up to 80 characters.

  • fields.summarystring

    Up to 255 characters.

  • fields.descriptionstring

    Up to 65,536 characters.

  • fields.prioritystringor null

    Up to 80 characters.

  • fields.assigneestringor null

    Up to 320 characters.

  • fields.reporterstringor null

    Up to 320 characters.

  • fields.labelsstring[]

    Up to 30 items. Each up to 64 characters.

  • fields.componentsstring[]

    Up to 50 items. Each up to 100 characters.

  • fields.fixVersionsstring[]

    Up to 50 items. Each up to 100 characters.

  • fields.affectsVersionsstring[]

    Up to 50 items. Each up to 100 characters.

  • fields.dueDatestringor null

    Matches ^\d{4}-\d{2}-\d{2}$.

  • fields.startDatestringor null

    Matches ^\d{4}-\d{2}-\d{2}$.

  • fields.storyPointsnumberor null

    0–10000.

  • fields.originalEstimatenumber | stringor null

    0–315360000. Up to 40 characters.

  • fields.remainingEstimatenumber | stringor null

    0–315360000. Up to 40 characters.

  • fields.environmentstringor null

    Up to 32,768 characters.

  • fields.locationobject | objector null
  • fields.parentstringor null

    Up to 64 characters.

  • fields.sprintstringor null

    Up to 100 characters.

  • fields.securityLevelstringor null

    Up to 80 characters.

  • fields.resolutionstringor null

    Up to 80 characters.

  • fields.fieldsobject

    Keys up to 100 characters. Values: any JSON.

  • fields.requestTypestring

    Up to 80 characters.

  • fields.participantsstring[]

    Up to 100 items. Each up to 320 characters.

  • commentstring

    Up to 32,768 characters.

  • commentVisibility"public" | "internal"
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/transitions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "transition": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  issue: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }
  changes: {
    field: string
    from?: unknown
    to?: unknown
    fromText?: string
    toText?: string
  }[]
}
POST/v1/orgs/:orgId/issues/:issueKey/approvals/:approvalId

Approves or declines a service request as one of its approvers; a final decision moves it on.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • approvalId

    Approval id (apr_…): an issue's, from its approvals; under /v1/me/sign-in-approvals a sign-in request.

Request body

  • decision"approve" | "decline"required
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/approvals/{approvalId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "decision": "approve"
  }'
Send it from this page with your session or a key.

Response 200

{
  approval: {
    id: string
    statusId: string
    approvers: string[]
    needed: "all" | "one"
    decisions: {
      userId: string
      decision: "approved" | "declined"
      at: number
    }[]
    state: "pending" | "approved" | "declined"
    createdAt: number
    decidedAt?: number
  }
  issue: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }
}
POST/v1/orgs/:orgId/issues/:issueKey/move

Moves the issue (and its subtasks) to another space under a new key; the old key keeps working.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • spacestringrequired

    1–64 characters.

  • typestring

    Up to 80 characters.

  • statusstring

    Up to 80 characters.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/move' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "space": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  issue: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }
  from: string
  subtasks: number
}
POST/v1/orgs/:orgId/issues/:issueKey/clone

Copies an issue (optionally with subtasks and links) and links the copy to the original.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • summarystring

    1–255 characters. Trimmed.

  • subtasksboolean
  • linksboolean
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/clone' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "summary": "Example",
    "subtasks": true,
    "links": true
  }'
Send it from this page with your session or a key.

Response 201

{
  issue: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }
}
GET/v1/orgs/:orgId/issues/:issueKey/children

Child issues (subtasks, or stories of an epic).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/children' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  issues: {
    issueId: string
    key: string
    summary: string
    typeId: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    priorityId?: string
    assigneeId?: string
  }[]
}
GET/v1/orgs/:orgId/issues/:issueKey/history

Field changes, newest first.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/history' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  history: {
    changeId: string
    actorId: string
    actorType: string
    at: number
    items: {
      field: string
      from?: unknown
      to?: unknown
      fromText?: string
      toText?: string
    }[]
  }[]
}
GET/v1/orgs/:orgId/issues/:issueKey/comments

Comments, oldest first (order=desc for newest first). Internal comments only for agents.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Query parameters

  • order"asc" | "desc"
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/comments' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  comments: {
    commentId: string
    issueId: string
    body: string
    authorId: string
    authorType: string
    visibility: "public" | "internal"
    mentions: string[]
    reactions: {
      [key: string]: string[]
    }
    editedAt?: number
    createdAt: number
    updatedAt: number
  }[]
}
POST/v1/orgs/:orgId/issues/:issueKey/comments

Adds a comment (Markdown; mention people as @[Name](user:usr_…)). Internal comments are for service desk agents.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • bodystringrequired

    1–32,768 characters.

  • visibility"public" | "internal"
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/comments' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "body": "example"
  }'
Send it from this page with your session or a key.

Response 201

{
  comment: {
    commentId: string
    issueId: string
    body: string
    authorId: string
    authorType: string
    visibility: "public" | "internal"
    mentions: string[]
    reactions: {
      [key: string]: string[]
    }
    editedAt?: number
    createdAt: number
    updatedAt: number
  }
}
PATCH/v1/orgs/:orgId/issues/:issueKey/comments/:commentId

Edits a comment (the previous body is kept as a revision) or changes its visibility.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • commentId

    Comment id (icm_…).

Request body

  • bodystring

    1–32,768 characters.

  • visibility"public" | "internal"
curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/comments/{commentId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "body": "example",
    "visibility": "public"
  }'
Send it from this page with your session or a key.

Response 200

{
  comment: {
    commentId: string
    issueId: string
    body: string
    authorId: string
    authorType: string
    visibility: "public" | "internal"
    mentions: string[]
    reactions: {
      [key: string]: string[]
    }
    editedAt?: number
    createdAt: number
    updatedAt: number
  }
}
DELETE/v1/orgs/:orgId/issues/:issueKey/comments/:commentId

Deletes a comment.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • commentId

    Comment id (icm_…).

curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/comments/{commentId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  commentId: string
}
GET/v1/orgs/:orgId/issues/:issueKey/comments/:commentId/revisions

Earlier versions of an edited comment.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • commentId

    Comment id (icm_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/comments/{commentId}/revisions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  revisions: {
    body: string
    at: number
  }[]
}
POST/v1/orgs/:orgId/issues/:issueKey/comments/:commentId/reactions

Toggles the caller's reaction.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • commentId

    Comment id (icm_…).

Request body

  • emojistringrequired

    1–16 characters.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/comments/{commentId}/reactions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "emoji": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  reactions: {
    [key: string]: string[]
  }
}
POST/v1/orgs/:orgId/issues/:issueKey/links

Links to another issue by link type (id, name, or either direction's wording, e.g. "is blocked by").

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • typestringrequired

    1–80 characters.

  • issuestringrequired

    1–64 characters.

  • inwardboolean
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/links' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "example",
    "issue": "example"
  }'
Send it from this page with your session or a key.

Response 201

{
  linkId: string
  typeId: string
  source: string
  target: string
}
POST/v1/orgs/:orgId/issues/:issueKey/remote-links

Links a web page or Notes page.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • urlstringrequired

    Up to 2,000 characters. URL.

  • titlestring

    Up to 200 characters.

  • kind"web" | "page"
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/remote-links' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://example.com"
  }'
Send it from this page with your session or a key.

Response 201

{
  linkId: string
}
GET/v1/orgs/:orgId/issues/:issueKey/attachments

Attachments.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/attachments' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  attachments: {
    attachmentId: string
    name: string
    size: number
    contentType: string
    uploadedBy: string
    createdAt: number
  }[]
}
POST/v1/orgs/:orgId/issues/:issueKey/attachments

Starts an upload: returns a presigned PUT (15 minutes, size and type signed). Finish with /complete.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • namestringrequired

    1–255 characters.

  • sizeintegerrequired

    ≥ 1.

  • contentTypestring

    Up to 200 characters.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/attachments' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Example",
    "size": 1
  }'
Send it from this page with your session or a key.

Response 201

{
  attachmentId: string
  uploadUrl: string
  headers: {
    "content-type": string
  }
}
POST/v1/orgs/:orgId/issues/:issueKey/attachments/:attachmentId/complete

Finishes an upload once the file is in place.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • attachmentId

    Attachment id (att_…).

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/attachments/{attachmentId}/complete' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  attachmentId: string
}
GET/v1/orgs/:orgId/issues/:issueKey/attachments/:attachmentId

A 5-minute download link (inline=1 opens images, PDFs and plain text in the browser).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • attachmentId

    Attachment id (att_…).

Query parameters

  • inline"0" | "1"
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/attachments/{attachmentId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  url: string
  name: string
  contentType: string
  size: number
}
DELETE/v1/orgs/:orgId/issues/:issueKey/attachments/:attachmentId

Deletes an attachment and its file.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • attachmentId

    Attachment id (att_…).

curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/attachments/{attachmentId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  attachmentId: string
}
GET/v1/orgs/:orgId/issues/:issueKey/worklogs

Work logs.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/worklogs' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  worklogs: {
    worklogId: string
    issueId: string
    spaceId: string
    authorId: string
    started: number
    seconds: number
    comment: string
    createdAt: number
    updatedAt: number
  }[]
}
POST/v1/orgs/:orgId/issues/:issueKey/worklogs

Logs work ("1h 30m" or seconds); the remaining estimate goes down unless told otherwise.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • timeSpentinteger | stringrequired

    60–604800. 1–40 characters.

  • startedinteger
  • commentstring

    Up to 4,000 characters.

  • remainingobject | object | object
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/worklogs' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "timeSpent": 1
  }'
Send it from this page with your session or a key.

Response 201

{
  worklogId: string
  issue: {
    orgId: string
    issueId: string
    spaceId: string
    number: number
    key: string
    typeId: string
    summary: string
    statusId: string
    statusCategory: "done" | "todo" | "inprogress"
    statusChangedAt?: number
    resolutionId?: string
    resolvedAt?: number
    priorityId?: string
    assigneeId?: string
    reporterId?: string
    creatorId?: string
    labels: string[]
    componentIds: string[]
    fixVersionIds: string[]
    affectsVersionIds: string[]
    dueDate?: string
    startDate?: string
    storyPoints?: number
    originalEstimate?: number
    remainingEstimate?: number
    timeSpent?: number
    environment?: string
    location?: {
      lat: number
      lon: number
      label?: string
    }
    parentId?: string
    sprintId?: string
    closedSprintIds: string[]
    rank: string
    watchers: string[]
    voters: string[]
    securityLevelId?: string
    fields: {
      [key: string]: boolean | null | string | number | string[] | {
        parent: string
        child?: string
      }
    }
    excerpt: string
    statusLog: [string, number][]
    commentCount: number
    attachmentCount: number
    requestTypeId?: string
    channel?: string
    participants: string[]
    requesterEmail?: string
    emailParticipants: string[]
    approvals: {
      id: string
      statusId: string
      approvers: string[]
      needed: "all" | "one"
      decisions: {
        userId: string
        decision: "approved" | "declined"
        at: number
      }[]
      state: "pending" | "approved" | "declined"
      createdAt: number
      decidedAt?: number
    }[]
    satisfaction?: number
    satisfactionComment?: string
    sla: {
      [key: string]: {
        runningSince?: number
        elapsed: number
        paused?: boolean
        stopped?: boolean
        goal?: number
        calendar: "business" | "always"
        breached?: boolean
        startedAt?: number
        stoppedAt?: number
      }
    }
    version: number
    createdAt: number
    updatedAt: number
  }
}
PATCH/v1/orgs/:orgId/issues/:issueKey/worklogs/:worklogId

Changes a work log.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • worklogId

    Work log id (wlg_…).

Request body

  • timeSpentinteger | string

    60–604800. 1–40 characters.

  • startedinteger
  • commentstring

    Up to 4,000 characters.

curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/worklogs/{worklogId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "timeSpent": 1,
    "started": 1,
    "comment": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  worklogId: string
}
DELETE/v1/orgs/:orgId/issues/:issueKey/worklogs/:worklogId

Deletes a work log (its time goes back on the remaining estimate).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

  • worklogId

    Work log id (wlg_…).

curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/worklogs/{worklogId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  worklogId: string
}
POST/v1/orgs/:orgId/issues/:issueKey/watchers

Starts or stops watching (the caller, or someone else with manage watchers).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • watchingbooleanrequired
  • userIdstring

    Up to 64 characters.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/watchers' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "watching": true
  }'
Send it from this page with your session or a key.

Response 200

{
  watchers: string[]
}
POST/v1/orgs/:orgId/issues/:issueKey/votes

Votes for an issue, or withdraws the vote.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • issueKey

    Issue key (WEB-12; former keys of moved issues and renamed spaces work too) or issue id (iss_…).

Request body

  • votingbooleanrequired
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/issues/{issueKey}/votes' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "voting": true
  }'
Send it from this page with your session or a key.

Response 200

{
  voters: string[]
}