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

# Report feedback in bulk

> Accepts 1–500 feedback items. Per-item failures are returned in the 200 response with `status: error`; they do not fail the whole batch.

Submit multiple token outcomes and inspect each result.


## OpenAPI

````yaml https://ninetile.io/openapi.json POST /feedback
openapi: 3.1.0
info:
  title: Ninetile API
  version: 1.0.0
  description: >-
    Native Ninetile JSON API. Solve hCaptcha challenges, retrieve solve status,
    report token outcomes, inspect account usage, and recognize hCaptcha image
    challenges. Successful solves and recognitions are charged to the account's
    prepaid USD balance.
servers:
  - url: https://api.ninetile.io/v1
    description: Primary API
  - url: https://api.radiumstore.org/v1
    description: Alternate API host
security:
  - BearerAuth: []
  - ApiKeyHeader: []
tags:
  - name: Solves
    description: Create, inspect, cancel, and report hCaptcha token solves.
  - name: Feedback
    description: Report verdicts for completed solves.
  - name: Account
    description: Inspect account balance, limits, and daily usage.
  - name: Recognition
    description: Recognize hCaptcha image challenges for clients running their own browser.
  - name: Status
    description: Public service liveness.
paths:
  /feedback:
    post:
      tags:
        - Feedback
      summary: Report multiple solve verdicts
      description: >-
        Accepts 1–500 feedback items. Per-item failures are returned in the 200
        response with `status: error`; they do not fail the whole batch.
      operationId: reportFeedbackBatch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FeedbackBatchRequest'
            example:
              feedback:
                - solve_id: solve_01ARZ3NDEKTSV4RRFFQ69G5FAV
                  outcome: rejected
                  reason: invalid-response
      responses:
        '200':
          description: Batch processed; inspect each item's status.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FeedbackBatch'
              example:
                object: feedback_batch
                recorded: 1
                updated: 0
                unchanged: 0
                failed: 0
                results:
                  - solve_id: solve_01ARZ3NDEKTSV4RRFFQ69G5FAV
                    status: recorded
                    error: null
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '415':
          $ref: '#/components/responses/UnsupportedMediaType'
        '422':
          $ref: '#/components/responses/ValidationError'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    FeedbackBatchRequest:
      type: object
      required:
        - feedback
      properties:
        feedback:
          type: array
          minItems: 1
          maxItems: 500
          items:
            $ref: '#/components/schemas/FeedbackBatchItem'
    FeedbackBatch:
      type: object
      required:
        - object
        - recorded
        - updated
        - unchanged
        - failed
        - results
      properties:
        object:
          const: feedback_batch
        recorded:
          type: integer
        updated:
          type: integer
        unchanged:
          type: integer
        failed:
          type: integer
        results:
          type: array
          items:
            $ref: '#/components/schemas/FeedbackBatchResult'
    FeedbackBatchItem:
      allOf:
        - $ref: '#/components/schemas/FeedbackItem'
        - type: object
          required:
            - solve_id
          properties:
            solve_id:
              type: string
              pattern: ^solve_
    FeedbackBatchResult:
      type: object
      required:
        - solve_id
        - status
        - error
      properties:
        solve_id:
          type:
            - string
            - 'null'
        status:
          type: string
          enum:
            - recorded
            - updated
            - unchanged
            - error
        error:
          oneOf:
            - $ref: '#/components/schemas/FeedbackItemError'
            - type: 'null'
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
            - param
            - request_id
          properties:
            code:
              type: string
              enum:
                - invalid_request
                - unauthorized
                - insufficient_credits
                - key_credit_limit_exceeded
                - account_locked
                - forbidden
                - not_eligible
                - not_found
                - conflict
                - payload_too_large
                - unsupported_media_type
                - expired_window
                - recognition_failed
                - validation_error
                - concurrency_limit_exceeded
                - proxy_unavailable
                - rate_capped
                - rate_limited
                - sitekey_rate_limited
                - internal_error
                - maintenance
                - capacity_exhausted
                - proxy_pool_depleted
            message:
              type: string
            param:
              type:
                - string
                - 'null'
            request_id:
              type: string
              format: uuid
    FeedbackItem:
      type: object
      required:
        - outcome
      properties:
        outcome:
          type: string
          enum:
            - accepted
            - rejected
            - unknown
            - unused
            - error
        reason:
          type: string
          maxLength: 512
        context:
          type: string
          maxLength: 2000
        reported_at:
          type: string
          format: date-time
          maxLength: 64
    FeedbackItemError:
      type: object
      required:
        - code
        - message
        - param
      properties:
        code:
          type: string
          enum:
            - not_eligible
            - expired_window
            - validation_error
        message:
          type: string
        param:
          type:
            - string
            - 'null'
  headers:
    RequestId:
      description: Request identifier for support inquiries.
      schema:
        type: string
        format: uuid
    RetryAfter:
      description: >-
        Seconds to wait before retrying; present when the error asks the client
        to wait.
      schema:
        type: integer
        minimum: 1
  responses:
    BadRequest:
      description: Invalid JSON or a non-object request body (`invalid_request`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: API key missing, malformed, unknown, or revoked (`unauthorized`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: >-
        Account locked or key not permitted to access this endpoint
        (`account_locked`, `forbidden`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    UnsupportedMediaType:
      description: Request body must use JSON content type (`unsupported_media_type`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    ValidationError:
      description: >-
        Field validation error or expired feedback window (`validation_error`,
        `expired_window`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    InternalError:
      description: Unexpected server error (`internal_error`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Ninetile API key, sent as `Authorization: Bearer <key>`. Keys are issued
        in the dashboard.
    ApiKeyHeader:
      type: apiKey
      in: header
      name: x-api-key
      description: Alternative to the Authorization Bearer header.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.