Skip to documentation

Ideas

Ideas are the tangible solutions you're considering to address your opportunities. Track features, experiments, and improvements through their evaluation lifecycle.

13 endpoints

POST

Match product features

POST /external/v1/ideas/:id/match-features

Match the captured request to existing Features in its Product. Clear, source-grounded matches are applied; uncertain matches remain suggestions. Manual selections, including an empty selection, are preserved. A Feature relation does not mean the request is fulfilled. Repeated calls reuse an unchanged result.

Requirements

API scopes required:
ideas:write

Request

Parameters

NameTypeDescription
id *stringIdea UUID or workspace public ID, for example IDEA-42.

Responses

201
Matched

Returns the saved featureIds and featureMatching state. Check status: matched, needs_review, no_match, no_features, or manual. Missing Product returns null.

Schema
404
Not found

The Idea is not in the API-key workspace.

409
Changed during matching

The Idea or Product map changed. Read the current record and retry.

GET

Read saved classifications

GET /external/v1/ideas/:id/classifications

Read current taxonomy values and review state, or apply the same manual review actions as the product. Use groupKey from the active taxonomy and optionIds returned by this read. Read the result after a correction; a preview or completed model run is not a review.

Requirements

API scopes required:
ideas:read

Request

Parameters

NameTypeDescription
id *stringInternal UUID or workspace-scoped public ID.

Responses

200
Success

Current taxonomy version, group values and review summary.

Example Request

GET
/external/v1/ideas/:id/classifications
http
GET /external/v1/ideas/IDEA-42/classifications
PATCH

Review classifications

PATCH /external/v1/ideas/:id/classifications

Read current taxonomy values and review state, or apply the same manual review actions as the product. Use groupKey from the active taxonomy and optionIds returned by this read. Read the result after a correction; a preview or completed model run is not a review.

Requirements

API scopes required:
ideas:write

Request

Parameters

NameTypeDescription
id *stringInternal UUID or workspace-scoped public ID.

Request body (application/json)

updatesClassificationUpdate[]
Required

Exactly one update identifies groupKey or taxonomyGroupId and action: accept, reject, set_option, set_text or mark_unassigned. set_option supplies optionIds; set_text supplies textValue. Submit one group per operation so each correction has a separate receipt.

Responses

200
Success

Current taxonomy version, group values and review summary.

Example Request

PATCH
/external/v1/ideas/:id/classifications
http
PATCH /external/v1/ideas/IDEA-42/classifications

{"updates":[{"groupKey":"workflow","action":"accept"}]}
GET

Read an Idea’s evidence

GET /external/v1/ideas/:id/evidence

List exact evidence directly linked to an Idea. Each record includes its relationship role (supports, qualifies, contradicts or context) and origin. A link alone does not mean the work addressed that evidence. Select the records covered by delivered work before resolving them. This endpoint does not infer evidence through related Insights or Opportunities. It needs ideas:read plus signal-evidence:read or signals:read. List responses are arrays with X-Total-Count, X-Limit, X-Offset and X-Has-More headers. Continue until X-Has-More is false; concurrent edits can shift offset pages.

Requirements

API scopes required:
ideas:read
signal-evidence:read

Request

Parameters

NameTypeDescription
id *uuid | public idIdea reference, for example IDEA-42.
limit integer1–50; default 20.
offset integerDefault 0.
visibility enumactive (default) or all.

Responses

200
Success

The requested data is returned.

400
Invalid request

Invalid ID, unsupported field, empty patch, or invalid value.

403
Missing scope

The key does not grant the required resource scope.

404
Not found

The addressed record or assignment is outside this workspace or team.

Example Response

200 OK
json
[
  {
    "id": "33333333-3333-4333-8333-333333333333",
    "title": "Export duplicates rows",
    "description": "Retrying the export adds a second copy.",
    "extracts": null,
    "category": "Product bug",
    "signalId": null,
    "resolvedAt": null,
    "resolution": null,
    "resolvedByUserId": null,
    "dismissedAt": null,
    "role": "supports",
    "origin": "entity_creation",
    "signalPublicId": null
  }
]
PATCH

Change an Idea status

PATCH /external/v1/ideas/:id/status

Apply the exact workspace-configured status label to one Idea. expectedCurrentStatus rejects stale writes. The configured promotion status is reserved for the promotion workflow; this operation never creates an Initiative. Task and evidence states are independent.

Requirements

