GET /company
isEmpty— nothing is filled in, so nothing is injected into runs.needsReview— an auto-drafted profile with actual content is still unconfirmed. A blank draft doesn’t count, so this never puts a review banner over an empty form.confirmedAt: null— still a draft. It is injected anyway, flagged low-confidence, but itsconstraints/doNotTouchrules stay inactive until confirmed.
PATCH /company
Send only the fields you’re changing. An edit counts as confirmation — you just typed it.
Passing
null clears a field. An array always replaces — send the full list.
PATCH /company/apps/:appId
POST /company/confirm
Accepts an auto-draft as-is, without editing it. This is what activates the hard rules.{"confirmed": true} on success.
POST /company/extract
Derives profile fields frombusiness_context.md. Explicit rather than automatic, because it both writes and queues.
filled— the field was empty, so the value was written straight in.proposed— the field disagreed, so it became a knowledge patch for you to review.rewordsDropped— proposals that restated your value with less in it, thrown away rather than queued.status: "skipped"with areasonwhen there’s no document or nothing usable in it.
GET /company/preview
The exact text injected into that app’s runs — profiles and pinned documents together, because that’s what the agent actually receives.Related
- Documents API —
business_context.mdand the rest of the Library - Knowledge Patches API — the review queue

