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

# List Review Response Drafts Route

> The Responses tab's drafts for one brand, scoped to one platform.

Registered AFTER the ``/reviews/{review_id}/draft-response`` POST and the
``/reviews/drafts/{draft_id}`` PATCHes but that ordering is incidental —
no other GET on this router takes a path segment after ``/reviews``, so
``drafts`` cannot be swallowed as a ``{review_id}``.

Authorization: ``_get_brand_or_404`` proves the caller owns ``brand_id``;
the service then joins every row through that brand's OWN advertiser
identity, so a competitor-sourced review's draft is unreachable here even
if one somehow existed. Platform scoping is a predicate on the review's
source, not a client-side filter — see
``list_review_response_drafts``'s docstring for why each of its three
predicates is load-bearing.

No entitlement METER: listing drafts generates nothing and calls no
provider, and metering a read would charge a user for opening a tab. It
does carry the Responses-tab capability LOCK — a different question
("is this tab on your plan"), Free on every plan today (design §0.5).



## OpenAPI

````yaml /openapi.json get /api/v1/brands/{brand_id}/brand-intelligence/reviews/drafts
openapi: 3.1.0
info:
  title: AITasker
  version: 0.1.0
servers: []
security: []
paths:
  /api/v1/brands/{brand_id}/brand-intelligence/reviews/drafts:
    get:
      tags:
        - Brand Reviews
        - Brand Reviews
      summary: List Review Response Drafts Route
      description: >-
        The Responses tab's drafts for one brand, scoped to one platform.


        Registered AFTER the ``/reviews/{review_id}/draft-response`` POST and
        the

        ``/reviews/drafts/{draft_id}`` PATCHes but that ordering is incidental —

        no other GET on this router takes a path segment after ``/reviews``, so

        ``drafts`` cannot be swallowed as a ``{review_id}``.


        Authorization: ``_get_brand_or_404`` proves the caller owns
        ``brand_id``;

        the service then joins every row through that brand's OWN advertiser

        identity, so a competitor-sourced review's draft is unreachable here
        even

        if one somehow existed. Platform scoping is a predicate on the review's

        source, not a client-side filter — see

        ``list_review_response_drafts``'s docstring for why each of its three

        predicates is load-bearing.


        No entitlement METER: listing drafts generates nothing and calls no

        provider, and metering a read would charge a user for opening a tab. It

        does carry the Responses-tab capability LOCK — a different question

        ("is this tab on your plan"), Free on every plan today (design §0.5).
      operationId: >-
        list_review_response_drafts_route_api_v1_brands__brand_id__brand_intelligence_reviews_drafts_get
      parameters:
        - name: brand_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            title: Brand Id
        - name: platform
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                enum:
                  - trustpilot
                  - google
              - type: 'null'
            title: Platform
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 25
            title: Limit
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            title: Offset
            default: 0
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandReviewResponseDraftListResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - HTTPBearer: []
components:
  schemas:
    BrandReviewResponseDraftListResponse:
      properties:
        generated_at:
          type: string
          format: date-time
          title: Generated At
        platform:
          anyOf:
            - type: string
              enum:
                - trustpilot
                - google
            - type: 'null'
          title: Platform
        total:
          type: integer
          title: Total
        limit:
          type: integer
          title: Limit
        offset:
          type: integer
          title: Offset
        has_more:
          type: boolean
          title: Has More
        items:
          items:
            $ref: '#/components/schemas/BrandReviewResponseDraftListItem'
          type: array
          title: Items
      type: object
      required:
        - generated_at
        - total
        - limit
        - offset
        - has_more
        - items
      title: BrandReviewResponseDraftListResponse
      description: >-
        The Responses tab's page of drafts for one brand on one platform.


        Envelope mirrors ``BrandReviewsResponse`` (total/limit/offset/has_more)
        so

        the workspace pages drafts with the same vocabulary it already pages

        reviews with. ``platform`` echoes the filter that produced the page —

        absent means "every platform", which the tab never asks for but the
        route

        supports.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    BrandReviewResponseDraftListItem:
      properties:
        draft:
          $ref: '#/components/schemas/BrandReviewResponseDraftItem'
        platform:
          type: string
          enum:
            - trustpilot
            - google
          title: Platform
        rating:
          type: number
          title: Rating
        reviewed_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Reviewed At
        review_title:
          anyOf:
            - type: string
            - type: 'null'
          title: Review Title
        review_excerpt:
          anyOf:
            - type: string
            - type: 'null'
          title: Review Excerpt
      type: object
      required:
        - draft
        - platform
        - rating
      title: BrandReviewResponseDraftListItem
      description: >-
        One Responses-tab row (Design §3.8) — a draft plus its review's summary.


        ``draft`` is the SAME ``BrandReviewResponseDraftItem`` the create/edit/

        status routes return, nested rather than flattened. That is deliberate:

        the frontend seeds the shared ``useReviewResponseDraft`` cache directly

        from this field, so widening the draft shape here would fork the one

        contract Design §4.5 exists to keep single.


        The review fields beside it are the collapsed summary the design asks
        for

        (rating + first line + date). ``review_excerpt`` is a CAPPED first line
        of

        an own-brand review body — never the whole body, and structurally never
        a

        competitor's: the list query joins every row through the brand's own

        advertiser identity (see
        ``review_response_drafts.list_review_response_drafts``).
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    BrandReviewResponseDraftItem:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        review_id:
          type: string
          format: uuid
          title: Review Id
        brand_id:
          type: string
          format: uuid
          title: Brand Id
        model:
          type: string
          title: Model
        draft_text:
          type: string
          title: Draft Text
        edited_text:
          anyOf:
            - type: string
            - type: 'null'
          title: Edited Text
        status:
          type: string
          enum:
            - draft
            - edited
            - copied
            - dismissed
          title: Status
        copied_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Copied At
        created_at:
          type: string
          format: date-time
          title: Created At
        updated_at:
          type: string
          format: date-time
          title: Updated At
      type: object
      required:
        - id
        - review_id
        - brand_id
        - model
        - draft_text
        - status
        - created_at
        - updated_at
      title: BrandReviewResponseDraftItem
      description: One AI-drafted reply, as served to every consuming surface.
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer

````