openapi: 3.1.0
info:
  version: 1.0.0
  title: Steady v2 REST API
  description: Steady's v2 REST API.
  termsOfService: https://runsteady.com/terms/
  contact:
    name: Steady Support
    url: https://runsteady.com/contact/

servers:
  - url: https://service.steady.space/api/v2

security:
  - oauth2: []
  - personalAccessToken: []

components:
  securitySchemes:
    oauth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://app.steady.space/oauth/authorize
          tokenUrl: https://app.steady.space/oauth/token
          refreshUrl: https://app.steady.space/oauth/token
          scopes:
            read: Read access to all resources visible to the user.
            write: Read and write access (create, update, delete).

    personalAccessToken:
      type: http
      scheme: bearer
      bearerFormat: PAT
      description: A Steady personal access token, prefixed with `steady_pat_`.

  schemas:
    Id:
      type: string
      format: uuid

    Date:
      type: string
      format: date

    Url:
      type: string
      format: uri

    Account:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
        name:
          type: string
      required:
        - id
        - name
      unevaluatedProperties: false

    TeamRef:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
        name:
          type: string
      required:
        - id
        - name

    Team:
      allOf:
        - $ref: "#/components/schemas/TeamRef"
        - type: object
          properties:
            description:
              oneOf:
                - type: string
                - type: "null"
            private:
              type: boolean
            completion_tracking:
              type: boolean
            mood_tracking:
              type: boolean
            report_days:
              type: array
              items:
                type: string
                enum: [sunday, monday, tuesday, wednesday, thursday, friday, saturday]
            people:
              type: array
              items:
                $ref: "#/components/schemas/PersonRef"
            url:
              $ref: "#/components/schemas/Url"
          required:
            - private
            - completion_tracking
            - mood_tracking
            - report_days
            - people
            - url
      unevaluatedProperties: false

    PersonRef:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
        name:
          type: string
      required:
        - id
        - name

    Person:
      allOf:
        - $ref: "#/components/schemas/PersonRef"
        - type: object
          properties:
            username:
              type: string
              description: Username for @-mentions, without the leading "@".
            email:
              type: string
              format: email
            time_zone:
              type: string
              description: IANA time zone name.
            location:
              oneOf:
                - type: string
                - type: "null"
              description: Free-form location string the person set on their profile.
            title:
              oneOf:
                - type: string
                - type: "null"
              description: Job title the person set on their profile.
            bio:
              oneOf:
                - type: string
                - type: "null"
              description: Profile bio as plain text.
            administrator:
              type: boolean
            kind:
              type: string
              enum:
                - human
                - agent
            created_at:
              type: string
              format: date-time
            updated_at:
              type: string
              format: date-time
            url:
              $ref: "#/components/schemas/Url"
            account:
              $ref: "#/components/schemas/Account"
            teams:
              type: array
              items:
                $ref: "#/components/schemas/TeamRef"
          required:
            - username
            - email
            - time_zone
            - location
            - title
            - bio
            - administrator
            - kind
            - created_at
            - updated_at
            - url
            - account
            - teams
      unevaluatedProperties: false

    Activity:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
          readOnly: true
        kind:
          type: string
          readOnly: true
          description: |
            Activity kind, e.g. `github_pr`, `jira`, `linear`,
            `google_calendar`. See the `kinds[]` query parameter on
            `GET /activities` for the kinds that can be filtered.
        group:
          type: string
          minLength: 1
          maxLength: 64
          description: |
            Human-readable label for the activity's group, e.g. `GitHub PR`,
            `Jira`, `Asana`.
        title:
          oneOf:
            - type: string
            - type: "null"
          readOnly: true
          description: |
            Short title summarizing the activity (e.g. a pull request title).
            Null when the activity kind doesn't expose one.
        description:
          type: string
          minLength: 1
          maxLength: 256
          description: Short summary of the activity.
        url:
          oneOf:
            - $ref: "#/components/schemas/Url"
            - type: "null"
          description: |
            Canonical URL for the activity in its source system (e.g. the PR
            URL, the calendar event URL).
        recorded_at:
          type: string
          format: date-time
          readOnly: true
          description: When the activity occurred.
        person:
          $ref: "#/components/schemas/PersonRef"
          readOnly: true
      required:
        - id
        - kind
        - group
        - title
        - description
        - recorded_at
        - person
      unevaluatedProperties: false

    CheckIn:
      type: object
      properties:
        type:
          type: string
          const: check-in
          readOnly: true
        id:
          $ref: "#/components/schemas/Id"
          readOnly: true
        date:
          type: string
          format: date
          readOnly: true
        person:
          $ref: "#/components/schemas/PersonRef"
          readOnly: true
        teams:
          type: array
          readOnly: true
          items:
            $ref: "#/components/schemas/TeamRef"
        team_ids:
          type: array
          writeOnly: true
          description: IDs of teams to include in this check-in. Defaults to all the person's teams if omitted.
          items:
            $ref: "#/components/schemas/Id"
        previous:
          oneOf:
            - type: string
            - type: "null"
          description: Answer to "What did you do previously?" rendered as Markdown.
        intentions:
          oneOf:
            - type: string
            - type: "null"
          description: Answer to "What do you intend to do next?" rendered as Markdown.
        blockers:
          oneOf:
            - type: string
            - type: "null"
          description: Answer to "Are you blocked by anything?" rendered as Markdown.
        mood:
          oneOf:
            - type: string
              enum: [calm, happy, excited, celebratory, joyful, confident, focused, goofy, nerdy, thoughtful, meh, confused, flustered, surprised, tired, disappointed, worried, annoyed, stressed, angry, sick]
            - type: "null"
        previous_completed:
          oneOf:
            - type: boolean
            - type: "null"
          description: Answer to "Did you do what you intended?".
        blocked:
          type: boolean
          readOnly: true
          description: Whether the check-in contains blockers.
        absent:
          type: boolean
          readOnly: true
        completed_at:
          oneOf:
            - type: string
              format: date-time
            - type: "null"
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
        url:
          $ref: "#/components/schemas/Url"
          readOnly: true
      required:
        - id
        - date
        - person
        - teams
        - blocked
        - absent
        - completed_at
        - updated_at
        - url
      unevaluatedProperties: false

    ResourceRef:
      type: object
      description: Reference to a related resource by `type` and `id`.
      properties:
        type:
          type: string
          enum: [check-in, goal-update]
        id:
          $ref: "#/components/schemas/Id"
      required:
        - type
        - id
      unevaluatedProperties: false

    Comment:
      type: object
      properties:
        type:
          type: string
          const: comment
          readOnly: true
        id:
          $ref: "#/components/schemas/Id"
          readOnly: true
        body:
          type: string
          description: Comment body rendered as Markdown.
        person:
          $ref: "#/components/schemas/PersonRef"
          readOnly: true
        resource:
          $ref: "#/components/schemas/ResourceRef"
          readOnly: true
        created_at:
          type: string
          format: date-time
          readOnly: true
      required:
        - id
        - body
        - person
        - resource
        - created_at
      unevaluatedProperties: false

    Reaction:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
        name:
          type: string
          enum: [thumbsup, thumbsdown, smile, confused, heart, tada]
          description: The reaction kind.
        emoji:
          type: string
          description: Unicode emoji character for the reaction.
        person:
          $ref: "#/components/schemas/PersonRef"
        resource:
          $ref: "#/components/schemas/ResourceRef"
        created_at:
          type: string
          format: date-time
      required:
        - id
        - name
        - emoji
        - person
        - resource
        - created_at
      unevaluatedProperties: false

    DigestEntry:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
        category:
          type: string
          enum: [check-in, comment, echo, goal]
        published_at:
          type: string
          format: date-time
        read_at:
          oneOf:
            - type: string
              format: date-time
            - type: "null"
          description: |
            When the user read the entry through the web app. `null` if the
            entry has not been read.
        resource:
          oneOf:
            - $ref: "#/components/schemas/CheckIn"
            - $ref: "#/components/schemas/Comment"
            - $ref: "#/components/schemas/EchoAnswer"
            - $ref: "#/components/schemas/Goal"
            - $ref: "#/components/schemas/GoalUpdate"
          discriminator:
            propertyName: type
            mapping:
              check-in: "#/components/schemas/CheckIn"
              comment: "#/components/schemas/Comment"
              echo-answer: "#/components/schemas/EchoAnswer"
              goal: "#/components/schemas/Goal"
              goal-update: "#/components/schemas/GoalUpdate"
      required:
        - id
        - category
        - published_at
        - read_at
        - resource
      unevaluatedProperties: false

    ActionItem:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
        date:
          $ref: "#/components/schemas/Date"
          description: The due date.
        description:
          type: string
          description: Summary of the action to take, rendered as Markdown.
        url:
          $ref: "#/components/schemas/Url"
        links:
          type: object
          description: Hypermedia affordances for taking action.
          properties:
            edit:
              $ref: "#/components/schemas/Link"
          required:
            - edit
          unevaluatedProperties: false
        completed_at:
          oneOf:
            - type: string
              format: date-time
            - type: "null"
      required:
        - id
        - date
        - description
        - url
        - links
        - completed_at
      unevaluatedProperties: false

    Link:
      type: object
      description: |
        A hypermedia affordance pointing at the API endpoint that performs an
        action. `method` and `href` are enough to make the request on their own;
        `operationId` references the OpenAPI operation describing the request and
        response bodies.
      properties:
        method:
          type: string
          enum: [get, post, put, patch, delete]
        href:
          $ref: "#/components/schemas/Url"
        operationId:
          type: string
      required:
        - method
        - href
        - operationId
      unevaluatedProperties: false

    Ask:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
          readOnly: true
        prompt:
          type: string
        body:
          oneOf:
            - type: string
            - type: "null"
          readOnly: true
          description: |
            Answer rendered as Markdown. `null` while the AI-generated content
            summary is still being produced.
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
        url:
          $ref: "#/components/schemas/Url"
          readOnly: true
      required:
        - id
        - prompt
        - body
        - created_at
        - updated_at
        - url
      unevaluatedProperties: false

    EchoQuestionRef:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
        title:
          type: string
      required:
        - id
        - title
      unevaluatedProperties: false

    EchoQuestion:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
          readOnly: true
        prompt:
          type: string
        title:
          type: string
        answer_frequency:
          type: string
          enum: [daily, weekly, biweekly, monthly]
        answer_day:
          type: string
          enum: [monday, tuesday, wednesday, thursday, friday, saturday, sunday]
        answer_time:
          type: string
          pattern: '^([01]\d|2[0-3]):[0-5]\d$'
          example: "09:30"
          description: 24-hour time in `HH:MM` format.
        answer_time_zone:
          type: string
          readOnly: true
          description: IANA time zone name (the question creator's).
        next_answer_at:
          oneOf:
            - type: string
              format: date-time
            - type: "null"
          readOnly: true
        paused_at:
          oneOf:
            - type: string
              format: date-time
            - type: "null"
          readOnly: true
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
        url:
          $ref: "#/components/schemas/Url"
          readOnly: true
      required:
        - id
        - answer_time_zone
        - next_answer_at
        - paused_at
        - created_at
        - updated_at
        - url
      unevaluatedProperties: false

    EchoAnswer:
      type: object
      properties:
        type:
          type: string
          const: echo-answer
          readOnly: true
        id:
          $ref: "#/components/schemas/Id"
        question:
          $ref: "#/components/schemas/EchoQuestionRef"
        title:
          type: string
        body:
          oneOf:
            - type: string
            - type: "null"
          description: |
            Answer rendered as Markdown. `null` while the AI-generated content
            summary is still being produced.
        published_at:
          type: string
          format: date-time
        url:
          $ref: "#/components/schemas/Url"
      required:
        - id
        - question
        - title
        - body
        - published_at
        - url
      unevaluatedProperties: false

    GoalProgress:
      type: integer
      minimum: 0
      maximum: 100
      description: Progress percentage toward completing the goal.

    GoalConfidence:
      type: integer
      minimum: 0
      maximum: 100
      description: |
        Confidence score, normalized to one of: 30 (Off track), 60 (At risk),
        or 90 (On track). Returns 100 (On track) if no updates have been
        reported yet.

    GoalConfidenceDescription:
      type: string
      enum: [Off track, At risk, On track]
      description: Human-readable label for the confidence score.

    GoalRef:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/Id"
        title:
          type: string
      required:
        - id
        - title
      unevaluatedProperties: false

    Goal:
      type: object
      properties:
        type:
          type: string
          const: goal
          readOnly: true
        id:
          $ref: "#/components/schemas/Id"
          readOnly: true
        title:
          type: string
        description:
          type: string
          description: Goal description rendered as Markdown.
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        update_cadence:
          type: string
          enum: [Weekly, Biweekly, Monthly]
        owner:
          $ref: "#/components/schemas/PersonRef"
          readOnly: true
        owner_id:
          $ref: "#/components/schemas/Id"
          writeOnly: true
        parent:
          readOnly: true
          oneOf:
            - $ref: "#/components/schemas/GoalRef"
            - type: "null"
        parent_id:
          $ref: "#/components/schemas/Id"
          writeOnly: true
        private:
          type: boolean
        archived:
          type: boolean
        progress:
          $ref: "#/components/schemas/GoalProgress"
          readOnly: true
        confidence:
          $ref: "#/components/schemas/GoalConfidence"
          readOnly: true
        confidence_description:
          $ref: "#/components/schemas/GoalConfidenceDescription"
          readOnly: true
        contributors:
          type: array
          readOnly: true
          items:
            $ref: "#/components/schemas/PersonRef"
        contributor_ids:
          type: array
          writeOnly: true
          items:
            $ref: "#/components/schemas/Id"
        teams:
          type: array
          readOnly: true
          items:
            $ref: "#/components/schemas/TeamRef"
        team_ids:
          type: array
          writeOnly: true
          items:
            $ref: "#/components/schemas/Id"
        url:
          $ref: "#/components/schemas/Url"
          readOnly: true
      required:
        - id
        - owner
        - parent
        - progress
        - confidence
        - confidence_description
        - contributors
        - teams
        - url
      unevaluatedProperties: false

    GoalUpdate:
      type: object
      properties:
        type:
          type: string
          const: goal-update
          readOnly: true
        id:
          $ref: "#/components/schemas/Id"
          readOnly: true
        goal:
          $ref: "#/components/schemas/GoalRef"
          readOnly: true
        person:
          $ref: "#/components/schemas/PersonRef"
          readOnly: true
        title:
          type: string
        body:
          type: string
          description: Update body rendered as Markdown.
        progress:
          $ref: "#/components/schemas/GoalProgress"
        confidence:
          $ref: "#/components/schemas/GoalConfidence"
        confidence_description:
          $ref: "#/components/schemas/GoalConfidenceDescription"
          readOnly: true
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
        url:
          $ref: "#/components/schemas/Url"
          readOnly: true
      required:
        - id
        - goal
        - person
        - confidence_description
        - created_at
        - updated_at
        - url
      unevaluatedProperties: false

    Errors:
      type: object
      properties:
        errors:
          type: array
          items:
            type: string
      required:
        - errors

  parameters:
    PathId:
      name: id
      in: path
      required: true
      schema:
        $ref: "#/components/schemas/Id"

    GoalIdPath:
      name: goal_id
      in: path
      required: true
      schema:
        $ref: "#/components/schemas/Id"

    GoalUpdateIdPath:
      name: goal_update_id
      in: path
      required: true
      schema:
        $ref: "#/components/schemas/Id"

    CheckInIdPath:
      name: check_in_id
      in: path
      required: true
      schema:
        $ref: "#/components/schemas/Id"

    EchoQuestionIdPath:
      name: question_id
      in: path
      required: true
      schema:
        $ref: "#/components/schemas/Id"

    Since:
      name: since
      in: query
      description: Filter to records on or after this time. ISO 8601 timestamp (e.g. `2026-05-06T00:00:00Z`).
      required: false
      schema:
        type: string
        format: date-time

    Until:
      name: until
      in: query
      description: Filter to records on or before this time. ISO 8601 timestamp (e.g. `2026-05-06T23:59:59Z`).
      required: false
      schema:
        type: string
        format: date-time

    SinceDate:
      name: since
      in: query
      description: Filter to records on or after this date.
      required: false
      schema:
        type: string
        format: date

    UntilDate:
      name: until
      in: query
      description: Filter to records on or before this date.
      required: false
      schema:
        type: string
        format: date

    BlockedFilter:
      name: blocked
      in: query
      description: Filter to check-ins that contain blockers.
      required: false
      schema:
        type: boolean

    DigestCategoryFilter:
      name: category
      in: query
      description: Limit the digest to entries in one category.
      required: false
      schema:
        type: string
        enum: [check-in, comment, echo, goal]

    DigestUnreadFilter:
      name: unread
      in: query
      description: When present, return only unread entries.
      required: false
      schema:
        type: boolean
        enum: [true]

    ActivityKindsFilter:
      name: "kinds[]"
      in: query
      description: Filter to activities with one of these `kind` values.
      required: false
      schema:
        type: array
        items:
          type: string
          enum:
            - asana
            - azure_devops
            - bitbucket
            - bitbucket_pr
            - bitbucket_review
            - bugsnag
            - clubhouse
            - confluence
            - github
            - github_pr
            - github_review
            - gitlab
            - gitlab_mr
            - google_calendar
            - hubspot
            - microsoft_outlook_calendar
            - jira
            - linear
            - monday
            - notion
            - salesforce
            - teamwork
            - trello
            - zendesk
            - zoom_host
            - zoom_attend
            - workday

    PeopleIdsFilter:
      name: "people_ids[]"
      in: query
      description: Filter to records owned by, contributed to, or otherwise involving these people.
      required: false
      schema:
        type: array
        items:
          $ref: "#/components/schemas/Id"

    TeamIdsFilter:
      name: "team_ids[]"
      in: query
      description: Filter to records involving these teams.
      required: false
      schema:
        type: array
        items:
          $ref: "#/components/schemas/Id"

    GoalIdsFilter:
      name: "goal_ids[]"
      in: query
      description: Return only these goals. When set, archived goals are included.
      required: false
      schema:
        type: array
        items:
          $ref: "#/components/schemas/Id"

    Page:
      name: page
      in: query
      description: Page number (1-indexed).
      required: false
      schema:
        type: integer
        minimum: 1
        default: 1
    PerPage:
      name: per_page
      in: query
      description: Number of records per page.
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 50
        default: 30

  requestBodies:
    Ask:
      required: true
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Ask"
          example:
            prompt: What did we ship this week?

    CheckIn:
      required: true
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/CheckIn"
          example:
            previous: |
              - Shipped the new search UI to staging
              - Reviewed the migration plan with @JordanPark
            intentions: |
              - Roll search out to production behind a flag
              - Write the deprecation note for the legacy endpoint
            blockers: ""
            mood: focused
            previous_completed: true
            team_ids:
              - 4c4f5632-7065-4dfb-bb90-c21b5b238ce4

    Goal:
      required: true
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Goal"
          example:
            title: Reduce p95 API latency to under 200ms
            description: |
              Improve end-user experience by cutting tail latency on
              the public API. See the [perf tracker](https://example.com).
            start_date: "2026-04-01"
            end_date: "2026-06-30"
            update_cadence: Weekly
            owner_id: ab6e1c81-cc42-47b9-82d0-66601aea003d
            parent_id: 1f0c8a44-9b21-4f3a-9c7e-8e2a5d4b6f01
            private: false
            archived: false
            contributor_ids:
              - 5d8f9a12-3c4b-4e5d-9a6b-7c8d9e0f1a2b
              - 2e3f4a5b-6c7d-4e8f-9a0b-1c2d3e4f5a6b
            team_ids:
              - 4c4f5632-7065-4dfb-bb90-c21b5b238ce4

    GoalUpdate:
      required: true
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/GoalUpdate"
          example:
            title: Cut tail latency by 30ms this sprint
            body: |
              - Rolled out the new connection pool to 25% of traffic
              - p95 dropped from 240ms to 210ms
              - Next: expand to 100% once we confirm error rates stay flat
            progress: 60
            confidence: 90

    EchoQuestion:
      required: true
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/EchoQuestion"
          example:
            prompt: What's the most important thing you shipped this week?
            title: Weekly ship recap
            answer_frequency: weekly
            answer_day: monday
            answer_time: "09:30"

    Activity:
      required: true
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Activity"
          example:
            group: Acme CRM
            url: https://app.acme.example/deals/1234
            description: "Closed the Initech renewal: $48k ARR"

    Comment:
      required: true
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Comment"
          example:
            body: Nice work on the connection pool rollout — the p95 drop is great news.

  examples:
    Ask:
      value: &ask_example
        id: 3e4f5a6b-7c8d-4e9f-a0b1-2c3d4e5f6a7b
        prompt: What did we ship this week?
        body: |
          - Shipped the new search UI to production
          - Finished the API pagination documentation
        created_at: "2026-05-04T19:01:11Z"
        updated_at: "2026-05-04T19:01:27Z"
        url: https://app.steady.space/asks/3e4f5a6b-7c8d-4e9f-a0b1-2c3d4e5f6a7b
    AsksList:
      value:
        - *ask_example
    Activity:
      value: &activity_example
        id: 6c7d8e9f-1a2b-4c3d-8e4f-5a6b7c8d9e0f
        kind: github_pr
        group: GitHub PR
        title: Upgrade Rails to 7.2
        description: "Merged PR in marketing-site: Upgrade Rails to 7.2"
        url: https://github.com/continuouscoordination/principles/pull/4
        recorded_at: "2026-04-28T03:14:00Z"
        person:
          id: ab6e1c81-cc42-47b9-82d0-66601aea003d
          name: Quinn Reed
    ActivitiesList:
      value:
        - *activity_example
    Person:
      value: &person_example
        id: ab6e1c81-cc42-47b9-82d0-66601aea003d
        name: Quinn Reed
        username: QuinnReed
        email: quinn.reed@quantronica.digital
        time_zone: Eastern Time (US & Canada)
        location: Brooklyn, NY
        title: Senior Engineer
        bio: I love secure systems and good coffee.
        administrator: false
        kind: human
        created_at: "2024-01-12T15:42:11Z"
        updated_at: "2026-04-28T15:14:33Z"
        url: https://app.steady.space/people/ab6e1c81-cc42-47b9-82d0-66601aea003d
        account:
          id: 4c4f5632-7065-4dfb-bb90-c21b5b238ce4
          name: Quantronica
        teams:
          - id: 4c4f5632-7065-4dfb-bb90-c21b5b238ce4
            name: Security
    PeopleList:
      value:
        - *person_example
    CheckIn:
      value: &check_in_example
        id: 9b2c3d4e-5f60-4718-9201-3456789abcde
        date: "2026-05-04"
        person:
          id: ab6e1c81-cc42-47b9-82d0-66601aea003d
          name: Quinn Reed
        teams:
          - id: 4c4f5632-7065-4dfb-bb90-c21b5b238ce4
            name: Security
        previous: |
          - Shipped the new search UI to staging
          - Reviewed the migration plan with Jordan
        intentions: |
          - Roll search out to production behind a flag
          - Write the deprecation note for the legacy endpoint
        blockers: null
        mood: focused
        previous_completed: true
        blocked: false
        absent: false
        completed_at: "2026-05-04T18:18:22Z"
        updated_at: "2026-05-04T18:18:22Z"
        url: https://app.steady.space/check-ins/9b2c3d4e-5f60-4718-9201-3456789abcde
    CheckInsList:
      value:
        - *check_in_example
    Goal:
      value: &goal_example
        id: 7a1d2e3f-4b5c-4d6e-8f90-1234567890ab
        title: Reduce p95 API latency to under 200ms
        description: |
          Improve end-user experience by cutting tail latency on
          the public API. See the [perf tracker](https://example.com).
        start_date: "2026-04-01"
        end_date: "2026-06-30"
        update_cadence: Weekly
        owner:
          id: ab6e1c81-cc42-47b9-82d0-66601aea003d
          name: Quinn Reed
        parent:
          id: 1f0c8a44-9b21-4f3a-9c7e-8e2a5d4b6f01
          title: Deliver a faster, more reliable platform
        private: false
        archived: false
        progress: 60
        confidence: 90
        confidence_description: On track
        contributors:
          - id: 5d8f9a12-3c4b-4e5d-9a6b-7c8d9e0f1a2b
            name: Jordan Park
          - id: 2e3f4a5b-6c7d-4e8f-9a0b-1c2d3e4f5a6b
            name: Sam Okafor
        teams:
          - id: 4c4f5632-7065-4dfb-bb90-c21b5b238ce4
            name: Security
        url: https://app.steady.space/goals/7a1d2e3f-4b5c-4d6e-8f90-1234567890ab
    GoalsList:
      value:
        - *goal_example
    GoalUpdate:
      value: &goal_update_example
        id: 8b3c4d5e-6f70-4d8e-9a01-2345678901cd
        goal:
          id: 7a1d2e3f-4b5c-4d6e-8f90-1234567890ab
          title: Reduce p95 API latency to under 200ms
        person:
          id: 5d8f9a12-3c4b-4e5d-9a6b-7c8d9e0f1a2b
          name: Jordan Park
        title: Cut tail latency by 30ms this sprint
        body: |
          - Rolled out the new connection pool to 25% of traffic
          - p95 dropped from 240ms to 210ms
          - Next: expand to 100% once we confirm error rates stay flat
        progress: 60
        confidence: 90
        confidence_description: On track
        created_at: "2026-05-04T18:18:22Z"
        updated_at: "2026-05-04T18:18:22Z"
        url: https://app.steady.space/goal_updates/8b3c4d5e-6f70-4d8e-9a01-2345678901cd
    GoalUpdatesList:
      value:
        - *goal_update_example
    EchoQuestion:
      value: &echo_question_example
        id: 7a1d2e3f-4b5c-4d6e-8f90-1234567890ab
        prompt: What's the most important thing you shipped this week?
        title: Weekly ship recap
        answer_frequency: weekly
        answer_day: monday
        answer_time: "09:30"
        answer_time_zone: Eastern Time (US & Canada)
        next_answer_at: "2026-05-11T13:30:00Z"
        paused_at: null
        created_at: "2026-02-09T19:22:00Z"
        updated_at: "2026-04-28T15:14:33Z"
        url: https://app.steady.space/echo/questions/7a1d2e3f-4b5c-4d6e-8f90-1234567890ab
    EchoQuestionsList:
      value:
        - *echo_question_example
    EchoAnswer:
      value: &echo_answer_example
        id: 9c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f
        question:
          id: 7a1d2e3f-4b5c-4d6e-8f90-1234567890ab
          title: Weekly ship recap
        title: Weekly ship recap for Tue Apr 28
        body: |
          - Shipped the new search UI to staging
          - Reviewed the migration plan with Jordan
        published_at: "2026-04-28T13:30:00Z"
        url: https://app.steady.space/echo/answers/9c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f
    EchoAnswersList:
      value:
        - *echo_answer_example
    Comment:
      value: &comment_example
        id: 1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d
        body: |
          Nice work — let's keep an eye on the error budget.
        person:
          id: 5d8f9a12-3c4b-4e5d-9a6b-7c8d9e0f1a2b
          name: Jordan Park
        resource:
          type: check-in
          id: 9b2c3d4e-5f60-4718-9201-3456789abcde
        created_at: "2026-05-04T19:01:11Z"
    CommentsList:
      value:
        - *comment_example
    Reaction:
      value: &reaction_example
        id: 2b3c4d5e-6f70-4d8e-9a01-2345678901cd
        name: tada
        emoji: 🎉
        person:
          id: 5d8f9a12-3c4b-4e5d-9a6b-7c8d9e0f1a2b
          name: Jordan Park
        resource:
          type: check-in
          id: 9b2c3d4e-5f60-4718-9201-3456789abcde
        created_at: "2026-05-04T19:01:11Z"
    ReactionsList:
      value:
        - *reaction_example
    DigestEntry:
      value: &digest_entry_example
        id: 4f5e6d7c-8b9a-4c1d-8e2f-1a2b3c4d5e6f
        category: goal
        published_at: "2026-05-04T18:18:22Z"
        read_at: null
        resource:
          type: goal-update
          <<: *goal_update_example
    DigestEntriesList:
      value:
        - *digest_entry_example
    Team:
      value: &team_example
        id: 4c4f5632-7065-4dfb-bb90-c21b5b238ce4
        name: Security
        description: We keep production safe and our customers' data private.
        private: false
        completion_tracking: true
        mood_tracking: true
        report_days: [monday, tuesday, wednesday, thursday, friday]
        people:
          - id: ab6e1c81-cc42-47b9-82d0-66601aea003d
            name: Quinn Reed
          - id: 5d8f9a12-3c4b-4e5d-9a6b-7c8d9e0f1a2b
            name: Jordan Park
        url: https://app.steady.space/teams/4c4f5632-7065-4dfb-bb90-c21b5b238ce4
    TeamsList:
      value:
        - *team_example
  headers:
    Link:
      description: |
        RFC 8288 pagination links. Includes `rel="first"`, `rel="prev"`, and
        `rel="next"` URLs as available. Total counts are not emitted to avoid
        an extra `count(*)` query.
      schema:
        type: string
    ETag:
      description: |
        Opaque version identifier for the resource representation (RFC 9110).
        Send back in `If-None-Match` on subsequent `GET` requests to receive a
        304 when the representation has not changed.
      schema:
        type: string
    RateLimit:
      description: 'Quota state per policy as `"name";r=remaining;t=seconds_until_reset`.'
      schema:
        type: string
    RateLimit-Policy:
      description: 'Quota policies as `"name";q=quota;w=window_seconds`.'
      schema:
        type: string
    Retry-After:
      description: Seconds to wait before retrying.
      schema:
        type: integer
        minimum: 1

  responses:
    Unauthorized:
      description: |
        The access token is missing, malformed, expired, or revoked. The body
        is empty; check the `WWW-Authenticate` header for OAuth error details.
      headers:
        WWW-Authenticate:
          schema:
            type: string
    NotFound:
      description: The requested resource could not be found. The body is empty.
    Forbidden:
      description: |
        The authenticated user (or token scope) does not have permission to perform this action.
        The body is empty.
    BadRequest:
      description: The request contained an invalid parameter.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Errors"
    UnprocessableEntity:
      description: The request was well-formed but failed validation.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Errors"
    NotModified:
      description: |
        The resource has not changed since the version identified by the
        client's `If-None-Match` header. The body is empty.
      headers: &rate_limit_headers
        RateLimit:
          $ref: "#/components/headers/RateLimit"
        RateLimit-Policy:
          $ref: "#/components/headers/RateLimit-Policy"
    TooManyRequests:
      description: Rate limit exceeded.
      headers:
        <<: *rate_limit_headers
        Retry-After:
          $ref: "#/components/headers/Retry-After"

x-anchors:
  errors: &errors
    "400":
      $ref: "#/components/responses/BadRequest"
    "401":
      $ref: "#/components/responses/Unauthorized"
    "403":
      $ref: "#/components/responses/Forbidden"
    "404":
      $ref: "#/components/responses/NotFound"
    "422":
      $ref: "#/components/responses/UnprocessableEntity"
    "429":
      $ref: "#/components/responses/TooManyRequests"
  pagination-headers: &pagination_headers
    <<: *rate_limit_headers
    Link:
      $ref: "#/components/headers/Link"
  etag-header: &etag_header
    <<: *rate_limit_headers
    ETag:
      $ref: "#/components/headers/ETag"

paths:
  /check-ins:
    get:
      summary: List check-ins
      operationId: listCheckIns
      tags: [Check-ins]
      parameters:
        - $ref: "#/components/parameters/SinceDate"
        - $ref: "#/components/parameters/UntilDate"
        - $ref: "#/components/parameters/BlockedFilter"
        - $ref: "#/components/parameters/PeopleIdsFilter"
        - $ref: "#/components/parameters/TeamIdsFilter"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of completed check-ins.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CheckIn"
              examples:
                "200 Response":
                  $ref: "#/components/examples/CheckInsList"
        <<: *errors

  /check-ins/{key}:
    get:
      summary: Get a check-in
      operationId: getCheckIn
      tags: [Check-ins]
      parameters:
        - name: key
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/Id"
      responses:
        "200":
          description: The check-in.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CheckIn"
              examples:
                "200 Response":
                  $ref: "#/components/examples/CheckIn"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors
    patch:
      summary: Update a check-in
      operationId: updateCheckIn
      tags: [Check-ins]
      parameters:
        - name: key
          in: path
          required: true
          schema:
            oneOf:
              - $ref: "#/components/schemas/Id"
              - $ref: "#/components/schemas/Date"
      requestBody:
        $ref: "#/components/requestBodies/CheckIn"
      responses:
        "200":
          description: The updated check-in.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CheckIn"
              examples:
                "200 Response":
                  $ref: "#/components/examples/CheckIn"
        <<: *errors

  /goals:
    get:
      summary: List goals
      operationId: listGoals
      tags: [Goals]
      parameters:
        - $ref: "#/components/parameters/SinceDate"
        - $ref: "#/components/parameters/PeopleIdsFilter"
        - $ref: "#/components/parameters/TeamIdsFilter"
        - $ref: "#/components/parameters/GoalIdsFilter"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of goals.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Goal"
              examples:
                "200 Response":
                  $ref: "#/components/examples/GoalsList"
        <<: *errors
    post:
      summary: Create a goal
      operationId: createGoal
      tags: [Goals]
      requestBody:
        $ref: "#/components/requestBodies/Goal"
      responses:
        "201":
          description: The created goal.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Goal"
              examples:
                "201 Response":
                  $ref: "#/components/examples/Goal"
        <<: *errors

  /goals/{id}:
    parameters:
      - $ref: "#/components/parameters/PathId"
    get:
      summary: Get a goal
      operationId: getGoal
      tags: [Goals]
      responses:
        "200":
          description: The goal.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Goal"
              examples:
                "200 Response":
                  $ref: "#/components/examples/Goal"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors
    patch:
      summary: Update a goal
      operationId: updateGoal
      tags: [Goals]
      requestBody:
        $ref: "#/components/requestBodies/Goal"
      responses:
        "200":
          description: The updated goal.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Goal"
              examples:
                "200 Response":
                  $ref: "#/components/examples/Goal"
        <<: *errors
    delete:
      summary: Delete a goal
      operationId: deleteGoal
      tags: [Goals]
      responses:
        "204":
          description: The goal was deleted.
          headers: *rate_limit_headers
        <<: *errors

  /goals/{goal_id}/goal-updates:
    parameters:
      - $ref: "#/components/parameters/GoalIdPath"
    get:
      summary: List a goal's updates
      operationId: listGoalUpdates
      tags: [Goals]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of the goal's updates.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/GoalUpdate"
              examples:
                "200 Response":
                  $ref: "#/components/examples/GoalUpdatesList"
        <<: *errors
    post:
      summary: Create a goal update
      operationId: createGoalUpdate
      tags: [Goals]
      requestBody:
        $ref: "#/components/requestBodies/GoalUpdate"
      responses:
        "201":
          description: The created goal update.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GoalUpdate"
              examples:
                "201 Response":
                  $ref: "#/components/examples/GoalUpdate"
        <<: *errors

  /goal-updates/{id}:
    parameters:
      - $ref: "#/components/parameters/PathId"
    get:
      summary: Get a goal update
      operationId: getGoalUpdate
      tags: [Goals]
      responses:
        "200":
          description: The goal update.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GoalUpdate"
              examples:
                "200 Response":
                  $ref: "#/components/examples/GoalUpdate"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors
    patch:
      summary: Update a goal update
      operationId: updateGoalUpdate
      tags: [Goals]
      requestBody:
        $ref: "#/components/requestBodies/GoalUpdate"
      responses:
        "200":
          description: The updated goal update.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GoalUpdate"
              examples:
                "200 Response":
                  $ref: "#/components/examples/GoalUpdate"
        <<: *errors
    delete:
      summary: Delete a goal update
      operationId: deleteGoalUpdate
      tags: [Goals]
      responses:
        "204":
          description: The goal update was deleted.
          headers: *rate_limit_headers
        <<: *errors

  /check-ins/{check_in_id}/comments:
    parameters:
      - $ref: "#/components/parameters/CheckInIdPath"
    get:
      summary: List a check-in's comments
      operationId: listCheckInComments
      tags: [Comments & Reactions]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of the check-in's comments.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Comment"
              examples:
                "200 Response":
                  $ref: "#/components/examples/CommentsList"
        <<: *errors
    post:
      summary: Comment on a check-in
      operationId: createCheckInComment
      tags: [Comments & Reactions]
      requestBody:
        $ref: "#/components/requestBodies/Comment"
      responses:
        "201":
          description: The created comment.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
              examples:
                "201 Response":
                  $ref: "#/components/examples/Comment"
        <<: *errors

  /check-ins/{check_in_id}/reactions:
    parameters:
      - $ref: "#/components/parameters/CheckInIdPath"
    get:
      summary: List a check-in's reactions
      operationId: listCheckInReactions
      tags: [Comments & Reactions]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of the check-in's reactions.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Reaction"
              examples:
                "200 Response":
                  $ref: "#/components/examples/ReactionsList"
        <<: *errors

  /goal-updates/{goal_update_id}/comments:
    parameters:
      - $ref: "#/components/parameters/GoalUpdateIdPath"
    get:
      summary: List a goal update's comments
      operationId: listGoalUpdateComments
      tags: [Comments & Reactions]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of the goal update's comments.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Comment"
              examples:
                "200 Response":
                  $ref: "#/components/examples/CommentsList"
        <<: *errors
    post:
      summary: Comment on a goal update
      operationId: createGoalUpdateComment
      tags: [Comments & Reactions]
      requestBody:
        $ref: "#/components/requestBodies/Comment"
      responses:
        "201":
          description: The created comment.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
              examples:
                "201 Response":
                  $ref: "#/components/examples/Comment"
        <<: *errors

  /goal-updates/{goal_update_id}/reactions:
    parameters:
      - $ref: "#/components/parameters/GoalUpdateIdPath"
    get:
      summary: List a goal update's reactions
      operationId: listGoalUpdateReactions
      tags: [Comments & Reactions]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of the goal update's reactions.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Reaction"
              examples:
                "200 Response":
                  $ref: "#/components/examples/ReactionsList"
        <<: *errors

  /echo/answers/{id}:
    parameters:
      - $ref: "#/components/parameters/PathId"
    get:
      summary: Get an Echo answer
      operationId: getEchoAnswer
      tags: [Echoes]
      responses:
        "200":
          description: The Echo answer.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EchoAnswer"
              examples:
                "200 Response":
                  $ref: "#/components/examples/EchoAnswer"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors

  /echo/questions:
    get:
      summary: List Echoes
      operationId: listEchoQuestions
      tags: [Echoes]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of the authenticated user's Echoes.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/EchoQuestion"
              examples:
                "200 Response":
                  $ref: "#/components/examples/EchoQuestionsList"
        <<: *errors
    post:
      summary: Create an Echo
      operationId: createEchoQuestion
      tags: [Echoes]
      requestBody:
        $ref: "#/components/requestBodies/EchoQuestion"
      responses:
        "201":
          description: The created Echo.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EchoQuestion"
              examples:
                "201 Response":
                  $ref: "#/components/examples/EchoQuestion"
        <<: *errors

  /echo/questions/{id}:
    parameters:
      - $ref: "#/components/parameters/PathId"
    get:
      summary: Get an Echo
      operationId: getEchoQuestion
      tags: [Echoes]
      responses:
        "200":
          description: The Echo.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EchoQuestion"
              examples:
                "200 Response":
                  $ref: "#/components/examples/EchoQuestion"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors
    patch:
      summary: Update an Echo
      operationId: updateEchoQuestion
      tags: [Echoes]
      requestBody:
        $ref: "#/components/requestBodies/EchoQuestion"
      responses:
        "200":
          description: The updated Echo.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EchoQuestion"
              examples:
                "200 Response":
                  $ref: "#/components/examples/EchoQuestion"
        <<: *errors
    delete:
      summary: Delete an Echo
      operationId: deleteEchoQuestion
      tags: [Echoes]
      responses:
        "204":
          description: The Echo was deleted.
          headers: *rate_limit_headers
        <<: *errors

  /echo/questions/{question_id}/answers:
    parameters:
      - $ref: "#/components/parameters/EchoQuestionIdPath"
    get:
      summary: List an Echo's answers
      operationId: listEchoAnswers
      tags: [Echoes]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of the Echo's answers.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/EchoAnswer"
              examples:
                "200 Response":
                  $ref: "#/components/examples/EchoAnswersList"
        <<: *errors

  /asks:
    get:
      summary: List asks
      operationId: listAsks
      tags: [Asks]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of the authenticated user's asks.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Ask"
              examples:
                "200 Response":
                  $ref: "#/components/examples/AsksList"
        <<: *errors
    post:
      summary: Create an ask
      operationId: createAsk
      tags: [Asks]
      requestBody:
        $ref: "#/components/requestBodies/Ask"
      responses:
        "201":
          description: The created ask.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Ask"
              examples:
                "201 Response":
                  $ref: "#/components/examples/Ask"
        <<: *errors

  /asks/{id}:
    parameters:
      - $ref: "#/components/parameters/PathId"
    get:
      summary: Get an ask
      operationId: getAsk
      tags: [Asks]
      responses:
        "200":
          description: The ask.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Ask"
              examples:
                "200 Response":
                  $ref: "#/components/examples/Ask"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors

  /activities:
    get:
      summary: List activities
      operationId: listActivities
      tags: [Activity]
      parameters:
        - $ref: "#/components/parameters/Since"
        - $ref: "#/components/parameters/Until"
        - $ref: "#/components/parameters/ActivityKindsFilter"
        - $ref: "#/components/parameters/PeopleIdsFilter"
        - $ref: "#/components/parameters/TeamIdsFilter"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of activities.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Activity"
              examples:
                "200 Response":
                  $ref: "#/components/examples/ActivitiesList"
        <<: *errors
    post:
      summary: Create a custom activity
      operationId: createActivity
      tags: [Activity]
      requestBody:
        $ref: "#/components/requestBodies/Activity"
      responses:
        "201":
          description: The created activity.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Activity"
              examples:
                "201 Response":
                  $ref: "#/components/examples/Activity"
        <<: *errors

  /activities/{id}:
    parameters:
      - $ref: "#/components/parameters/PathId"
    get:
      summary: Get an activity
      operationId: getActivity
      tags: [Activity]
      responses:
        "200":
          description: The activity.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Activity"
              examples:
                "200 Response":
                  $ref: "#/components/examples/Activity"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors

  /digest:
    get:
      summary: List digest entries
      operationId: listDigest
      tags: [Digest]
      parameters:
        - $ref: "#/components/parameters/DigestCategoryFilter"
        - $ref: "#/components/parameters/DigestUnreadFilter"
        - $ref: "#/components/parameters/Since"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of digest entries.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/DigestEntry"
              examples:
                "200 Response":
                  $ref: "#/components/examples/DigestEntriesList"
        <<: *errors

  /action-items:
    get:
      summary: List action items
      operationId: listActionItems
      tags: [Action Items]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of the person's open action items.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ActionItem"
        <<: *errors

  /action-items/{id}:
    get:
      summary: Get an action item
      operationId: getActionItem
      tags: [Action Items]
      parameters:
        - $ref: "#/components/parameters/PathId"
      responses:
        "200":
          description: The action item.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ActionItem"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors

  /teams:
    get:
      summary: List teams
      operationId: listTeams
      tags: [Teams & People]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of active teams in the account.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Team"
              examples:
                "200 Response":
                  $ref: "#/components/examples/TeamsList"
        <<: *errors

  /teams/{id}:
    parameters:
      - $ref: "#/components/parameters/PathId"
    get:
      summary: Get a team
      operationId: getTeam
      tags: [Teams & People]
      responses:
        "200":
          description: The team.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Team"
              examples:
                "200 Response":
                  $ref: "#/components/examples/Team"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors
  /people:
    get:
      summary: List people
      operationId: listPeople
      tags: [Teams & People]
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: A page of active people in the account.
          headers: *pagination_headers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Person"
              examples:
                "200 Response":
                  $ref: "#/components/examples/PeopleList"
        <<: *errors

  /people/{id}:
    parameters:
      - $ref: "#/components/parameters/PathId"
    get:
      summary: Get a person
      operationId: getPerson
      tags: [Teams & People]
      responses:
        "200":
          description: The person.
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Person"
              examples:
                "200 Response":
                  $ref: "#/components/examples/Person"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors

  /me:
    get:
      summary: Get the authenticated person
      operationId: getMe
      tags: [Teams & People]
      responses:
        "200":
          description: The authenticated person
          headers: *etag_header
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Person"
              examples:
                "200 Response":
                  $ref: "#/components/examples/Person"
        "304":
          $ref: "#/components/responses/NotModified"
        <<: *errors
