---
title: "File an issue"
method: POST
path: "/v1/issues"
tags: ["Issues"]
---

# File an issue

`POST /v1/issues`

## Request

- Base URL: `https://docs.grepr.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://docs.grepr.ai/v1/issues`
- Auth: one of:
  - API key in header `GREPR-API-KEY`
  - OpenID Connect (`https://grepr-prod.us.auth0.com/.well-known/openid-configuration`)

Files a new issue on the organization's board. Search first and update an existing issue instead of filing a duplicate; this call never matches existing issues.

## Request body

- CreateIssueRequest: Files a new issue. Creating never deduplicates: search first, and update or record an occurrence on an existing issue instead of filing a second one. The reporter, number and timestamps come from the caller and the server, never from the request.
  - `confidence` 'CONFIRMED' | 'LIKELY' | 'UNVERIFIED', required: How sure the reporter is that the problem is real.
  - `description` string: The current understanding, in markdown, or null for none.
  - `entities` object: The `entity:*` tags it concerns; an unprefixed key is put in the `entity:` namespace. Keys are stored in lower case, and values as given; searches match both in any case.
  - `evidence` IssueEvidence[]: Things a person can open to check the claim.
    - `from` string, date-time: Start of a log query's time range, or null.
    - `kind` 'LOG_QUERY' | 'EVENT' | 'URL', required: What the evidence points at.
    - `label` string: A short description of what it shows, or null.
    - `target` string, required: The Grepr log query for LOG_QUERY, the event id for EVENT, or an http(s) URL for URL.
    - `to` string, date-time: End of a log query's time range, or null.
  - `expiresAt` string, date-time: When the issue stops applying.
  - `fingerprint` string: An optional free-form key for exact-match search.
  - `labels` string[]: Categories; reuse the labels search reports as in use.
  - `links` IssueLink[]: Related pipelines, investigations, memories, suggestions and external tickets.
    - `hidden` boolean, nullable: True for a link to an issue the reader can't see. Set only in responses.
    - `kind` 'PIPELINE' | 'INVESTIGATION' | 'MEMORY' | 'AGENT_SUGGESTION' | 'EXTERNAL' | 'ISSUE', required: What the link points at.
    - `label` string: A short description, or null.
    - `target` string, nullable: Null only for a hidden issue link in a response.
  - `nextStep` string: The concrete next action and who it waits on.
  - `priority` 'P0' | 'P1' | 'P2' | 'P3': How soon someone should act; agents must set it. A person who leaves it null files at `P2`, unlocked, so triage can set it.
  - `revisitAt` string, date-time: When someone should check back.
  - `state` 'TRIAGE' | 'READY' | 'IN_PROGRESS' | 'WAITING' | 'MONITORING' | 'CLOSED': The open state to file it in; null files it in `TRIAGE`. Agents may file only in `TRIAGE`, or `READY` when their handoff mode allows it.
  - `teamIds` string[]: The teams that may see it; people only, from the teams they can edit issues of (any for an organization-wide person). Absent: a team-scoped person's own teams, and none for an organization-wide person, which keeps the issue to organization-wide users.
  - `title` string, required: One line naming the problem, not the symptom's timestamp.

## Response `200`

Issue filed

