Skip to main content
GET
/
api
/
context
Read saved workspace context
curl --request GET \
  --url https://app.puffle.ai/api/context \
  --header 'Authorization: Bearer <token>'
{
  "context": {
    "user": {
      "professionalBackground": "Former B2B SaaS founder, now building GTM tooling."
    },
    "company": {
      "overview": "Puffle is a unified GTM platform for founders doing outbound, enrichment, and deep research in one place.",
      "product": "Lead finder + AI-enriched lists + multi-channel campaigns + buying signals.",
      "problemSolved": "Founders stitching together 8+ tools to run outbound.",
      "differentiators": "Single workspace, AI-native, built for founders who drive sales themselves.",
      "linkedInPresence": "Active founder-led presence, product-build-in-public posts."
    },
    "content": {
      "linkedInVoice": "Direct, candid, founder-to-founder.",
      "recommendedTopics": [
        "outbound",
        "GTM",
        "AI sales tooling"
      ],
      "preferredTone": "Confident, plainspoken, no fluff.",
      "contentFormats": [
        "text post",
        "carousel"
      ],
      "topicsToAvoid": [
        "politics",
        "motivational platitudes"
      ],
      "postingCadence": "3x/week"
    },
    "market": {
      "targetAudience": "Series A–B B2B SaaS founders running their own outbound.",
      "industryContext": "Crowded sales tooling market with fragmented point solutions.",
      "icpJobTitles": [
        "Founder",
        "CEO",
        "Head of GTM"
      ],
      "icpIndustries": [
        "B2B SaaS",
        "Developer tools",
        "Fintech"
      ],
      "icpCompanySizes": [
        "11-50",
        "51-200"
      ],
      "icpPainPoints": [
        "Manually coordinating across 8 tools",
        "Brittle enrichment data"
      ],
      "icpKeywords": [
        "outbound",
        "GTM",
        "founder-led sales"
      ]
    },
    "extra": null
  },
  "profile": {
    "firstName": "Sarah",
    "lastName": "Chen",
    "companyName": "Acme",
    "website": "https://acme.com",
    "linkedinUrl": "https://linkedin.com/in/sarahchen",
    "companyLinkedinUrl": "https://linkedin.com/company/acme",
    "lastContextRegeneratedAt": "2026-04-19T12:00:00Z"
  }
}

Overview

Returns the structured context for the authenticated workspace — ICP, company positioning, content strategy, and the user’s professional background — plus the identity fields (name, website, LinkedIn URLs) stored alongside it. Every downstream action that generates content (messages, deep research, lead filters) implicitly uses this context server-side. null on either context or profile means onboarding hasn’t produced a user_profiles row yet — treat as “not onboarded, escalate.”
This operation shares the URL path /api/context with the update verb. See Update saved workspace context to replace the full context object.

The second call in the agent boot sequence

This is step 2 of the prescribed boot sequence for every agent session:
1. GET  /api/onboarding/status    → is the workspace set up?
2. GET  /api/context              → what do I know about this user?
See the full boot sequence in the Agent Playbook. Skipping it leads to agents operating on stale or missing assumptions — wrong ICP, empty context, incorrect downstream generation. After reading the context you should be able to:
  • Narrate the user’s business back to them when asked
  • Detect a mismatch between the task and the ICP and flag it before running work
  • Self-select the right downstream journey (the “inbox” journey only makes sense if at least one campaign has launched, etc.)

AI agent notes

Do not invent context. When an agent doesn’t have explicit user input, prefer asking the human for specifics or running regenerateContext to auto-derive from a LinkedIn URL + website. Made-up ICPs will quietly corrupt every downstream generation.null means not onboarded. context: null or profile: null on GET — treat as “workspace incomplete.” Do not attempt to PUT a filled-out context on a workspace that has no profile row; run onboarding first.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Response

Context + identity fields. Both are null when the workspace has no profile row yet (new user mid-onboarding).

context
object
required

Assembled workspace context. Each sub-object is stored as a separate JSONB column on user_profiles and merged at read time.

profile
object
required

Identity fields stored alongside the context JSONB columns. Returned so a UI can render a full profile page without a second round-trip.