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

# Read a project's curated 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 (pure read — never inserts), and content
pillars. The rendered prompt context is never returned.
Settings writes have no REST surface; they live on MCP behind
two-phase confirmation. Requires the `workspace:read` scope.




## OpenAPI

````yaml /openapi/v1.yaml get /settings
openapi: 3.1.0
info:
  title: Scripe Public API
  version: '2026-08-10'
  summary: >-
    Read and write Scripe workspace data — posts, notes, ideas, sources,
    knowledge, media, analytics, usage, async jobs, and webhooks.
  description: |
    The Scripe public API gives integrators stable, versioned access to a
    workspace's content surface: reads across every resource, synchronous
    writes (notes, posts, ideas, text sources, media assets), async jobs
    (post generation, file/URL/YouTube ingest, image and carousel
    generation), usage meters, and outbound webhooks.

    All endpoints (except `/v1/health`) require a Bearer token — either a
    workspace API key (`scripe_sk_*`) or an OAuth 2.1 access token
    (`scripe_oat_*`). Pin the API version with the `Scripe-Api-Version`
    request header to opt out of breaking changes.
  contact:
    name: Scripe Support
    url: https://scripe.io/support
    email: support@scripe.io
  license:
    name: Proprietary
servers:
  - url: https://api.scripe.io/v1
    description: Production
security:
  - BearerApiKey: []
tags:
  - name: Health
    description: Liveness and authenticated key smoke tests.
  - name: Workspace
    description: The workspace + principal resolved from your API key.
  - name: Projects
    description: Personal-brand, company-page, and amplifier projects.
  - name: Notes
    description: Project notes with paired calendar slot.
  - name: Posts
    description: Drafts, scheduled, and published LinkedIn posts.
  - name: Analytics
    description: Your own LinkedIn analytics and viral-post inspiration search.
  - name: Sources
    description: Transcriptions (audio/video sources) with truncated body.
  - name: Uploads
    description: >-
      Pre-signed S3 PUT URLs the customer uploads bytes to before referencing
      via Sources or Knowledge.
  - name: Knowledge
    description: >-
      Knowledge-base documents indexed for RAG. Async ingest via text, file,
      URL, or YouTube.
  - name: Jobs
    description: >-
      Async-job lifecycle — submitted via post-generation, knowledge ingest,
      file source.
  - name: Calendar
    description: >-
      The content calendar — scheduled/planned posts, note slots, idea
      placements, and the posting-time template.
  - name: Ideas
    description: >-
      The idea board — creative briefs with derived workflow statuses and
      date-level calendar placement.
  - name: Media
    description: >-
      Media-library search, own-image imports, AI image generation, and
      full-state media writes onto posts.
  - name: Settings
    description: >-
      Curated project settings, engagement policy, and company pages (read-only
      over REST).
  - name: Webhooks
    description: |
      Outbound HTTP callbacks. Subscribe an endpoint to one or more
      event names; we POST a signed JSON payload every time a matching
      event fires in the workspace. The signing secret is shown once
      on create and once on rotate — verify the
      `Webhook-Signature: t=<ts>,v1=<hmac>` header on every delivery.
