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

# Add post comment

> Add a comment to a post's review thread.

The comment shows up on the post in the app, where your team reviews posts.
Use it to give reviewers context ("swap the image before approving") or to
reply to their feedback. The comment is attributed to your user account —
with an API key, that is the team member who created the key.

Errors:
    401 authentication_required: API key or token is missing, invalid, or revoked.
    403 permission_denied: Your plan does not include API access, or this business is not in your org.
    404 resource_not_found: No post with that ID exists, or it is not in this business.
    422: The body is missing, empty, or longer than 2000 characters.
    429 rate_limit_exceeded: You sent too many requests this minute.



## OpenAPI

````yaml public-openapi.json post /api/businesses/{business_id}/posts/{post_id}/comments
openapi: 3.1.0
info:
  title: Marky Public API
  version: '2026-08-06'
  description: >-
    Create and schedule posts, manage businesses, library, media, and webhooks.


    ## Versioning

    The API uses dated versions (Stripe-style). Send an optional `Marky-Version`
    request header to opt into a version; the response echoes the version it was
    served as. Unpinned requests stay on the floor (2026-04-08) forever, so
    existing integrations never break. Pin to a newer date (e.g. 2026-08-06) to
    receive the newest response shapes; unknown values fall back to the floor.
    Full docs: https://docs.mymarky.ai.


    ## Tolerant reader

    Be a tolerant reader: **ignore unknown fields** in responses (we add fields
    additively, without a version bump) and **tolerate unknown enum values** for
    growing sets like platforms, AI models, statuses, and error codes (marked
    `x-extensible-enum` in this schema). Do not hard-fail on either — treat an
    unrecognized enum value as an opaque string.


    ## Hypermedia

    Responses on the newest version (from 2026-07-17) carry a `self` link — the
    absolute URL of the resource (single reads/updates) or the current page
    (collections) — so you can navigate without rebuilding URLs. Newly created
    resources return their canonical URL in the `Location` header instead.
  termsOfService: https://www.mymarky.ai/legal/terms-and-conditions
  contact:
    name: Marky API Support
    url: https://docs.mymarky.ai
    email: support@mymarky.ai
  license:
    name: Proprietary — © Marky. All rights reserved.
    url: https://www.mymarky.ai/legal/terms-and-conditions
servers:
  - url: https://api.mymarky.ai
    description: Production
security: []
tags:
  - name: businesses
    description: >-
      Set up and manage the brand profiles (businesses) Marky works for — the
      account every post, asset, and connection belongs to.
  - name: posts
    description: >-
      Generate, schedule, queue, and publish on-brand posts — the core job of
      getting a batch of quality content out the door.
  - name: library
    description: >-
      Store and organize the media, files, folders, and templates your posts
      draw from, so on-brand assets are ready when you create.
  - name: integrations
    description: >-
      Connect social accounts and read how published posts performed on each
      platform.
  - name: topics
    description: >-
      Manage the topics and categories that steer what Marky writes about,
      keeping generated content on-message.
  - name: webhooks
    description: >-
      Subscribe to events so your own systems react the moment a post publishes
      or changes.
  - name: keys
    description: Create and revoke the API keys that authenticate your integration.
externalDocs:
  description: Marky API docs
  url: https://docs.mymarky.ai
