Strategic Tickets

Create a ticket

Changed on

Open a ticket on the project's board. title and status are required — status names the column it lands in and has no default, because where a ticket belongs depends on who opened it. A new ticket lands at the top of its column. Labels are named by ID from the project's label list, so create the label there first. A board holds at most 5,000 tickets; past that a create is refused with 400 until some are deleted. The ticket is recorded as opened by an API key — origin is api and author is null — which is how the board tells your automation's tickets from a person's. Requires a read_write key.

post/v1/projects/{projectId}/tickets

Request

  • Base URL: https://api.competlab.com
  • URL: https://api.competlab.com/v1/projects/{projectId}/tickets
  • Auth: API key in header CL-API-Key

Path parameters

projectIdstring required
Example:507f1f77bcf86cd799439011

Project ID

Request body

titlestring required

The ticket's title.

descriptionstring

The ticket's description, in Markdown. At most 20000 characters.

status'triage' | 'todo' | 'in_progress' | 'done' | 'dismissed' required

The column the ticket sits in. triage — nobody has decided yet. todo — decided, not started. in_progress — being worked on. done — finished. dismissed — the team decided not to do it. The set is fixed and a project cannot add to it. Change it with the move endpoint, never with an update.

labelIdsstring[]

IDs from the project's own label list — read it with the labels endpoint, and create a label there before naming it. At most 10 per ticket, each named once.

assigneeUserIdstring

The user ID of a current member of your organization — list them with GET /v1/projects/{projectId}/tickets/assignees. A user ID from anywhere else is refused.

dueDatestring

The day the ticket is due, as YYYY-MM-DD — a calendar day, with no clock and no time zone.

effort'low' | 'medium' | 'high'

How much work the ticket is. null where nobody has said.

impactnumber

How much the ticket matters, from 1 to 4 (1 Minor · 2 Moderate · 3 Significant · 4 Critical; 4 matters most).

Example request

{
  "title": "Get onto the 2026 buyer guide",
  "description": "The guide names three of our competitors and not us.",
  "labelIds": [
    "3f2a9c6e-1b77-4c1e-9a54-5c7b2f0a91d2"
  ],
  "assigneeUserId": "507f1f77bcf86cd799439031",
  "dueDate": "2026-10-01",
  "impact": 3
}

Response

Example response

{
  "item": {
    "id": "507f1f77bcf86cd799439011",
    "number": 14,
    "author": {
      "userId": "507f1f77bcf86cd799439011",
      "fullName": "Dana Ellis"
    },
    "briefing": {
      "runId": "6a3950c06bda450a1372048e",
      "estimatedMinutes": 90,
      "extendsTicketId": "507f1f77bcf86cd799439012"
    },
    "title": "Get onto the 2026 buyer guide",
    "description": "The guide names three of our competitors and not us.",
    "labels": [
      {
        "id": "3f2a9c6e-1b77-4c1e-9a54-5c7b2f0a91d2",
        "name": "Pricing page",
        "color": "#3b82f6"
      }
    ],
    "statusChangedAt": "2026-09-15T10:00:00.000Z",
    "assignee": {
      "userId": "507f1f77bcf86cd799439011",
      "fullName": "Dana Ellis"
    },
    "dueDate": "2026-10-01",
    "impact": 3,
    "commentCount": 2,
    "deletable": true,
    "createdAt": "2026-09-15T10:00:00.000Z",
    "updatedAt": "2026-09-16T08:30:00.000Z",
    "lastActivityAt": "2026-09-17T11:02:00.000Z"
  }
}

Changes

    • info

      removed the non-success response with the status

    • warning

      added the new nothing_to_return enum value to the / response property for the response status

    • warning

      added the new paging_requires_compact_view enum value to the / response property for the response status

    • warning

      added the new paging_requires_summary enum value to the / response property for the response status

    • info

      added the required property ////// to the response with the status