Settings & engagement
Read a project’s curated settings, its engagement policy, and the workspace’s LinkedIn company pages. Over REST this family is read-only by design — the settings writes exist only on MCP behind two-phase confirmation, because settings text becomes prompt content for future AI generations and engagement policies act under a LinkedIn identity. Full schemas: OpenAPI reference → Settings.
Both scopes are grantable to API keys and OAuth tokens alike — see
auth.md §1.2.
GET /v1/settings
Structured fields only: generation-context knobs (language, formality,
length/formatting/emoji preferences), the project tone-of-voice fields,
the workspace custom-instruction state, calendar settings, and content
pillars. The rendered prompt context is never returned — you get
the same knobs the dashboard shows, not the compiled instructions.
Two parts of the response are worth calling out:
- The stored preference integers come with word labels. The
length/formatting/emoji preferences are stored as integers whose
numbers are neither ordinal nor consistent with each other, so
contextcarriespostLengthPreferenceLabel,formattingPreferenceLabelandemojiPreferenceLabel— derived through the same mapping the generators use. Read the labels; the MCP write takes the same words (update_tone_of_voice). calendarincludes the recurring posting-time template.calendar.schedule.slots[](each a wall-clocktimeplus itsdays) andpostsPerWeek, expressed incalendar.effectiveTimezone(always an IANA name —calendar.timezoneis the raw stored value and may benullor legacy). This is the templateGET /v1/calendar/next-free-slotwalks, and what the MCPupdate_posting_schedulereplaces.
GET /v1/engagement-policy
A project’s auto-engagement configuration: the like/comment/reshare
defaults (OFF | REQUEST | ON), per-requester overrides, the stored
LinkedIn connection state that determines whether engagement can be
enabled, and the plan-lock state — locked workspaces still see what
would unlock.
Answer from effective, not policy. policy is the stored row
and it is null for most projects — which is not “anything might
happen”: activation fails closed, so a project with no row is declined.
effective is always present and reports what actually happens right
now, with source: "policy" (stored defaults) or "no_policy"
(fail-closed default). See
MCP tools §1.15
for why the distinction is load-bearing.
GET /v1/company-pages
The workspace’s LinkedIn company pages — the delta over
GET /v1/projects: activation status, stored admin-token health
(as of last validation, never a live LinkedIn probe), follower count,
and engagement-policy state.
Writing settings (MCP only)
update_tone_of_voice— project-level tone-of-voice/context writes. Two-phase (the proposal renders the full new text next to current values) and restricted to workspace admins.update_engagement_policy— sets the auto-engagement defaults toOFForREQUESTonly. Turning a policy fullyON(autonomous engagement under the project’s LinkedIn identity) is deliberately dashboard-only. Disarming (all-OFF) is always allowed; anything else needs an eligible plan. A LinkedIn connection is needed to publish, not to store the policy.update_positioning/update_global_tone_of_voice— the WORKSPACE-level positioning documents and the organization-wide tone of voice (Business plan). Empty fields write directly; replacing text a person already wrote is two-phase viaoverwrite: true.update_personal_dna— ONE brand’s personal DNA (who the author is, credibility points, opinions & hot takes, stories; the person document behind Brand → Positioning → “You”). Same empty-vs-occupied rule and overwrite confirmation;get_personal_dnais the read side.update_posting_schedule— replaces the recurring posting-time template read fromGET /v1/settings. Two-phase, full-state,calendar:write.
settings:write scope — never implied by
write or anything else, so an integration can only reach them if the
user consented to that scope by name.