paths:
  /settings:
    get:
      tags:
        - Settings
      summary: Read a project's curated settings
      description: |
        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 (pure read — never inserts), and content
        pillars. The rendered prompt context is never returned.
        Settings writes have no REST surface; they live on MCP behind
        two-phase confirmation. Requires the `workspace:read` scope.
      operationId: getSettings
      parameters:
        - $ref: '#/components/parameters/ScripeApiVersion'
        - name: projectId
          in: query
          required: true
          schema:
            type: string
            example: proj_a1b2c3d4e5f6g7h8
      responses:
        '200':
          description: The project's settings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectSettingsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    ScripeApiVersion:
      name: Scripe-Api-Version
      in: header
      required: false
      description: |
        Pin the API version. Format `YYYY-MM-DD`. Omit to receive the
        currently rolling default. Unknown versions return `400
        version_unsupported`.
      schema:
        type: string
        example: '2026-08-10'
  schemas:
    ProjectSettingsResponse:
      type: object
      required:
        - data
      properties:
        data:
          type: object
          required:
            - project
            - context
            - toneOfVoice
            - organization
            - calendar
            - pillars
          properties:
            project:
              type: object
              required:
                - id
                - name
                - type
              properties:
                id:
                  type: string
                  example: proj_a1b2c3d4e5f6g7h8
                name:
                  type: string
                  description: >-
                    Display name, derived the same way as `list_projects`: the
                    LinkedIn-derived name for a personal brand, the page's
                    localized name for a company page, falling back to the
                    stored project name. Empty only when no source carries one.
                type:
                  type: string
                  example: PERSONAL_BRAND
            context:
              type: object
              nullable: true
              description: >-
                Generation-context knobs. The three `*Preference` values are
                stored integers whose scales are neither ordinal nor consistent
                with each other — 3 is the LONGEST post length and the SHORTEST
                sentence style — so each ships with the word it means. The label
                is derived through the same mapping the prompt builders use, so
                it describes what generation will actually do, including for
                historical rows holding a number no picker offers (a stored `0`
                post length reads back as `standard`). The labels are also what
                the MCP `update_tone_of_voice` tool accepts back.
              properties:
                language:
                  type: string
                  nullable: true
                germanFormality:
                  type: string
                  nullable: true
                postLengthPreference:
                  type: integer
                  nullable: true
                  example: 2
                postLengthPreferenceLabel:
                  type: string
                  nullable: true
                  enum:
                    - short
                    - standard
                    - long
                    - null
                  example: standard
                formattingPreference:
                  type: integer
                  nullable: true
                  example: 0
                formattingPreferenceLabel:
                  type: string
                  nullable: true
                  enum:
                    - short
                    - standard
                    - long
                    - null
                  description: >-
                    Sentence length — `short` is stored as 3, `standard` as 0,
                    `long` as 2.
                  example: standard
                emojiPreference:
                  type: integer
                  nullable: true
                  example: 3
                emojiPreferenceLabel:
                  type: string
                  nullable: true
                  enum:
                    - none
                    - moderate
                    - frequent
                    - null
                  example: moderate
            toneOfVoice:
              type: object
              nullable: true
              properties:
                customInstructions:
                  type: string
                  nullable: true
                customInstructionsEnabled:
                  type: boolean
                ctas:
                  type: string
                  nullable: true
                footer:
                  type: string
                  nullable: true
                footerEnabled:
                  type: boolean
                emojis:
                  type: array
                  items:
                    type: string
                bulletSymbols:
                  type: array
                  items:
                    type: string
                userModified:
                  type: boolean
                  description: >-
                    Human-touched latch — AI tone regeneration skips rows marked
                    true.
            organization:
              type: object
              nullable: true
              description: Workspace-level custom instructions (read-only on this surface).
              properties:
                customInstructions:
                  type: string
                  nullable: true
                customInstructionsEnabled:
                  type: boolean
                footer:
                  type: string
                  nullable: true
                footerEnabled:
                  type: boolean
                allowPersonalBrandCustomInstructions:
                  type: boolean
            calendar:
              type: object
              nullable: true
              required:
                - timezone
                - effectiveTimezone
                - weekStartsOn
                - schedule
              properties:
                timezone:
                  type: string
                  nullable: true
                  description: Raw stored value — null until the user picks one.
                effectiveTimezone:
                  type: string
                  description: >-
                    The zone scheduling actually uses — the stored value, or the
                    legacy default when none was picked. Always reported as an
                    IANA name: the stored default is the abbreviation "CET",
                    which names UTC+1 while the zone runs at UTC+2 for seven
                    months of the year, so a client converting the schedule's
                    wall clocks with the label would land an hour early.
                  example: Europe/Berlin
                weekStartsOn:
                  type: string
                  enum:
                    - sunday
                    - monday
                schedule:
                  $ref: '#/components/schemas/PostingSchedule'
            pillars:
              type: array
              items:
                type: object
                required:
                  - title
                  - subtopics
                  - order
                properties:
                  title:
                    type: string
                    nullable: true
                  subtopics:
                    type: array
                    items:
                      type: string
                  order:
                    type: integer
    PostingSchedule:
      type: object
      required:
        - slots
        - postsPerWeek
      description: >-
        The project's recurring posting-time template — the weekly slots `GET
        /v1/calendar/next-free-slot` suggests from and the calendar draws as
        open. An empty `slots` array means the project has no posting schedule,
        which is why that endpoint answers `source: "fallback"`. Changing it is
        MCP-only (`update_posting_schedule`), because the write is two-phase.
      properties:
        slots:
          type: array
          items:
            $ref: '#/components/schemas/PostingScheduleSlot'
        postsPerWeek:
          type: integer
          description: >-
            Slots x their enabled days — how many posting times a week the
            template holds.
          example: 3
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
            - request_id
            - docs_url
          properties:
            code:
              type: string
              description: Stable, machine-readable error identifier.
              example: not_found
            message:
              type: string
            request_id:
              type: string
              example: req_a1b2c3d4e5f6
            docs_url:
              type: string
              format: uri
            details:
              description: Optional structured payload — shape varies per code.
    PostingScheduleSlot:
      type: object
      required:
        - time
        - hour
        - minute
        - days
      description: >-
        One recurring posting time and the weekdays it fires on. `time` + `days`
        is exactly the pair the MCP `update_posting_schedule` tool takes back;
        `hour`/`minute` repeat it in the form `GET /v1/calendar`'s
        `templateSlots` has always reported.
      properties:
        time:
          type: string
          description: Wall clock in the project's calendar timezone, 24-hour HH:MM.
          example: '09:00'
        hour:
          type: integer
          minimum: 0
          maximum: 23
        minute:
          type: integer
          minimum: 0
          maximum: 59
        days:
          type: array
          description: Lowercase English weekday names, in week order.
          items:
            type: string
            enum:
              - sunday
              - monday
              - tuesday
              - wednesday
              - thursday
              - friday
              - saturday
          example:
            - monday
            - thursday
  responses:
    BadRequest:
      description: Malformed request (bad cursor, bad limit, etc.).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Missing, malformed, expired, or revoked API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: Plan not eligible, scope missing, or workspace mismatch.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Resource not found in this workspace.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: Sliding-window rate limit exceeded.
      headers:
        Retry-After:
          schema:
            type: integer
        X-RateLimit-Limit:
          schema:
            type: integer
        X-RateLimit-Remaining:
          schema:
            type: integer
        X-RateLimit-Reset:
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    BearerApiKey:
      type: http
      scheme: bearer
      bearerFormat: scripe_sk_live_*
      description: |
        Pass `Authorization: Bearer scripe_sk_live_<...>` (or
        `scripe_sk_test_<...>` for test keys) on every request. Keys
        are scoped to a single workspace and can be revoked from the
        Scripe dashboard.

        The same header also accepts an OAuth 2.1 access token
        (`scripe_oat_*`); both credentials share one scope vocabulary
        and every operation below documents the scope it requires.
        An API key can hold every scope named on this surface except
        `webhooks:manage`, which is grantable to OAuth tokens only
        today — the webhook-endpoint operations answer
        `403 scope_missing` to every API key. Operations that name no
        scope accept any valid token of the workspace.

````