paths:
  /api/businesses/{business_id}/posts/{post_id}/comments:
    post:
      tags:
        - posts
      summary: Add post comment
      description: >-
        Add a comment to a post's review thread.


        The comment shows up on the post in the app, where your team reviews
        posts.

        Use it to give reviewers context ("swap the image before approving") or
        to

        reply to their feedback. The comment is attributed to your user account
        —

        with an API key, that is the team member who created the key.


        Errors:
            401 authentication_required: API key or token is missing, invalid, or revoked.
            403 permission_denied: Your plan does not include API access, or this business is not in your org.
            404 resource_not_found: No post with that ID exists, or it is not in this business.
            422: The body is missing, empty, or longer than 2000 characters.
            429 rate_limit_exceeded: You sent too many requests this minute.
      operationId: create_post_comment
      parameters:
        - name: business_id
          in: path
          required: true
          schema:
            type: string
            description: A UUID identifier.
            title: Business Id
          description: A UUID identifier.
        - name: post_id
          in: path
          required: true
          schema:
            type: string
            description: A UUID identifier.
            title: Post Id
          description: A UUID identifier.
        - name: Marky-Version
          in: header
          required: false
          schema:
            type: string
            enum:
              - '2026-04-08'
              - '2026-07-17'
              - '2026-08-02'
              - '2026-08-04'
              - '2026-08-06'
            example: '2026-08-06'
          description: >-
            Opt into a dated API version. Omit to stay on the floor (2026-04-08)
            forever — unpinned clients never break. Pin to a newer date (e.g.
            2026-08-06) to receive the newest response shapes. Unknown values
            fall back to the floor. See https://docs.mymarky.ai for the
            versioning model.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostCommentCreateRequest'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostCommentResponse'
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed in the current window (IETF/Zalando name;
                preferred).
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
            RateLimit-Reset:
              description: UNIX epoch (seconds) when the current window resets.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Back-compat alias of RateLimit-Limit.
              schema:
                type: string
            X-RateLimit-Remaining:
              description: Back-compat alias of RateLimit-Remaining.
              schema:
                type: string
            X-RateLimit-Reset:
              description: Back-compat alias of RateLimit-Reset.
              schema:
                type: string
            X-Request-Id:
              description: Unique id for THIS request (req_…). Quote it to support.
              schema:
                type: string
            X-Flow-ID:
              description: >-
                Correlation id for the whole logical flow; echoes the request's
                X-Flow-ID if sent.
              schema:
                type: string
            Marky-Version:
              description: The dated API version this response was served as.
              schema:
                type: string
        '400':
          description: Bad request — the input was malformed or otherwise invalid.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed in the current window (IETF/Zalando name;
                preferred).
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
            RateLimit-Reset:
              description: UNIX epoch (seconds) when the current window resets.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Back-compat alias of RateLimit-Limit.
              schema:
                type: string
            X-RateLimit-Remaining:
              description: Back-compat alias of RateLimit-Remaining.
              schema:
                type: string
            X-RateLimit-Reset:
              description: Back-compat alias of RateLimit-Reset.
              schema:
                type: string
            X-Request-Id:
              description: Unique id for THIS request (req_…). Quote it to support.
              schema:
                type: string
            X-Flow-ID:
              description: >-
                Correlation id for the whole logical flow; echoes the request's
                X-Flow-ID if sent.
              schema:
                type: string
            Marky-Version:
              description: The dated API version this response was served as.
              schema:
                type: string
        '401':
          description: Authentication failed — the API key is missing or invalid.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed in the current window (IETF/Zalando name;
                preferred).
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
            RateLimit-Reset:
              description: UNIX epoch (seconds) when the current window resets.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Back-compat alias of RateLimit-Limit.
              schema:
                type: string
            X-RateLimit-Remaining:
              description: Back-compat alias of RateLimit-Remaining.
              schema:
                type: string
            X-RateLimit-Reset:
              description: Back-compat alias of RateLimit-Reset.
              schema:
                type: string
            X-Request-Id:
              description: Unique id for THIS request (req_…). Quote it to support.
              schema:
                type: string
            X-Flow-ID:
              description: >-
                Correlation id for the whole logical flow; echoes the request's
                X-Flow-ID if sent.
              schema:
                type: string
            Marky-Version:
              description: The dated API version this response was served as.
              schema:
                type: string
        '403':
          description: Forbidden — the key is valid but may not access this resource.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed in the current window (IETF/Zalando name;
                preferred).
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
            RateLimit-Reset:
              description: UNIX epoch (seconds) when the current window resets.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Back-compat alias of RateLimit-Limit.
              schema:
                type: string
            X-RateLimit-Remaining:
              description: Back-compat alias of RateLimit-Remaining.
              schema:
                type: string
            X-RateLimit-Reset:
              description: Back-compat alias of RateLimit-Reset.
              schema:
                type: string
            X-Request-Id:
              description: Unique id for THIS request (req_…). Quote it to support.
              schema:
                type: string
            X-Flow-ID:
              description: >-
                Correlation id for the whole logical flow; echoes the request's
                X-Flow-ID if sent.
              schema:
                type: string
            Marky-Version:
              description: The dated API version this response was served as.
              schema:
                type: string
        '404':
          description: Not found — no resource matches the id in the path.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed in the current window (IETF/Zalando name;
                preferred).
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
            RateLimit-Reset:
              description: UNIX epoch (seconds) when the current window resets.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Back-compat alias of RateLimit-Limit.
              schema:
                type: string
            X-RateLimit-Remaining:
              description: Back-compat alias of RateLimit-Remaining.
              schema:
                type: string
            X-RateLimit-Reset:
              description: Back-compat alias of RateLimit-Reset.
              schema:
                type: string
            X-Request-Id:
              description: Unique id for THIS request (req_…). Quote it to support.
              schema:
                type: string
            X-Flow-ID:
              description: >-
                Correlation id for the whole logical flow; echoes the request's
                X-Flow-ID if sent.
              schema:
                type: string
            Marky-Version:
              description: The dated API version this response was served as.
              schema:
                type: string
        '422':
          description: Validation error — one or more fields failed validation.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed in the current window (IETF/Zalando name;
                preferred).
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
            RateLimit-Reset:
              description: UNIX epoch (seconds) when the current window resets.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Back-compat alias of RateLimit-Limit.
              schema:
                type: string
            X-RateLimit-Remaining:
              description: Back-compat alias of RateLimit-Remaining.
              schema:
                type: string
            X-RateLimit-Reset:
              description: Back-compat alias of RateLimit-Reset.
              schema:
                type: string
            X-Request-Id:
              description: Unique id for THIS request (req_…). Quote it to support.
              schema:
                type: string
            X-Flow-ID:
              description: >-
                Correlation id for the whole logical flow; echoes the request's
                X-Flow-ID if sent.
              schema:
                type: string
            Marky-Version:
              description: The dated API version this response was served as.
              schema:
                type: string
        '429':
          description: Rate limited — retry after the window resets (see Retry-After).
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed in the current window (IETF/Zalando name;
                preferred).
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
            RateLimit-Reset:
              description: UNIX epoch (seconds) when the current window resets.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Back-compat alias of RateLimit-Limit.
              schema:
                type: string
            X-RateLimit-Remaining:
              description: Back-compat alias of RateLimit-Remaining.
              schema:
                type: string
            X-RateLimit-Reset:
              description: Back-compat alias of RateLimit-Reset.
              schema:
                type: string
            X-Request-Id:
              description: Unique id for THIS request (req_…). Quote it to support.
              schema:
                type: string
            X-Flow-ID:
              description: >-
                Correlation id for the whole logical flow; echoes the request's
                X-Flow-ID if sent.
              schema:
                type: string
            Marky-Version:
              description: The dated API version this response was served as.
              schema:
                type: string
            Retry-After:
              description: Seconds to wait before retrying (RFC 9110 delta-seconds).
              schema:
                type: string
        '500':
          description: >-
            Server error — something failed on our side; retry or quote
            X-Request-Id.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          headers:
            RateLimit-Limit:
              description: >-
                Requests allowed in the current window (IETF/Zalando name;
                preferred).
              schema:
                type: string
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: string
            RateLimit-Reset:
              description: UNIX epoch (seconds) when the current window resets.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Back-compat alias of RateLimit-Limit.
              schema:
                type: string
            X-RateLimit-Remaining:
              description: Back-compat alias of RateLimit-Remaining.
              schema:
                type: string
            X-RateLimit-Reset:
              description: Back-compat alias of RateLimit-Reset.
              schema:
                type: string
            X-Request-Id:
              description: Unique id for THIS request (req_…). Quote it to support.
              schema:
                type: string
            X-Flow-ID:
              description: >-
                Correlation id for the whole logical flow; echoes the request's
                X-Flow-ID if sent.
              schema:
                type: string
            Marky-Version:
              description: The dated API version this response was served as.
              schema:
                type: string
      security:
        - HTTPBearer:
            - uid
