Cadencz Bootstrap API

One-request app-shell boot payload.

Operations 3

GET /api/v1/bootstrap Everything the app shell needs, in one request #
GET /api/v1/bootstrap/critical Load only the data that gates the authenticated shell #
GET /api/v1/bootstrap/deferred Warm non-critical workspace data after the shell renders #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/cadencz-com:cadencz-com-bootstrap-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

cadencz-com-bootstrap-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Cadencz Bootstrap API
  description: Cadencz Phase 0 API. Frontend developers can use this Swagger page as the live request/response contract. Click `Authorize` and paste a Supabase access token for user-scoped endpoints.
  version: 0.1.0
tags:
- name: Bootstrap
  description: One-request app-shell boot payload.
paths:
  /api/v1/bootstrap:
    get:
      tags:
      - Bootstrap
      summary: Everything the app shell needs, in one request
      description: 'Returns the payloads of `/me`, `/me/preferences`, `/channels`, `/billing/subscription`, `/billing/usage`, `/strategy`, `/plans/current`, `/brains` and `/media` in a single response, each byte-identical to what its own endpoint returns.


        Only `me` is required: it gates the shell, so if it fails the request fails. Every other section degrades to `null` with its name listed in `failed`, which the client should read as *fetch this one yourself*. A `null` section absent from `failed` is a genuine empty — today only `plan`, when the workspace has not generated one yet.'
      operationId: bootstrap_api_v1_bootstrap_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BootstrapResponse'
        '401':
          description: Missing or invalid Supabase bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Required infrastructure or provider config is unavailable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
      - SupabaseBearerAuth: []
  /api/v1/bootstrap/critical:
    get:
      tags:
      - Bootstrap
      summary: Load only the data that gates the authenticated shell
      operationId: critical_bootstrap_api_v1_bootstrap_critical_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CriticalBootstrapResponse'
        '401':
          description: Missing or invalid Supabase bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Required infrastructure or provider config is unavailable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
      - SupabaseBearerAuth: []
  /api/v1/bootstrap/deferred:
    get:
      tags:
      - Bootstrap
      summary: Warm non-critical workspace data after the shell renders
      operationId: deferred_bootstrap_api_v1_bootstrap_deferred_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeferredBootstrapResponse'
        '401':
          description: Missing or invalid Supabase bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
      - SupabaseBearerAuth: []
