Skip to main content
GET
/
v2
/
workspace
/
facts
GTM Profile
curl --request GET \
  --url https://api.opennous.cloud/v2/workspace/facts \
  --header 'Content-Type: application/json' \
  --data '
{
  "section": "<string>",
  "content": "<string>",
  "mode": "<string>",
  "supersedes": "<string>"
}
'
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

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

Query params

categories
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.
limit
number
default:"50"
Max facts to return. Cap 500.

Response

{
  "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 update_gtm_profile tool.
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"
  }'
section
string
required
One of ICP, Market, Product, Pricing, Competitors, Positioning (these feed the ICP scoring model), GTM Motion, or Notes.
content
string
required
The section’s current content — one short, current statement, not an essay.
mode
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.
supersedes
string
Explicit fact id to replace (overrides section matching).
{
  "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 with a note.<uuid> property on the workspace entity. All write paths produce the same asserted-claim records this endpoint reads.