---
title: "Search content, narratives, patterns and creators"
method: POST
path: "/search"
---

# Search content, narratives, patterns and creators

`POST /search`

## Request

- Base URL: `https://api.kinetk.ai/graph`
- URL: `https://api.kinetk.ai/graph/search`
- Auth: API key in header `x-api-key`

Synchronous search over the live corpus. Returns up to `limit` ranked content rows (default 100, max 300) plus the narratives, patterns and creators they belong to, with ids for `GET /narratives/{id}` and `GET /intelligence/patterns/{patternKey}` (`patterns` is currently always empty while it is switched off). Costs $0.010 per content row returned. A search that runs past its time budget returns `202` with an `insights` job to poll. For larger pulls or deep analysis, use `POST /intelligence/jobs`.

## Request body

- ISearchBody
  - `limit` number: Max content rows to return (default 100, max 300). Larger pulls belong to a `records` job.
  - `query` string, required: Free-text query.
  - `window` '30d' | '7d' | '90d' | 'all': `7d`, `30d`, `90d` or `all`. Defaults to `30d`.

## Response `200`

Successful response

- ISearchResponse
  - `content` ISearchContentItem[], required
    - `authorReach` number, required
    - `commentCount` number, required
    - `contentType` string, nullable
    - `creatorId` number, nullable
    - `description` string, nullable
    - `engagementDepth` number, required
    - `engagementScore` number, required
    - `enrichment` PublicEnrichment
      - `aestheticStyle` string[], required
      - `attributeConfidence` number, nullable, required
      - `brandProducts` string[], required
      - `coverage` object, required
        - `attributes` boolean, required
        - `novelty` boolean, required
        - `sentiment` boolean, required
      - `emotionMood` string[], required
      - `noveltyScore` number, nullable, required
      - `saturationScore` number, nullable, required
      - `themes` string[], required
      - `tone` string, nullable, required
      - `toneConfidence` number, nullable, required
    - `exampleRankingScore` number, required
    - `followerCount` number, nullable
    - `intentEvidenceSource` 'authored_text' | 'no_match' | 'no_text' | 'tag_only'
    - `intentSimilarity` number, nullable
    - `likeCount` number, required
    - `narrativeIds` string[], required: Ids of the current-generation narratives this row belongs to (for GET /narratives/{id}).
    - `patternKeys` string[], required: Keys of the current-generation patterns this row belongs to (for GET /intelligence/patterns/{patternKey}).
    - `platform` string, nullable
    - `publishedAt` string, nullable
    - `rawSimilarity` number, required
    - `recencyScore` number, required
    - `relevance` number
    - `rrfScore` number, required
    - `shareCount` number, required
    - `similarity` number, required
    - `tags` string[], required
    - `title` string, nullable
    - `uuid` string, required
    - `viewCount` number, required
  - `creators` ISearchCreator[], required
    - `creatorId` number, required
    - `followerCount` number, nullable, required
    - `hits` number, required: Number of returned content rows authored by this creator.
    - `platform` string, required
  - `narratives` ISearchNarrative[], required
    - `acceleration` number, nullable
    - `computed_at` string, required
    - `content_count` number, required
    - `creator_count` number, required
    - `diffusion` number, nullable
    - `emerging_score` number, required
    - `id` string, required
    - `label` string, required
    - `lifecycle` string, nullable
    - `memberOverlap` number: Retrieved content rows belonging to this narrative (tracked membership path only).
    - `momentum_score` number, required
    - `narrative_key` string, nullable
    - `overlapZScore` number: How far that overlap exceeds what the narrative's share of the map predicts, in units of its own noise. A comparative score for ranking and display, not a threshold: admission uses an exact significance test, so every narrative returned has already cleared it (tracked membership path only).
    - `overlap_count` number
    - `platform_count` number, required
    - `queryRelevance` number: How closely the narrative's members match the query, 0-1 (emergent path only).
    - `representative_content_uuid` string, nullable
    - `score_breakdown` INarrativeScoreBreakdown, required
      - `clustering_method` string
      - `content_count` number, required
      - `creator_count` number, required
      - `pair_count` number
      - `platform_count` number, required
      - `seed_tag` string
      - `total_engagement` number, required
    - `sentiment_breakdown` INarrativeSentimentBreakdown
      - `coverage` number
      - `dominant_tone` string, nullable
      - `stance` object, nullable
        - `critical` number, required
        - `mixed` number, required
        - `neutral` number, required
        - `supportive` number, required
      - `stance_coverage` number
    - `sentiment_label` string, nullable
    - `sentiment_score` number, nullable
    - `source` 'emergent' | 'tracked', required
    - `summary` string, required
    - `text_rank` number
    - `top_tags` string[], required
    - `total_engagement` string, required
    - `trajectory_confidence` string, nullable
    - `velocity` number, nullable
    - `window_end` string, required
    - `window_key` '30d' | '7d' | '90d' | 'all', required: The precomputed window a tracked narrative belongs to, or the search window an emergent one was formed from.
    - `window_start` string, required
  - `patterns` ISearchPattern[], required
    - `lexicalMatch` number, required: Share of query terms found in the pattern's label/summary/elements.
    - `lookalikes` object[], required
      - `centroidCosine` number, required
      - `corroborationCount` number, required
      - `label` string, required
      - `patternKey` string, required
      - `sharedElements` PatternSharedElements, required
      - `tagJaccard` number, required
    - `memberTextMatch` number, required: Share of the pattern's posts whose own text matches the query.
    - `pattern` PatternDetail, required
      - `clusteringMethod` string, required
      - `confidence` number, required
      - `contentCount` number, required
      - `creatorCount` number, required
      - `earlyCount` number, required
      - `firstSeenAt` string, required
      - `generation` string, required
      - `label` string, required
      - `labelSource` string, required
      - `lateCount` number, required
      - `lateShare` number, nullable, required
      - `medoidContentUuids` string[], required
      - `patternKey` string, required
      - `platformCount` number, required
      - `reconciliation` object, nullable, required
        - `cosine` number, required
        - `memberOverlap` number, nullable, required
      - `recurrentElements` object[], required
        - `support` number, required
        - `type` string, required
        - `value` string, required
      - `scopeDays` number, required
      - `summary` string, nullable, required
      - `tagAttachedMembers` number, required
      - `totalEngagement` number, required
      - `trajectory` object[], required
        - `contentCount` number, required
        - `creatorCount` number, required
        - `generation` string, required
    - `queryRelevance` number, required: Blended relevance: visual + lexical. What the ranking uses.
    - `representativeContent` object[], required
      - `centroidSimilarity` number, nullable, required
      - `contentUrl` string, nullable, required
      - `contentUuid` string, required
      - `description` string, nullable, required: Falls back for the many platforms that post without a title.
      - `engagement` number, required
      - `isRepresentative` boolean, required
      - `platform` string, nullable, required
      - `publishedAt` string, nullable, required
      - `title` string, nullable, required
    - `visualSimilarity` number, required: Query-to-centroid cosine on its own (small magnitudes are normal).
  - `query` string, required
  - `request_id` string, required: Request id; quote it when contacting support about a call.
  - `response_time_ms` number, required
  - `usage` object, required
    - `credits` number, required: Credits charged for this call: $0.010 per content row returned.
  - `window` '30d' | '7d' | '90d' | 'all', required

## Other responses

- `202`: The search ran past its time budget: its charge was refunded and an `insights` job was submitted instead. Poll `statusUrl`.
- `400`: Rejected input: `window` other than `7d`/`30d`/`90d`/`all`, `limit` above 300 or not a positive integer, or an undeclared field.
- `402`: Insufficient credits. The body reports the credits required vs available plus budget recommendations (max affordable limit, top-up URL).
- `default`: Error response

## Changes

- **2026-10-09** (0.1) `3167795a69e5`: 5 warning, 1 info
  - removed the request property `platforms`
  - removed the request property `types`
  - added the new `90d` enum value to the `narratives/items/window_key` response property for the response status `200`
  - added the new `90d` enum value to the `window` response property for the response status `200`
  - …2 more
- **2026-10-09** (0.1) `c9c05c737ac8`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/kinetk/apis/kinetk-graph-service-api/changes/search/post.md)

---

[API](https://skmtc.dev/kinetk/apis/kinetk-graph-service-api.md) - [All operations](https://skmtc.dev/kinetk/apis/kinetk-graph-service-api/llms.txt) - [OpenAPI document](https://skmtc.dev/kinetk/apis/kinetk-graph-service-api/revisions/3167795a69e5?raw)