API scopes required:
ideas:write

Request

Parameters

NameTypeDescription
id *uuid | public idIdea reference, for example IDEA-42.

Request body (application/json)

statusstring
Required

Exact workspace status label, 1–120 characters.

expectedCurrentStatusstring

Optional previously observed status label.

Responses

200
Success

The saved record is returned.

400
Invalid request

Invalid ID, unsupported field, empty patch, or invalid value.

403
Missing scope

The key does not grant the required resource scope.

404
Not found

The addressed record or assignment is outside this workspace or team.

409
Conflict

The observed status changed, the sprint is completed, or a source-managed field must be edited in Linear.

Example Request

PATCH
/external/v1/ideas/:id/status
json
{
  "status": "Shipped",
  "expectedCurrentStatus": "Approved"
}

Example Response

200 OK
json
{
  "id": "33333333-3333-4333-8333-333333333333",
  "publicId": "IDEA-42",
  "status": "Shipped",
  "previousStatus": "Approved",
  "changed": true
}
GET

List ideas

GET /external/v1/ideas

Get a bounded page of potential solutions and features tracked as ideas.

Requirements

API scopes required:
ideas:read

Request

Parameters

NameTypeDescription
include stringUse classifications to return saved taxonomy version, values, labels and review status.
limit numberMaximum number of items to return (default: 20, maximum: 100)
offset numberNumber of items to skip (default: 0)
sourceKey stringExact stable source namespace to match
externalId stringExact source-record identifier to match
integrationId uuidExact connected integration identifier to match

Responses

200
Success

List of ideas retrieved. Pagination metadata is returned in X-Total-Count, X-Limit, X-Offset, and X-Has-More headers.

Schema
Array<Idea>

Example Request

GET
/external/v1/ideas
curl
curl -X GET https://zentrik.ai/api/external/v1/ideas?limit=10 \
  -H 'Authorization: Bearer YOUR_API_KEY'

Example Response

200 OK
json
[
  {
    "id": "uuid",
    "name": "Implement one-click checkout",
    "description": "Reduce friction by storing user preferences...",
    "status": "New"
  }
]
GET

Get one idea

GET /external/v1/ideas/:id

Retrieve one feature idea by its internal UUID or human-readable public ID.

Requirements

API scopes required:
ideas:read

Request

Parameters

NameTypeDescription
include stringUse classifications to return saved taxonomy version, values, labels and review status.
id *stringThe internal UUID or public ID (for example, IDEA-42)

Responses

200
Success

Schema

Example Request

GET
/external/v1/ideas/:id
curl
curl -X GET https://zentrik.ai/api/external/v1/ideas/IDEA-42 \
  -H 'Authorization: Bearer YOUR_API_KEY'
GET

List idea questions

GET /external/v1/ideas/:id/questions

List the questions on an idea, whether Zentrik generated them or people added them in the app, with their current answers, by internal UUID or human-readable public ID. `reasoning` says why a question matters and `placeholder` is Zentrik's drafted answer. `status` is `pending` (open), `skipped` (set aside: still open, out of the open list), `answered`, or `rejected` (not relevant). Results use the standard pagination headers.

Requirements

API scopes required:
ideas:read

Request

Parameters

NameTypeDescription
id *stringThe internal UUID or public ID (for example, IDEA-42)
limit numberMaximum number of questions to return (default: 20, maximum: 100)
offset numberNumber of questions to skip (default: 0)

Responses

200
Success

Questions were retrieved. Pagination metadata is returned in X-Total-Count, X-Limit, X-Offset, and X-Has-More headers.

Schema
Array<IdeaQuestion>
404
Not found

The idea is not in the API-key workspace.

Example Request

GET
/external/v1/ideas/:id/questions
curl
curl -X GET 'https://zentrik.ai/api/external/v1/ideas/IDEA-42/questions?limit=20&offset=0' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Example Response

200 OK
json
[
  {
    "id": "question-uuid",
    "ideaId": "idea-uuid",
    "question": "Which workflow should ship first?",
    "answer": null,
    "placeholder": "Name the first workflow",
    "reasoning": "The rollout plan depends on which workflow users meet first.",
    "status": "pending",
    "createdAt": "2026-08-05T10:00:00.000Z",
    "updatedAt": "2026-08-05T10:00:00.000Z"
  }
]
PATCH

Answer an idea question

PATCH /external/v1/ideas/:id/questions/:questionId/answer

