> ## Documentation Index
> Fetch the complete documentation index at: https://docs.opennous.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# GTM Profile

> The user's own GTM profile — ICP, target market, product, pricing, competitors. Workspace-level, not per-entity.

Where the per-entity endpoints (`/v2/accounts/:id`, `/v2/context`) return facts about **people and companies**, this returns the workspace owner's own **GTM profile** — what they sell, who they sell to, pricing, and positioning — the context an agent should reference when answering questions like "what's our ICP?" or "what's our pricing?"

## Request

```bash theme={null}
curl 'https://api.opennous.cloud/v2/workspace/facts?categories=ICP,Market&limit=20' \
  -H 'Authorization: Bearer YOUR_API_KEY'
```

### Query params

<ParamField query="categories" type="string">
  Comma-separated list to filter (e.g. `ICP,Pricing`). Omit to return all categories.

  Common categories: `ICP`, `Market`, `Product`, `Pricing`, `Competitors`, `Playbook`. Users can add any custom category in the in-app GTM Context tab.
</ParamField>

<ParamField query="limit" type="number" default="50">
  Max facts to return. Cap 500.
</ParamField>

## Response

```json theme={null}
{
  "facts": [
    {
      "id": "7e2bd11f-...",
      "category": "ICP",
      "content": "GTM Engineers or RevOps leaders at B2B SaaS, 50-200 employees, US.",
      "source": "manual",
      "recorded_at": "2026-05-24T16:37:54Z"
    },
    {
      "id": "aec9de1c-...",
      "category": "Pricing",
      "content": "Free self-host. Scale $99/mo. Agency $499/mo.",
      "source": "manual",
      "recorded_at": "2026-05-20T11:02:00Z"
    }
  ],
  "count": 2,
  "by_category": { "ICP": 1, "Pricing": 1 }
}
```

## When to call it

* **"What's our ICP?"** — `categories=["ICP"]`
* **"What's our pricing strategy?"** — `categories=["Pricing"]`
* **"What differentiates us from competitors?"** — `categories=["Competitors","Product"]`
* **"Show me the whole playbook"** — no `categories` filter

When you're writing an agent that drafts personalised outreach, the agent needs BOTH the contact's context (`/v2/context`) AND the user's GTM profile (`/v2/workspace/facts`). The GTM profile tells it how YOU sell; the context tells it about THEM. Combine for natural copy.

## Writing back

`POST` to the same path to keep a **section** of the GTM context current. Each section is a living file: in the default `replace` mode the new content **evolves** that section's belief — the prior version is kept as history, never silently contradicted — so you just write the section's current state. This is the endpoint behind the MCP [`set_workspace_profile`](/mcp/tools/set-workspace-profile) tool.

```bash theme={null}
curl -X POST https://api.opennous.cloud/v2/workspace/facts \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "section": "Pricing",
    "content": "Free self-host. Scale $149/mo. Agency $599/mo.",
    "mode": "replace"
  }'
```

<ParamField body="section" type="string" required>
  One of `ICP`, `Market`, `Product`, `Pricing`, `Competitors`, `Positioning` (these feed the ICP scoring model), `GTM Motion`, or `Notes`.
</ParamField>

<ParamField body="content" type="string" required>
  The section's current content — one short, current statement, not an essay.
</ParamField>

<ParamField body="mode" type="string" default="replace">
  `replace` evolves the section and keeps the prior version as history. `append` logs a new entry without replacing — the default for `Notes`.
</ParamField>

<ParamField body="supersedes" type="string">
  Explicit fact id to replace (overrides section matching).
</ParamField>

```json theme={null}
{
  "fact": { "id": "b8f0...", "category": "Pricing", "content": "Free self-host. Scale $149/mo. Agency $599/mo." },
  "section": "Pricing",
  "mode": "replace",
  "superseded": true
}
```

## How it gets there

The GTM profile is built through the in-app **GTM Context** tab (the guided Playbook setup, or added directly), through the `POST` write-back above, or via [`POST /v2/observations`](/public-api/observations) with a `note.<uuid>` property on the workspace entity. All write paths produce the same asserted-claim records this endpoint reads.
