Strategic Briefing

Get the current state of this project's strategic briefing

Get the current state of this project's strategic briefing — the synthesized, as-of competitive read (what changed and what it means). This is the ANALYZED briefing; for the raw monitoring data use the per-dimension dashboards (e.g. /pricing), and for the monitored-competitor roster use /competitors.

This returns the LATEST run, whatever state it is in. meta.status is that run's raw lifecycle status and is the field to branch on:

  • done — the run finished. item, coverage, contains and tickets are populated; this is the readable edition.
  • running — a briefing is being generated right now. item is null; meta.progress carries the step it is on and when it started. A run finishes within two hours — budget rather than busy-wait. Treat it as running until this status changes, and never infer that a run is late or failed from how long it has taken.
  • failed — the most recent attempt ended without producing an edition. item is null.
  • null — this project has never had a briefing run at all. This is the only value that means the project genuinely has nothing.

When meta.status is not done, THIS RUN has no content — which says nothing about whether the project has a briefing. A previously published edition is usually still readable: call GET /v1/projects/{projectId}/strategic-briefing/history to list the editions and …/history/{runId} to read one. Never report that no briefing is available on the strength of a null item — check history first.

A missing or non-accessible project returns 404 project_not_found; the briefing lifecycle itself never 404s.

Sections — lean by default. sections selects what to return and defaults to ["hub"] — the executive digest AND the navigation map. A hub diagnosis row that earned a deep-dive carries a deepDive pointer naming the dimension to read next — prefix it with deep- to form the section value (a pointer of ai-visibility → request sections=deep-ai-visibility). A row without one has no deep-dive this edition and its note says why; request a section only for a pointer that is present. Valid sections: hub, competitors, the fourteen deep-<dimension> deep-dives, or all for the full document. Charts are off by default (includeCharts=false returns each chart's title + note only); pass includeCharts=true for the full data series.

What the edition recommends doing is not a section. Every move in the edition lands on the project's Strategic Tickets board — as a new ticket, most important first, or on the ticket already there for that work (tickets.alreadyOnBoard). New tickets land in the triage column, and the team moves them from there; each carries the dimension and the estimate of the work where the edition gave them. Read the ones it opened with GET /v1/projects/{projectId}/tickets?origin=briefing&briefingRunId={runId}, taking {runId} from meta.runId. They are the team's from that moment: moving, editing or dismissing one changes the board, not the edition.

Returned with any finished edition, regardless of sections: coverage (methodology and data-quality caveats — read these before quoting any figure), contains (the list of sections this edition actually holds, so you can pick what to fetch next instead of requesting slots blind), and tickets (how many tickets this edition opened on the board and how many of them sit in each column, counted as you read). All three are null whenever meta.status is not done, which says nothing about whether earlier editions exist — check …/history.

Reading the numbers: the AI Visibility Score is 0–100 (higher is better); AI-visibility presence is the share of answers analysed that named a brand (higher is named more often) and is always read with its range; on a ticket this edition opened, impact is 1–4 (higher is more critical) and briefing.estimatedMinutes is the edition's own estimate of the work, null where it gave none — report that as unsized rather than as quick. A project's next scheduled briefing follows its plan's cadence: 30 days on Monitor, two weeks on Process. An edition run on request (Run an edition now) does not move it.

get/v1/projects/{projectId}/strategic-briefing

Request

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

Path parameters

projectIdstring required
Example:507f1f77bcf86cd799439011

Project ID

Query parameters

sectionsstring[]

Which sections to return. Defaults to ["hub"] — the executive digest and navigation map. Pass specific sections to go deeper (e.g. a hub diagnosis pointer of ai-visibility maps to deep-ai-visibility), or all for the full document. Prefer deriving deep-<dimension> values from the hub diagnosis pointers rather than requesting slots blind — the response's contains array lists exactly which sections exist for this edition, in this same vocabulary.

[
  "hub"
]
includeChartsboolean

Include full chart series data. Defaults to false — each chart returns its title and note only, with no underlying numbers. Pass true for the full series.

Response

itemobject nullable

The requested briefing sections, keyed by section name. Controlled by the sections query parameter, which defaults to ["hub"]. Free-form — each section is a generated block array. Null unless meta.status is done: a run that is still generating, or that failed, has no content of its own. That says nothing about whether the project has a briefing — an earlier edition is usually still readable via GET /strategic-briefing/history.

coverageobject nullable

Methodology and data-quality caveats for this edition — which figures are directional, what counts as noise, which sources were unavailable. Returned regardless of which sections were requested; read it before quoting any number. Null whenever meta.status is not done, and when a finished edition carries no coverage block. Null here means this run has no content — not that the project has no briefing; an earlier edition may still be readable via GET /strategic-briefing/history.

containsBriefingSectionName[] nullable

Manifest of what this edition actually holds — every section it contains, whether or not you requested it. Values are exactly the tokens the sections parameter accepts, so you can pass one straight back. Use it to decide what to fetch next rather than requesting slots blind: a section absent from this list does not exist for this edition, and requesting it is not an error — the key is simply missing from item. Null whenever meta.status is not done. That means this run holds no content — not that the project has no editions; check GET /strategic-briefing/history.

Example response

{
  "meta": {
    "runId": "6a3950c06bda450a1372048e",
    "editionNumber": 4,
    "startedAt": "2026-06-22T14:20:02.110Z",
    "briefingDate": "2026-06-22T15:51:24.443Z",
    "progress": {
      "startedAt": "2026-07-27T06:00:11.002Z",
      "updatedAt": "2026-07-27T06:41:03.771Z"
    }
  },
  "item": {
    "hub": {
      "kind": "hub",
      "blocks": [
        {
          "type": "headline",
          "verdict": "Pricing pressure is rising."
        }
      ]
    }
  },
  "coverage": {
    "type": "coverage",
    "items": [
      "review counts are directional"
    ]
  },
  "contains": [
    "hub",
    "competitors",
    "deep-ai-visibility",
    "deep-pricing"
  ],
  "tickets": {
    "total": 9,
    "byStatus": {
      "triage": 5,
      "todo": 3,
      "in_progress": 0,
      "done": 1,
      "dismissed": 0
    },
    "opened": [
      "507f1f77bcf86cd799439011",
      "507f1f77bcf86cd799439012"
    ],
    "commented": [
      {
        "ticketId": "507f1f77bcf86cd799439011",
        "commentId": "507f1f77bcf86cd799439021",
        "body": "On 14 Sep, before this ticket opened, ChatGPT named you in 2 of 8 answers. On 5 Oct, the first check after it closed, it named you in 4 of 8."
      }
    ],
    "alreadyOnBoard": [
      {
        "ticketId": "507f1f77bcf86cd799439011",
        "move": "Get onto the 2026 buyer guide",
        "status": "triage"
      }
    ],
    "recheckedUnchanged": [
      "507f1f77bcf86cd799439014"
    ]
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.