Answer an open or set-aside question, or revise its current answer. The idea reference is workspace-scoped and may be an internal UUID or public ID.

Requirements

API scopes required:
ideas:write

Request

Parameters

NameTypeDescription
id *stringThe internal UUID or public ID (for example, IDEA-42)
questionId *uuidThe question UUID returned by the list endpoint

Request body (application/json)

answerstring
Required

The non-empty answer to save

Responses

200
Updated

The persisted question and answer were returned.

Schema
IdeaQuestion
400
Invalid request

The answer is empty, or questionId is not a question UUID.

404
Not found

The idea or question is outside the API-key workspace.

Example Request

PATCH
/external/v1/ideas/:id/questions/:questionId/answer
curl
curl -X PATCH https://zentrik.ai/api/external/v1/ideas/IDEA-42/questions/QUESTION_UUID/answer \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"answer":"Workspace setup"}'

Example Response

200 OK
json
{
  "id": "question-uuid",
  "ideaId": "idea-uuid",
  "question": "Which workflow should ship first?",
  "answer": "Workspace setup",
  "placeholder": "Name the first workflow",
  "reasoning": "The rollout plan depends on which workflow users meet first.",
  "status": "answered",
  "createdAt": "2026-08-05T10:00:00.000Z",
  "updatedAt": "2026-08-06T10:00:00.000Z"
}
POST

Create an idea

POST /external/v1/ideas

Submit or idempotently update a feature idea or solution. Send sourceKey with externalId for a stable source identity. A repeat request with the same pair updates the existing idea, and an omitted status preserves its current workflow state.

Requirements

API scopes required:
ideas:write

Request

Request body (application/json)

namestring

Title of the idea. Zentrik generates one from the description when omitted.

descriptionstring
Required

Detailed description of the solution

statusstring

Exact workspace-configured Idea status. Omit it during an idempotent update to preserve the current status.

sourceKeystring

Stable source namespace. Use it with externalId for idempotent create-or-update behavior.

externalIdstring

Stable record identifier within sourceKey.

integrationIduuid

Connected integration identifier for integration-owned records.

productIduuid

Workspace Product whose Feature map should be used.

featureIdsuuid[]

Explicit same-product Feature selection. Omit for automatic matching; an empty list keeps the field unlinked.

insightIdsuuid[]

Insights to link to the idea.

accountIdsuuid[]

Accounts related to the Idea. Link only Accounts supported by its source or Evidence; the relationship does not claim current usage or endorsement.

validateInsightLinksboolean

Set true only when insightIds are an explicitly confirmed evidence path. Existing confirmed links are never demoted when omitted or false.

classificationsClassificationAssignment[]

Patch-style workspace taxonomy assignments. Use group keys plus option keys or labels from the active taxonomy. Each item must provide optionValues for a list group or textValue for a text group.

Responses

201
Created

The idea was successfully created.

Schema

Example Request

POST
/external/v1/ideas
json
{
  "name": "AI-powered search",
  "description": "Use LLMs to improve search relevance...",
  "sourceKey": "research-repository",
  "externalId": "proposal-184",
  "accountIds": [
    "account-uuid"
  ],
  "classifications": [
    {
      "groupKey": "stage",
      "optionValues": [
        "validation"
      ]
    },
    {
      "groupKey": "phi_level",
      "optionValues": [
        "high"
      ]
    }
  ]
}

Example Response

201 Created
json
{
  "id": "uuid",
  "name": "AI-powered search",
  "sourceKey": "research-repository",
  "externalId": "proposal-184",
  "accountIds": [
    "account-uuid"
  ],
  "provenance": {
    "method": "external_api"
  },
  "taxonomyVersionId": "taxonomy-version-uuid",
  "classifications": [
    {
      "groupKey": "stage",
      "optionLabels": [
        "Validation"
      ]
    },
    {
      "groupKey": "phi_level",
      "optionLabels": [
        "High"
      ]
    }
  ]
}
PATCH

Update an idea

PATCH /external/v1/ideas/:id

Modify an existing idea by its internal UUID or human-readable public ID. Classification assignments patch only the supplied workspace taxonomy groups; omitted groups remain unchanged. An idea can belong to only one Initiative: use projectId: null to detach it before attaching it to a different Initiative.

Requirements

API scopes required:
ideas:write

Request

Parameters

NameTypeDescription
id *stringThe internal UUID or public ID (for example, IDEA-42)

