Strategic Briefing

Get one briefing edition by id

Get one strategic briefing edition by runId, in exactly the same shape as GET /strategic-briefing.

Take the runId from GET /strategic-briefing/history (or from meta.runId on a current read). Accepts the same sections and includeCharts options, with the same ["hub"] default.

A runId naming a run that failed or is still generating returns 200 with meta.status set accordingly and item null — that run genuinely produced no edition, which is an answer rather than an error. A malformed id returns 400 invalid_run_id; an id that does not belong to this project returns 404 run_not_found.

Use this to read or quote a specific past edition. For the current state use GET /strategic-briefing.

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

Request

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

Path parameters

runIdstring required
Example:6a3950c06bda450a1372048e

Briefing run ID, from meta.runId or a history row

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.