- Issue: One durable problem or task on the organization's issue board.
  - `closedAt` string, date-time: When it closed, or null while open.
  - `confidence` 'CONFIRMED' | 'LIKELY' | 'UNVERIFIED': How sure the reporter is that the problem is real.
  - `createdAt` string, date-time: When it was filed.
  - `description` string: The current understanding, in markdown, kept current rather than appended to.
  - `duplicateOf` string: The surviving issue, set exactly when resolved as `DUPLICATE`; null in a response when the reader can't see the survivor.
  - `duplicateOfHidden` boolean: True in a response whose reader can't see the surviving issue.
  - `entities` object: The `entity:*` tags it concerns, the same vocabulary as memory tags, keys in lower case, sorted by key.
  - `evidence` IssueEvidence[]: Things a person can open to check the claim.
    - `from` string, date-time: Start of a log query's time range, or null.
    - `kind` 'LOG_QUERY' | 'EVENT' | 'URL', required: What the evidence points at.
    - `label` string: A short description of what it shows, or null.
    - `target` string, required: The Grepr log query for LOG_QUERY, the event id for EVENT, or an http(s) URL for URL.
    - `to` string, date-time: End of a log query's time range, or null.
  - `expiresAt` string, date-time: When the issue stops applying and closes as `EXPIRED`, or null.
  - `fingerprint` string: An optional free-form key for exact-match search, or null.
  - `firstSeenAt` string, date-time: The first sighting, or null before any.
  - `id` string: The issue id.
  - `labels` string[]: Categories, such as `cost`, sorted.
  - `lastSeenAt` string, date-time: The latest sighting, or when it was filed.
  - `links` IssueLink[]: Related pipelines, investigations, memories, suggestions and external tickets.
    - `hidden` boolean, nullable: True for a link to an issue the reader can't see. Set only in responses.
    - `kind` 'PIPELINE' | 'INVESTIGATION' | 'MEMORY' | 'AGENT_SUGGESTION' | 'EXTERNAL' | 'ISSUE', required: What the link points at.
    - `label` string: A short description, or null.
    - `target` string, nullable: Null only for a hidden issue link in a response.
  - `locks` IssueLocks: The fields and labels people have locked against agent changes. `state` never locks.
    - `fields` object: The locked fields, each with who locked it and when.
    - `labels` object: The locked labels, keyed by label.
  - `nextStep` string: The concrete next action and who it waits on, or null.
  - `number` integer: The short per-organization handle, shown as `#142`.
  - `occurrenceCount` integer: How many investigations sighted it.
  - `priority` 'P0' | 'P1' | 'P2' | 'P3': How soon someone should act.
  - `regressed` boolean: Whether it reopened on a new sighting after being fixed; cleared on its next close.
  - `reporter` IssueActor: Who made a change to an issue. An agent is named by its own id and the investigation it acted in, never by the service account it authenticated as, since several agents may share one.
    - `agentId` string: The agent, for an agent actor; null otherwise.
    - `id` string: The person's user id, the agent's execution principal (its service account's token subject), or `system` for the server.
    - `investigationId` string: The investigation the agent acted in, for an agent actor; null otherwise.
    - `kind` 'PERSON' | 'AGENT' | 'SYSTEM': A person, an agent, or the server.
  - `resolution` 'FIXED' | 'DUPLICATE' | 'NOT_A_PROBLEM' | 'IGNORED' | 'OBSOLETE' | 'EXPIRED': Why it closed; set exactly when `state` is `CLOSED`.
  - `revisitAt` string, date-time: When someone should check back, or null. Then a Monitoring issue's watcher is started on it, or, with no watcher, it goes back to `READY`.
  - `state` 'TRIAGE' | 'READY' | 'IN_PROGRESS' | 'WAITING' | 'MONITORING' | 'CLOSED': Where the issue is in its lifecycle.
  - `stateChangedAt` string, date-time: When the state last changed.
  - `teamIds` string[]: The teams that may see the issue, sorted.
  - `title` string: One line naming the problem.
  - `updatedAt` string, date-time: When it last changed.
  - `version` integer: Bumped by every change to a field, the state, an assignment, a lock or the teams.
  - `watchedBy` string: The agent watching it in `MONITORING`: the one that moved it there, started on it again when a sighting comes in or its revisit time passes. Null outside Monitoring.

## Other responses

- `400`: Invalid issue, or a field only people may set
- `401`: Unauthorized
- `403`: No permission to file issues, or to share them with the given teams

---

[API](https://skmtc.dev/grepr/apis/grepr-api.md) - [All operations](https://skmtc.dev/grepr/apis/grepr-api/llms.txt) - [OpenAPI document](https://skmtc.dev/grepr/apis/grepr-api/revisions/2a5ce03a0bf0?raw)