Request body (application/json)

namestring

Updated name

descriptionstring

Updated description

projectIdstring | null

Initiative UUID/public ID to attach this idea to, or null to detach it

featureIdsuuid[]

Replace related Features and take manual ownership. An empty list removes them; future automatic matches do not restore them.

insightIdsuuid[]

Replacement set of linked Insights.

accountIdsuuid[]

Replacement set of related workspace Accounts. Use only source-supported links; a relationship does not claim current usage or endorsement.

validateInsightLinksboolean

Set true only to confirm the supplied insightIds as validated evidence links.

classificationsClassificationAssignment[]

Workspace taxonomy assignments. Use optionValues: [] or textValue: null to mark a supplied group unassigned.

Responses

200
Updated

Schema
400
Invalid Initiative link

The target is invalid, or the idea is already linked to another Initiative. Detach it with projectId: null before attaching the new Initiative.

Example Request

PATCH
/external/v1/ideas/:id
curl
curl -X PATCH https://zentrik.ai/api/external/v1/ideas/IDEA-42 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"projectId":"INITIATIVE-7","accountIds":["account-uuid"],"classifications":[{"groupKey":"category","optionValues":["workflow"]}]}'
DELETE

Delete an idea

DELETE /external/v1/ideas/:id

Permanently delete an idea by its internal UUID or human-readable public ID.

Requirements

API scopes required:
ideas:delete

Request

Parameters

NameTypeDescription
id *stringThe internal UUID or public ID (for example, IDEA-42)

Responses

200
Success

Example Request

DELETE
/external/v1/ideas/:id
curl
curl -X DELETE https://zentrik.ai/api/external/v1/ideas/IDEA-42 \
  -H 'Authorization: Bearer YOUR_API_KEY'
DELETE

Delete an idea comment

DELETE /external/v1/ideas/:id/comments/:commentId

Delete one comment from an idea without deleting or rewriting the idea. External API keys are workspace-admin credentials because only workspace owners/admins can create them.

Requirements

API scopes required:
ideas:delete

Request

Parameters

NameTypeDescription
id *stringThe idea's internal UUID or public ID (for example, IDEA-42)
commentId *stringThe comment UUID

Responses

200
Deleted

The scoped comment was deleted. The receipt does not include comment content.

Schema
IdeaCommentDeletionReceipt
404
Not found

The idea is outside the API-key workspace, or the comment does not belong to that idea and workspace.

Example Request

DELETE
/external/v1/ideas/:id/comments/:commentId
curl
curl -X DELETE https://zentrik.ai/api/external/v1/ideas/IDEA-42/comments/COMMENT_UUID \
  -H 'Authorization: Bearer YOUR_API_KEY'

Example Response

200 OK
json
{
  "success": true,
  "ideaId": "uuid",
  "ideaPublicId": "IDEA-42",
  "commentId": "uuid"
}

Data Models

The Idea model represents a potential feature or solution that addresses identified opportunities.

Idea Object

FieldTypeDescription
iduuidThe unique identifier for the idea.
namestringThe title or name of the feature idea.
descriptionstringDetailed description of the proposed solution.
statusstringThe workspace-configured Idea workflow status.
productIduuidThe ID of the product this idea belongs to.
featureIdsuuid[]Related Product Feature IDs, available in list and detail reads.
featureMatchingobject | nullMatching status, applied matches and review suggestions. Each selection includes featureId, reasoning and an exact sourceQuote.
projectIduuid | nullThe initiative this idea is attached to, or null when it is not attached.
integrationIduuid | nullThe integration this idea was imported from, or null when it was not created via an integration.
sourceKeystring | nullThe stable source namespace used with externalId for idempotent synchronization.
externalIdstring | nullThe idea's identifier within sourceKey, or within its connected integration.
createdSourcestring | nullLegacy-compatible creation-channel classification.
provenanceobject | nullDurable creation origin. External API callers cannot rewrite this value after creation.
opportunityIdsuuid[]List of opportunities that this idea addresses.
insightIdsuuid[]List of insights that inspired this idea.
taxonomyVersionIduuid | nullThe active workspace taxonomy version used when classifications were written.
classificationSummaryobjectCurrent saved taxonomy summary when include=classifications is requested or classifications are written.
classificationsClassificationValue[]Persisted classification values returned with include=classifications or a classification write.
createdAtiso-dateCreation timestamp.
updatedAtiso-dateLast update timestamp.