components:
  schemas:
    PlanItemRead:
      properties:
        id:
          type: string
          title: Id
        theme:
          anyOf:
          - type: string
          - type: 'null'
          title: Theme
        angle:
          anyOf:
          - type: string
          - type: 'null'
          title: Angle
        platforms:
          items:
            type: string
          type: array
          title: Platforms
        why:
          anyOf:
          - type: string
          - type: 'null'
          title: Why
        prompt:
          type: string
          title: Prompt
        scheduled_for:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Scheduled For
        status:
          type: string
          title: Status
        format:
          anyOf:
          - type: string
          - type: 'null'
          title: Format
        publish_mode:
          type: string
          title: Publish Mode
          default: single
        content_metadata:
          additionalProperties: true
          type: object
          title: Content Metadata
        body_parts:
          items:
            type: string
          type: array
          title: Body Parts
        media_ids:
          items:
            type: string
          type: array
          title: Media Ids
        media:
          items:
            $ref: '#/components/schemas/MediaRead'
          type: array
          title: Media
        created_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Created At
      type: object
      required:
      - id
      - theme
      - angle
      - platforms
      - why
      - prompt
      - scheduled_for
      - status
      title: PlanItemRead
    SubscriptionRead:
      properties:
        id:
          type: string
          title: Id
        workspace_id:
          type: string
          title: Workspace Id
        tier:
          type: string
          title: Tier
        plan_state:
          type: string
          title: Plan State
        plan_label:
          type: string
          title: Plan Label
        status:
          type: string
          title: Status
        renews_at:
          anyOf:
          - type: string
          - type: 'null'
          title: Renews At
        cancel_at_period_end:
          type: boolean
          title: Cancel At Period End
        billing_period:
          anyOf:
          - type: string
            enum:
            - monthly
            - yearly
          - type: 'null'
          title: Billing Period
        has_provider_subscription:
          type: boolean
          title: Has Provider Subscription
          default: false
        trial_eligible:
          type: boolean
          title: Trial Eligible
        included_credits:
          type: integer
          title: Included Credits
        channel_cap:
          type: integer
          title: Channel Cap
      type: object
      required:
      - id
      - workspace_id
      - tier
      - plan_state
      - plan_label
      - status
      - renews_at
      - cancel_at_period_end
      - billing_period
      - trial_eligible
      - included_credits
      - channel_cap
      title: SubscriptionRead
    CreditUsageResponse:
      properties:
        user_id:
          type: string
          title: User Id
        workspace_id:
          type: string
          title: Workspace Id
        balance:
          type: integer
          title: Balance
        granted:
          type: integer
          title: Granted
        used:
          type: integer
          title: Used
        workspace_balance:
          type: integer
          title: Workspace Balance
        workspace_granted:
          type: integer
          title: Workspace Granted
        workspace_used:
          type: integer
          title: Workspace Used
        cost_usd_micros:
          type: integer
          title: Cost Usd Micros
        workspace_cost_usd_micros:
          type: integer
          title: Workspace Cost Usd Micros
        categories:
          items:
            $ref: '#/components/schemas/CreditCategoryUsageRead'
          type: array
          title: Categories
        projects:
          items:
            $ref: '#/components/schemas/CreditProjectUsageRead'
          type: array
          title: Projects
      type: object
      required:
      - user_id
      - workspace_id
      - balance
      - granted
      - used
      - workspace_balance
      - workspace_granted
      - workspace_used
      - cost_usd_micros
      - workspace_cost_usd_micros
      - categories
      - projects
      title: CreditUsageResponse
      example:
        balance: 348
        categories:
        - balance: -2
          cost_usd_micros: 1200
          granted: 0
          label: Brain compose
          reason: text_draft
          used: 2
        cost_usd_micros: 1200
        granted: 350
        projects:
        - balance: -2
          cost_usd_micros: 1200
          granted: 0
          name: Orbit CRM
          project_id: brain_123
          project_type: brain
          used: 2
          workspace_id: wks_123
        used: 2
        user_id: CAD1234567890912
        workspace_balance: 348
        workspace_cost_usd_micros: 1200
        workspace_granted: 350
        workspace_id: wks_123
        workspace_used: 2
    VoiceProfile:
      properties:
        personas:
          items:
            $ref: '#/components/schemas/VoicePersona'
          type: array
          maxItems: 10
          title: Personas
        versions:
          items:
            $ref: '#/components/schemas/VoiceVersion'
          type: array
          maxItems: 20
          title: Versions
      type: object
      title: VoiceProfile
      description: The whole authored document. Empty is valid — it just means untouched.
    DeferredBootstrapResponse:
      properties:
        preferences:
          anyOf:
          - $ref: '#/components/schemas/UserPreferences'
          - type: 'null'
        channels:
          anyOf:
          - items:
              $ref: '#/components/schemas/ChannelRead'
            type: array
          - type: 'null'
          title: Channels
        usage:
          anyOf:
          - $ref: '#/components/schemas/CreditUsageResponse'
          - type: 'null'
        strategy:
          anyOf:
          - $ref: '#/components/schemas/StrategyRead'
          - type: 'null'
        plan:
          anyOf:
          - $ref: '#/components/schemas/PlanRead'
          - type: 'null'
        brains:
          anyOf:
          - items:
              $ref: '#/components/schemas/BrainRead'
            type: array
          - type: 'null'
          title: Brains
        media:
          anyOf:
          - items:
              additionalProperties: true
              type: object
            type: array
          - type: 'null'
          title: Media
        failed:
          items:
            type: string
          type: array
          title: Failed
          default: []
      type: object
      title: DeferredBootstrapResponse
      description: Workspace data warmed after the shell's critical path has completed.
    CriticalBootstrapResponse:
      properties:
        me:
          $ref: '#/components/schemas/CurrentUserResponse'
        subscription:
          anyOf:
          - $ref: '#/components/schemas/SubscriptionRead'
          - type: 'null'
        failed:
          items:
            type: string
          type: array
          title: Failed
          default: []
      type: object
      required:
      - me
      title: CriticalBootstrapResponse
      description: The two reads that decide whether the authenticated shell may render.
    BootstrapResponse:
      properties:
        me:
          $ref: '#/components/schemas/CurrentUserResponse'
        preferences:
          anyOf:
          - $ref: '#/components/schemas/UserPreferences'
          - type: 'null'
        channels:
          anyOf:
          - items:
              $ref: '#/components/schemas/ChannelRead'
            type: array
          - type: 'null'
          title: Channels
        subscription:
          anyOf:
          - $ref: '#/components/schemas/SubscriptionRead'
          - type: 'null'
        usage:
          anyOf:
          - $ref: '#/components/schemas/CreditUsageResponse'
          - type: 'null'
        strategy:
          anyOf:
          - $ref: '#/components/schemas/StrategyRead'
          - type: 'null'
        plan:
          anyOf:
          - $ref: '#/components/schemas/PlanRead'
          - type: 'null'
        brains:
          anyOf:
          - items:
              $ref: '#/components/schemas/BrainRead'
            type: array
          - type: 'null'
          title: Brains
        media:
          anyOf:
          - items:
              additionalProperties: true
              type: object
            type: array
          - type: 'null'
          title: Media
        failed:
          items:
            type: string
          type: array
          title: Failed
          default: []
      type: object
      required:
      - me
      title: BootstrapResponse
      description: 'Everything the app shell needs to render, in one round trip.


        Each field carries exactly the payload its own endpoint returns, so the

        client can seed its cache key-for-key and never learns a second shape.


        A `null` section means one of two different things, and `failed` is what

        tells them apart: a name listed there could not be read and the client

        should fetch that one endpoint itself, while a `null` that is *not* listed

        is a real absence (no content plan yet). Without that split, an outage in

        one section would be indistinguishable from an empty workspace.'
      example:
        brains: []
        channels: []
        failed: []
        me:
          user:
            email: creator@example.com
            id: CAD1234567890912
            isAdmin: false
            name: Creator
            timezone: Asia/Kolkata
          workspace:
            handle: workspace-wks_123
            id: wks_123
            name: Creator's Studio
            ownerId: CAD1234567890912
          workspaces: []
        media: []
        preferences:
          timezone: Asia/Kolkata
          weekStart: monday
    ToneAxis:
      properties:
        id:
          type: string
          maxLength: 40
          title: Id
        low:
          type: string
          maxLength: 40
          title: Low
        high:
          type: string
          maxLength: 40
          title: High
        value:
          type: integer
          maximum: 100.0
          minimum: 0.0
          title: Value
          default: 50
      type: object
      required:
      - id
      - low
      - high
      title: ToneAxis
      description: 'One bipolar slider: `value` 0 sits at `low`, 100 at `high`.'
    CurrentUserResponse:
      properties:
        user:
          $ref: '#/components/schemas/CurrentUserProfile'
        workspace:
          $ref: '#/components/schemas/CurrentWorkspaceProfile'
        workspaces:
          items:
            $ref: '#/components/schemas/CurrentWorkspaceProfile'
          type: array
          title: Workspaces
        role:
          type: string
          title: Role
          default: owner
        accountId:
          type: string
          title: Accountid
          default: ''
        permissions:
          items:
            type: string
          type: array
          title: Permissions
          default: []
        workspaceCap:
          type: integer
          title: Workspacecap
          default: 1
        setupComplete:
          type: boolean
          title: Setupcomplete
          default: true
      type: object
      required:
      - user
      - workspace
      - workspaces
      title: CurrentUserResponse
    BrainRead:
      properties:
        id:
          type: string
          title: Id
        workspace_id:
          type: string
          title: Workspace Id
        name:
          type: string
          title: Name
        tagline:
          type: string
          title: Tagline
        emoji:
          type: string
          title: Emoji
        accent:
          type: string
          title: Accent
        source_count:
          type: integer
          title: Source Count
        fact_count:
          type: integer
          title: Fact Count
        site_url:
          anyOf:
          - type: string
          - type: 'null'
          title: Site Url
        updated_at:
          type: string
          format: date-time
          title: Updated At
        created_at:
          type: string
          format: date-time
          title: Created At
      type: object
      required:
      - id
      - workspace_id
      - name
      - tagline
      - emoji
      - accent
      - source_count
      - fact_count
      - updated_at
      - created_at
      title: BrainRead
      example:
        accent: '#4338ca'
        created_at: '2026-07-08T10:00:00Z'
        emoji: '*'
        fact_count: 14
        id: brain_123
        name: Orbit CRM
        source_count: 2
        tagline: A calm CRM for founder-led sales teams.
        updated_at: '2026-07-08T10:30:00Z'
        workspace_id: wks_123
    ErrorResponse:
      properties:
        detail:
          anyOf:
          - type: string
          - additionalProperties: true
            type: object
          - items: {}
            type: array
          title: Detail
      type: object
      required:
      - detail
      title: ErrorResponse
      example:
        detail: Authorization header is required.
    CreditProjectUsageRead:
      properties:
        project_id:
          type: string
          title: Project Id
        project_type:
          type: string
          enum:
          - workspace
          - brain
          title: Project Type
        name:
          type: string
          title: Name
        workspace_id:
          type: string
          title: Workspace Id
        granted:
          type: integer
          title: Granted
        used:
          type: integer
          title: Used
        balance:
          type: integer
          title: Balance
        cost_usd_micros:
          type: integer
          title: Cost Usd Micros
      type: object
      required:
      - project_id
      - project_type
      - name
      - workspace_id
      - granted
      - used
      - balance
      - cost_usd_micros
      title: CreditProjectUsageRead
    CurrentUserProfile:
      properties:
        id:
          type: string
          title: Id
        email:
          type: string
          title: Email
        name:
          type: string
          title: Name
        avatarUrl:
          anyOf:
          - type: string
          - type: 'null'
          title: Avatarurl
        timezone:
          type: string
          title: Timezone
        isAdmin:
          type: boolean
          title: Isadmin
          default: false
        createdAt:
          anyOf:
          - type: string
          - type: 'null'
          title: Createdat
      type: object
      required:
      - id
      - email
      - name
      - avatarUrl
      - timezone
      title: CurrentUserProfile
    UserPreferences:
      properties:
        timezone:
          type: string
          title: Timezone
        weekStart:
          type: string
          title: Weekstart
          default: monday
        quietHours:
          type: 'null'
          title: Quiethours
      type: object
      required:
      - timezone
      title: UserPreferences
      example:
        timezone: Asia/Kolkata
        weekStart: monday
    CreditCategoryUsageRead:
      properties:
        reason:
          type: string
          title: Reason
        label:
          type: string
          title: Label
        granted:
          type: integer
          title: Granted
        used:
          type: integer
          title: Used
        balance:
          type: integer
          title: Balance
        cost_usd_micros:
          type: integer
          title: Cost Usd Micros
      type: object
      required:
      - reason
      - label
      - granted
      - used
      - balance
      - cost_usd_micros
      title: CreditCategoryUsageRead
    AutomationSettings:
      properties:
        enabled:
          type: boolean
          title: Enabled
          description: Off by default. Auto-planning spends credits, so it's opt-in.
          default: false
        suspended_by_plan:
          type: boolean
          title: Suspended By Plan
          description: Cadencz turned automation off after plan access was lost. The saved schedule remains, but the customer must explicitly enable it again.
          default: false
        auto_write_week:
          type: boolean
          title: Auto Write Week
          description: Write the week's posts on their own at the planning hour, so the stack always has a fresh week on it. Every plan; bounded by the tier's weekly number and the monthly pool. Distinct from `enabled`, which is the paid Automation feature (rules, auto-approve).
          default: true
        plan_weekday:
          type: integer
          maximum: 6.0
          minimum: 0.0
          title: Plan Weekday
          description: 0 = Monday.
          default: 0
        plan_hour:
          type: integer
          maximum: 23.0
          minimum: 0.0
          title: Plan Hour
          description: Local hour, 24h.
          default: 6
        timezone:
          type: string
          maxLength: 64
          title: Timezone
          description: IANA zone.
          default: UTC
        posting_weekdays:
          items:
            type: integer
          type: array
          title: Posting Weekdays
          description: Days posts may be scheduled on. 0 = Monday.
        posting_times:
          items:
            type: string
          type: array
          title: Posting Times
          description: HH:MM slots, cycled through in order.
        day_platforms:
          additionalProperties:
            type: string
          type: object
          title: Day Platforms
          description: Which channel each weekday posts to, keyed by weekday index as a string ('0' = Monday). A day with no entry falls back to the workspace's platform rotation.
        platform_quota:
          additionalProperties:
            type: integer
          type: object
          title: Platform Quota
          description: How many posts each channel gets per batch, keyed by platform id. The batch is their sum. Zero (or absent) means the channel gets none; empty means the planner decides per post from cadence.
        brain_id:
          anyOf:
          - type: string
            maxLength: 64
          - type: 'null'
          title: Brain Id
          description: Ground posts in this Brain. None = the most recently updated.
        auto_approve:
          type: boolean
          title: Auto Approve
          description: Schedule straight to the calendar instead of holding for review.
          default: false
      type: object
      title: AutomationSettings
      description: When the agents plan, and when the posts they produce go out.
    StrategyRead:
      properties:
        workspace_id:
          type: string
          title: Workspace Id
        niche:
          anyOf:
          - type: string
          - type: 'null'
          title: Niche
        goals:
          items:
            type: string
          type: array
          title: Goals
        whats_new:
          anyOf:
          - type: string
          - type: 'null'
          title: Whats New
        tags:
          items:
            type: string
          type: array
          title: Tags
        tone_profile:
          additionalProperties: true
          type: object
          title: Tone Profile
        voice_profile:
          $ref: '#/components/schemas/VoiceProfile'
        voice_samples:
          items:
            type: string
          type: array
          title: Voice Samples
        voice_sample_platforms:
          additionalProperties:
            type: string
          type: object
          title: Voice Sample Platforms
        voice_platforms_learned:
          items:
            type: string
          type: array
          title: Voice Platforms Learned
        cadence_per_week:
          type: integer
          title: Cadence Per Week
        platforms:
          items:
            type: string
          type: array
          title: Platforms
        automation:
          $ref: '#/components/schemas/AutomationSettings'
        updated_at:
          type: string
          format: date-time
          title: Updated At
      type: object
      required:
      - workspace_id
      - niche
      - goals
      - tags
      - tone_profile
      - voice_profile
      - voice_samples
      - cadence_per_week
      - platforms
      - automation
      - updated_at
      title: StrategyRead
      example:
        cadence_per_week: 5
        goals:
        - grow
        - nurture
        niche: Indie SaaS / building in public
        platforms:
        - x
        - linkedin
        tone_profile:
          emoji: sparse
          tone_words:
          - wry
          - concise
        updated_at: '2026-07-14T10:00:00Z'
        workspace_id: wks_123
    MediaRead:
      properties:
        id:
          type: string
          title: Id
        kind:
          type: string
          title: Kind
        url:
          type: string
          title: Url
        alt_text:
          anyOf:
          - type: string
          - type: 'null'
          title: Alt Text
        width:
          anyOf:
          - type: integer
          - type: 'null'
          title: Width
        height:
          anyOf:
          - type: integer
          - type: 'null'
          title: Height
        bytes:
          anyOf:
          - type: integer
          - type: 'null'
          title: Bytes
      type: object
      required:
      - id
      - kind
      - url
      title: MediaRead
    VoiceVersion:
      properties:
        id:
          type: string
          maxLength: 64
          title: Id
        persona_id:
          type: string
          maxLength: 64
          title: Persona Id
        label:
          type: string
          maxLength: 160
          title: Label
          default: ''
        saved_at:
          type: string
          format: date-time
          title: Saved At
        snapshot:
          $ref: '#/components/schemas/VoicePersona'
      type: object
      required:
      - id
      - persona_id
      - saved_at
      - snapshot
      title: VoiceVersion
      description: A snapshot taken on save, so a regretted edit is one click from undone.
    VoicePersona:
      properties:
        id:
          type: string
          maxLength: 64
          title: Id
        name:
          type: string
          maxLength: 80
          title: Name
          default: ''
        audience:
          type: string
          maxLength: 2000
          title: Audience
          default: ''
        context:
          type: string
          maxLength: 500
          title: Context
          default: ''
        mission:
          type: string
          maxLength: 2000
          title: Mission
          default: ''
        traits:
          items:
            type: string
          type: array
          title: Traits
        goals:
          items:
            type: string
          type: array
          title: Goals
        tone:
          items:
            $ref: '#/components/schemas/ToneAxis'
          type: array
          maxItems: 12
          title: Tone
        vocabulary:
          items:
            type: string
          type: array
          title: Vocabulary
        banned_words:
          items:
            type: string
          type: array
          title: Banned Words
        ctas:
          items:
            type: string
          type: array
          title: Ctas
        formatting:
          items:
            type: string
          type: array
          title: Formatting
        active:
          type: boolean
          title: Active
          default: false
        created_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Created At
        updated_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Updated At
      type: object
      required:
      - id
      title: VoicePersona
      description: A named way of speaking. Exactly one persona is active at a time.
    ChannelRead:
      properties:
        id:
          type: string
          title: Id
        workspace_id:
          type: string
          title: Workspace Id
        platform:
          type: string
          title: Platform
        handle:
          type: string
          title: Handle
        display_name:
          anyOf:
          - type: string
          - type: 'null'
          title: Display Name
        avatar_url:
          anyOf:
          - type: string
          - type: 'null'
          title: Avatar Url
        status:
          type: string
          title: Status
        byo_app:
          type: boolean
          title: Byo App
        token_expires_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Token Expires At
        followers:
          type: integer
          title: Followers
        capabilities:
          additionalProperties: true
          type: object
          title: Capabilities
        plan_entitled:
          type: boolean
          title: Plan Entitled
          default: true
        entitlement_status:
          type: string
          enum:
          - available
          - plan_paused
          - disconnected
          title: Entitlement Status
          default: available
        plan_pause_reason:
          anyOf:
          - type: string
            enum:
            - plan_required
            - workspace_limit
            - platform_limit
          - type: 'null'
          title: Plan Pause Reason
      type: object
      required:
      - id
      - workspace_id
      - platform
      - handle
      - display_name
      - avatar_url
      - status
      - byo_app
      - token_expires_at
      - followers
      title: ChannelRead
      example:
        avatar_url: https://example.com/avatar.png
        byo_app: false
        display_name: Cadencz
        followers: 42
        handle: cadencz.bsky.social
        id: chn_123
        platform: bluesky
        status: connected
        workspace_id: wks_123
    CurrentWorkspaceProfile:
      properties:
        id:
          type: string
          title: Id
        ownerId:
          type: string
          title: Ownerid
        name:
          type: string
          title: Name
        handle:
          type: string
          title: Handle
        avatarUrl:
          anyOf:
          - type: string
          - type: 'null'
          title: Avatarurl
      type: object
      required:
      - id
      - ownerId
      - name
      - handle
      - avatarUrl
      title: CurrentWorkspaceProfile
    PlanRead:
      properties:
        id:
          type: string
          title: Id
        workspace_id:
          type: string
          title: Workspace Id
        week_of:
          type: string
          format: date-time
          title: Week Of
        goal:
          type: string
          title: Goal
        niche:
          type: string
          title: Niche
        status:
          type: string
          title: Status
        items:
          items:
            $ref: '#/components/schemas/PlanItemRead'
          type: array
          title: Items
        created_at:
          type: string
          format: date-time
          title: Created At
      type: object
      required:
      - id
      - workspace_id
      - week_of
      - goal
      - niche
      - status
      - items
      - created_at
      title: PlanRead
      example:
        created_at: '2026-07-13T10:00:00Z'
        goal: grow
        id: plan_123
        items:
        - angle: reframe reliability as a principle
          id: item_1
          platforms:
          - x
          prompt: Write about the single rule that governs our tradeoffs.
          scheduled_for: '2026-07-14T09:00:00Z'
          status: draft
          theme: The one-rule philosophy
          why: Tue mornings get 2x engagement for you.
        niche: indie SaaS
        status: draft
        week_of: '2026-07-13T00:00:00Z'
        workspace_id: wks_123
  securitySchemes:
    SupabaseBearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Supabase access token
      description: 'Send the Supabase access token as `Authorization: Bearer <token>`.'
    DodoWebhookSignature:
      type: apiKey
      in: header
      name: webhook-signature
      description: Dodo Payments webhook signature header.