components:
  schemas:
    PostCommentCreateRequest:
      properties:
        body:
          type: string
          maxLength: 2000
          minLength: 1
          title: Body
          description: >-
            The comment text (1-2000 characters). Shows in the post's review
            thread in the app, where your team sees it.
      additionalProperties: false
      type: object
      required:
        - body
      title: PostCommentCreateRequest
    PostCommentResponse:
      properties:
        id:
          type: string
          title: Id
          description: Comment ID
        body:
          type: string
          title: Body
          description: The comment text
        user_id:
          type: string
          title: User Id
          description: ID of the team member who wrote the comment
        author_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Author Name
          description: >-
            Display name of the team member who wrote the comment. Null when the
            account has no name set.
        resolved:
          type: boolean
          title: Resolved
          description: Whether your team marked this comment as handled
        created_at:
          type: string
          title: Created At
          description: When the comment was written
        updated_at:
          anyOf:
            - type: string
            - type: 'null'
          title: Updated At
          description: Last update time
      type: object
      required:
        - id
        - body
        - user_id
        - resolved
        - created_at
      title: PostCommentResponse
    Problem:
      type: object
      description: >-
        RFC 9457 Problem Details. Returned as application/problem+json to
        clients pinned to 2026-07-17 or later. Match on the stable `code`, never
        on text.
      properties:
        type:
          type: string
          format: uri
          description: URI for the problem type; dereferences to the docs entry for `code`.
        title:
          type: string
          description: >-
            Short human-readable summary of the problem type (the broad error
            category).
        status:
          type: integer
          description: The HTTP status code, repeated in the body.
        detail:
          type: string
          description: >-
            Explanation specific to this occurrence. Display/logging only — do
            not parse.
        instance:
          type: string
          description: The request path that produced this problem.
        code:
          $ref: '#/components/schemas/ErrorCode'
        request_id:
          type: string
          description: >-
            Id of this request (also the X-Request-Id header). Quote it to
            support.
        param:
          type: string
          description: The offending request field, when the problem is field-specific.
      required:
        - type
        - title
        - status
        - detail
        - code
    ErrorEnvelope:
      description: >-
        The body of every non-2xx response.


        `detail` is retained on internal routes for backward-compatibility while
        the

        frontend migrates to reading `error.code`.
      properties:
        error:
          $ref: '#/components/schemas/ErrorDetail'
      required:
        - error
      title: ErrorEnvelope
      type: object
    ErrorCode:
      type: string
      title: ErrorCode
      description: >-
        The full set of stable `error.code` values the API can return.


        Two groups: (1) GENERIC codes the global handler derives from the HTTP
        status

        or message keyword for plain raises (see api_errors._error_code + the
        handlers),

        and (2) the typed BUSINESS codes (mirror of ErrorType) for raises the
        frontend

        must tell apart from other same-status errors.


        This enum exists so OpenAPI emits an `enum` for error.code — a canonical
        list in

        the docs and a typed union for codegen — instead of a bare string. It
        does NOT

        validate runtime responses (those are plain dicts built in
        _build_error_response),

        so a code missing here only means incomplete docs, never a 500. The

        test_error_code_enum_covers_* tests keep it in sync with ErrorType +
        _error_code

        so it can't silently drift.
      x-extensible-enum:
        - authentication_required
        - permission_denied
        - resource_not_found
        - rate_limit_exceeded
        - validation_error
        - internal_error
        - invalid_value
        - invalid_id
        - already_exists
        - invalid_request
        - WORKSPACE_NOT_SUPPORTED
        - INSUFFICIENT_CREDITS
        - BUSINESS_CREDIT_LIMIT_EXCEEDED
        - NO_ENABLED_TOPICS
        - GENERATION_CAP_REACHED
        - CHECKOUT_BLOCKED
        - INVALID_API_KEY
        - SOCIAL_TOKEN_EXPIRED
        - FB_ACCOUNT_BLOCKED
        - PAYMENT_REQUIRED
        - NO_CONNECTED_SOCIALS
        - NOT_ENOUGH_POSTS_FOR_TOPICS
        - WORKSPACE_LIMIT_EXCEEDED
        - RECIPIENT_WORKSPACE_LIMIT_EXCEEDED
        - ADVANCED_WHITELABEL_QUOTA_FROZEN
        - RESELLER_WHITELABEL_AT_CAPACITY
        - RESELLER_WHITELABEL_NOT_PURCHASED
        - CHANNEL_LIMIT_EXCEEDED
        - PHONE_NOT_VERIFIED
        - FILE_TOO_LARGE
        - INVALID_FILE_TYPE
        - SUBSCRIPTION_ALREADY_ACTIVE
        - UPSTREAM_PROVIDER_ERROR
        - PLATFORM_MEDIA_UNSUPPORTED
        - SOCIAL_CONNECT_FAILED
        - SOCIAL_CONNECT_LINK_EXPIRED
        - SOCIAL_APP_PAUSED
        - NO_PHOTO_SOURCE
        - TEMPLATE_FORMAT_MISMATCH
        - TEMPLATE_NOT_FOUND
        - INVALID_CSV_ROW
        - IMAGE_GENERATION_FAILED
        - IMAGE_REFERENCE_INVALID
        - PDF_HAS_NO_TEXT
        - POST_RENDER_FAILED
        - POST_DESIGN_SELECTION_FAILED
        - POST_CONTENT_GENERATION_FAILED
        - POST_IDEATION_FAILED
        - POST_MEDIA_FAILED
        - POST_AI_MEDIA_FAILED
        - POST_AI_MEDIA_BLOCKED
        - POST_RENDER_UNAVAILABLE
        - IDEMPOTENCY_KEY_CONFLICT
        - NO_STRIPE_CUSTOMER
        - X_AGENCY_NOT_ENABLED
        - NO_ACTIVE_SUBSCRIPTION
        - POST_HAS_NO_VIDEO
        - POST_ALREADY_PUBLISHED
        - SCHEDULE_HAS_NO_TIMESLOTS
    ErrorDetail:
      properties:
        type:
          type: string
          title: Type
          description: >-
            Broad error category derived from the HTTP status
            (invalid_request_error, authentication_error, permission_error,
            not_found_error, rate_limit_error, api_error).
        code:
          $ref: '#/components/schemas/ErrorCode'
          description: >-
            Stable, machine-readable error code. Match on THIS, never on the
            message. Codes never change even when the message is reworded.
        message:
          type: string
          title: Message
          description: Human-readable explanation. For display/logging only — do not parse.
        doc_url:
          type: string
          title: Doc Url
          description: Link to the docs entry for this error code.
        param:
          anyOf:
            - type: string
            - type: 'null'
          title: Param
          description: The offending request field, when the error is field-specific.
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Request Id
          description: >-
            The id of this request (also returned as the X-Request-Id header).
            Quote it to support so they can find the exact request in our logs.
        reconnect_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Reconnect Url
          description: >-
            Present on social token-expired errors (SOCIAL_TOKEN_EXPIRED /
            REFRESH_TOKEN_EXPIRED): the page where the user reconnects the
            affected account, so an agent can surface the fix without a second
            call.
        is_reconnect_fixable:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Reconnect Fixable
          description: >-
            True on social token-expired errors — the failure is fixed by
            reconnecting the account (paired with reconnect_url).
      type: object
      required:
        - type
        - code
        - message
        - doc_url
      title: ErrorDetail
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer
      description: >-
        Bearer an mk_live_ API key. A key is ORG-SCOPED: it grants full access
        to every resource in that organization, with no per-endpoint scoping
        (see the `uid` pseudo-permission on each operation). Manage keys at
        https://app.mymarky.ai.

````