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

# Update an AI learning

> <Warning>
  **Coming soon.** This endpoint will be available by early October 2026.
</Warning>

<small>_Requires the `ai-sdr:write` scope (or a broader one that includes it)._</small>

Use this endpoint when you need to change part of an existing AI learning without resending all
of it; the full updated learning comes back in the response. Send at least one of text,
categories, scope, isEnabled and sequenceIds — every field you leave out keeps its current value.
Leaving text out is the way to switch a learning on or off without touching its wording:
rewording a learning the AI generated turns it into a manually authored one, which can hit the
manual limit even though the number of learnings does not change, and the call is then refused
with a conflict. sequenceIds names at most 50 sequences with no repeats, and any it adds must be
ones you can see; it is required once the learning ends up on the sequence scope and rejected on
every other one. Moving a sequence-scoped learning to another scope drops its sequenceIds for
you — send scope on its own — but sending sequenceIds alongside a scope that does not take them
is still refused.
Moving a learning to the workspace or organization scope needs the matching permission, and a
learning somebody else set for your team or org cannot be changed by you at all. The AI Learnings
feature must be enabled for your team.



## OpenAPI

````yaml /api-reference/bundled.yaml patch /v3/ai-sdr/learnings/{id}
openapi: 3.1.0
info:
  version: 3.0.0
  title: Reply API
  description: API for managing email sequences, contacts, and automation workflows
servers:
  - url: https://api.reply.io
security:
  - bearerAuth: []
tags:
  - name: Contacts
    description: Manage individual contacts
  - name: Contact Lists
    description: Manage contact lists and contact membership
  - name: Accounts
    description: Manage accounts (companies/organizations)
  - name: Account Lists
    description: Manage account lists and account membership
  - name: Custom Fields
    description: Manage custom contact fields
  - name: Prompt Actions
    description: Save reusable AI prompts and run them on contacts to fill custom fields
  - name: Contact Blacklist Rules
    description: Manage blacklist rules for domains, emails, and email exceptions
  - name: Live Data
    description: >-
      Find new contacts via Live Data searches and read typeahead values for the
      Live Data / Autopilot filter sidebar
  - name: Contact Enrichment
    description: >-
      Enrich contacts with emails, phone numbers, LinkedIn data, and AI-filled
      custom fields
  - name: Email Validations
    description: Estimate and schedule asynchronous email validation jobs
  - name: AI SDR Web Search
    description: Find contacts via AI-driven web search and review past searches
  - name: Sequences
    description: Manage email automation sequences
  - name: Sequence Steps
    description: Manage individual steps in sequences
  - name: Sequence Contacts
    description: Manage contacts within sequences
  - name: Sequence Folders
    description: Organize sequences into folders
  - name: Email Accounts
    description: Manage email accounts used for sending and receiving
  - name: Sequence Email Accounts
    description: Manage email accounts linked to sequences
  - name: LinkedIn Accounts
    description: Manage LinkedIn accounts for outreach
  - name: Sequence LinkedIn Accounts
    description: Manage LinkedIn accounts linked to sequences
  - name: Sequence Templates
    description: Manage sequence templates
  - name: Email Templates
    description: Manage email templates and template folders
  - name: Voices
    description: Manage cloned voices used for AI voice message steps
  - name: Schedules
    description: Manage email send schedules and timing
  - name: Holiday Calendars
    description: Manage holiday calendars for scheduling
  - name: Inbox
    description: >-
      Manage inbox threads — list/filter, read state, replies, category
      assignment, and meeting-intent flagging
  - name: Inbox Categories
    description: Manage per-team inbox thread categories and assign threads to them
  - name: Direct Outreach
    description: >-
      Send one-off outreach directly to a contact outside of any sequence —
      direct emails and LinkedIn connection requests, messages, InMails, and
      voice messages
  - name: Tasks
    description: Manage tasks and to-do items
  - name: Reports
    description: >-
      Generate and access performance reports across email, calls, tasks,
      LinkedIn, and team performance
  - name: AI SDR Sequences
    description: >-
      Manage AI SDR sequences and their AI SDR-specific settings — create, read
      settings, partial update, autopilot enable/disable/force-start, approval
      mode, generated step types, and playbook/knowledge-base connections
  - name: AI SDR Strategist
    description: Trigger AI Strategist runs
  - name: AI SDR Playbooks
    description: >-
      Manage AI SDR playbooks — tone, voice, and style guides applied during
      personalized message generation
  - name: AI SDR Knowledge Bases
    description: >-
      Manage AI SDR knowledge bases — collections of documents, links, reply
      handlers, and reengagement cards that inform the agent's responses
  - name: AI SDR Offers
    description: >-
      Manage AI SDR offers — bundles of company-context inputs (ICP, pain
      points, value propositions, etc.) used to personalize outreach
  - name: AI SDR Pending Approvals
    description: >-
      Review, send, regenerate, and provide feedback on AI-generated messages
      awaiting human approval
  - name: AI SDR Sequence Preview
    description: >-
      Read and regenerate per-contact previews of the messages a sequence will
      send, and provide feedback on preview messages
  - name: AI SDR Insights
    description: Read AI SDR insights for sequence contacts
  - name: AI SDR Intent Signals
    description: >-
      Read Reply industry IDs and technology slugs used in AI SDR intent-signal
      configuration (typeahead)
  - name: AI Prompts
    description: >-
      Manage the AI prompts used to configure sequence steps, and preview the
      output a prompt produces
  - name: AI SDR Learnings
    description: >-
      Manage the standing rules that shape how the AI writes — list, read,
      create, partially update and delete AI learnings
  - name: Registration
    description: Register the contact that domain purchases are filed under
  - name: Domains
    description: Find domains available to buy for outreach
  - name: User Account
    description: Account information and authentication verification
  - name: Settings
    description: Manage team and user settings
  - name: Billing
    description: Subscription details and monthly active contacts usage
  - name: Webhooks
    description: Manage webhook subscriptions and inspect delivery history
  - name: Background Jobs
    description: >-
      Track and cancel asynchronous background operations (e.g., email
      validation)
  - name: Attachments
    description: >-
      Upload file attachments used across email templates, sequence steps, and
      direct emails
paths:
  /v3/ai-sdr/learnings/{id}:
    patch:
      tags:
        - AI SDR Learnings
      summary: Update an AI learning
      description: >-
        <Warning>
          **Coming soon.** This endpoint will be available by early October 2026.
        </Warning>


        <small>_Requires the `ai-sdr:write` scope (or a broader one that
        includes it)._</small>


        Use this endpoint when you need to change part of an existing AI
        learning without resending all

        of it; the full updated learning comes back in the response. Send at
        least one of text,

        categories, scope, isEnabled and sequenceIds — every field you leave out
        keeps its current value.

        Leaving text out is the way to switch a learning on or off without
        touching its wording:

        rewording a learning the AI generated turns it into a manually authored
        one, which can hit the

        manual limit even though the number of learnings does not change, and
        the call is then refused

        with a conflict. sequenceIds names at most 50 sequences with no repeats,
        and any it adds must be

        ones you can see; it is required once the learning ends up on the
        sequence scope and rejected on

        every other one. Moving a sequence-scoped learning to another scope
        drops its sequenceIds for

        you — send scope on its own — but sending sequenceIds alongside a scope
        that does not take them

        is still refused.

        Moving a learning to the workspace or organization scope needs the
        matching permission, and a

        learning somebody else set for your team or org cannot be changed by you
        at all. The AI Learnings

        feature must be enabled for your team.
      operationId: PatchAiLearning
      parameters:
        - name: id
          in: path
          required: true
          description: AI learning ID
          schema:
            type: integer
            minimum: 1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              title: AiLearningPatchRequest
              description: >-
                Partial update of an AI learning. Send at least one field; every
                field you leave out keeps its

                current value.
              properties:
                text:
                  type: string
                  minLength: 1
                  maxLength: 1000
                  description: >-
                    New wording of the rule. Rewording a learning whose `source`
                    is `aiGenerated` turns it into a

                    `manual` one.
                categories:
                  type: array
                  minItems: 1
                  uniqueItems: true
                  description: Where the rule applies
                  items:
                    type: string
                    title: AI Learning Category
                    description: >-
                      Where a learning applies. `personalizedMessage` shapes
                      outbound message drafting, `replyHandling`

                      shapes answers to incoming mail. A learning can carry
                      both.
                    enum:
                      - personalizedMessage
                      - replyHandling
                scope:
                  description: >-
                    Who the learning binds. Moving a learning off the `sequence`
                    scope drops its `sequenceIds` —

                    send `scope` on its own. `workspace` and `organization` need
                    the matching permission.
                  type: string
                  title: AI Learning Scope
                  enum:
                    - organization
                    - workspace
                    - user
                    - sequence
                isEnabled:
                  type: boolean
                  description: Whether the learning is switched on
                sequenceIds:
                  type: array
                  maxItems: 50
                  uniqueItems: true
                  description: >-
                    Sequences the learning is limited to; any sequence added
                    must be one you can see. Required

                    once the learning ends up on the `sequence` scope and
                    rejected on every other scope.
                  items:
                    type: integer
                    minimum: 1
              example:
                isEnabled: false
      responses:
        '200':
          description: The updated learning
          content:
            application/json:
              schema:
                type: object
                title: AiLearning
                description: >-
                  A standing rule that shapes how the AI writes, together with
                  the learnings it contradicts.
                properties:
                  id:
                    type: integer
                    description: Unique identifier of the learning
                    readOnly: true
                  text:
                    type: string
                    description: The standing rule the AI follows
                    readOnly: true
                  categories:
                    type: array
                    description: Where the rule applies
                    items:
                      type: string
                      title: AI Learning Category
                      description: >-
                        Where a learning applies. `personalizedMessage` shapes
                        outbound message drafting, `replyHandling`

                        shapes answers to incoming mail. A learning can carry
                        both.
                      enum:
                        - personalizedMessage
                        - replyHandling
                    readOnly: true
                  source:
                    description: Whether the AI derived the learning or a person wrote it
                    type: string
                    title: AI Learning Source
                    enum:
                      - aiGenerated
                      - manual
                  scope:
                    description: Who the learning binds
                    type: string
                    title: AI Learning Scope
                    enum:
                      - organization
                      - workspace
                      - user
                      - sequence
                  sequenceIds:
                    type: array
                    description: >-
                      Sequences the learning is limited to. Empty unless `scope`
                      is `sequence`.
                    items:
                      type: integer
                    readOnly: true
                  isEnabled:
                    type: boolean
                    description: Whether the learning is switched on
                    readOnly: true
                  createdAt:
                    type: string
                    format: date-time
                    description: When the learning was created (UTC)
                    readOnly: true
                  updatedAt:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      When the learning was last changed (UTC). `null` if it has
                      never been changed.
                    readOnly: true
                  ownerUserId:
                    type: integer
                    nullable: true
                    description: >-
                      User ID of the learning's owner. `null` when the owner is
                      no longer a Reply user.
                    readOnly: true
                  isOwn:
                    type: boolean
                    description: >-
                      Whether the learning is yours. `false` for a learning a
                      team or organization admin set for everyone.
                    readOnly: true
                  conflictState:
                    description: >-
                      How the learning stands against the learnings it
                      contradicts. An `unresolved` learning is not applied.
                    type: string
                    title: AI Learning Conflict State
                    enum:
                      - none
                      - overridden
                      - takesPrecedence
                      - unresolved
                  conflicts:
                    type: array
                    description: >-
                      Every other learning this one contradicts. Empty when
                      `conflictState` is `none`.
                    items:
                      type: object
                      title: AiLearningConflict
                      description: >-
                        Another AI learning that contradicts the one being read,
                        and which of the two currently applies.
                      properties:
                        otherLearningId:
                          type: integer
                          description: ID of the contradicting learning
                          readOnly: true
                        otherText:
                          type: string
                          description: Text of the contradicting learning
                          readOnly: true
                        categories:
                          type: array
                          description: Categories the contradicting learning applies to
                          items:
                            type: string
                            title: AI Learning Category
                            description: >-
                              Where a learning applies. `personalizedMessage`
                              shapes outbound message drafting, `replyHandling`

                              shapes answers to incoming mail. A learning can
                              carry both.
                            enum:
                              - personalizedMessage
                              - replyHandling
                          readOnly: true
                        state:
                          description: Which of the two learnings currently applies
                          type: string
                          title: AI Learning Conflict State
                          enum:
                            - none
                            - overridden
                            - takesPrecedence
                            - unresolved
                        reason:
                          type: string
                          description: Why the two learnings contradict each other
                          readOnly: true
                      example:
                        otherLearningId: 5512
                        otherText: Always open with a short greeting.
                        categories:
                          - personalizedMessage
                        state: overridden
                        reason: One learning forbids a greeting the other requires.
                    readOnly: true
                example:
                  id: 5498
                  text: Never open a message with "Hello".
                  categories:
                    - personalizedMessage
                  source: manual
                  scope: user
                  sequenceIds: []
                  isEnabled: true
                  createdAt: '2026-09-02T09:14:07Z'
                  updatedAt: '2026-09-11T16:41:55Z'
                  ownerUserId: 1234
                  isOwn: true
                  conflictState: takesPrecedence
                  conflicts:
                    - otherLearningId: 5512
                      otherText: Always open with a short greeting.
                      categories:
                        - personalizedMessage
                      state: takesPrecedence
                      reason: One learning forbids a greeting the other requires.
        '400':
          description: >-
            The request body could not be parsed or failed validation,
            sequenceIds does not fit the scope the

            learning ends up with, or a sequence in sequenceIds is not one you
            can see.
          content:
            application/problem+json:
              schema:
                oneOf:
                  - allOf:
                      - allOf:
                          - type: object
                            title: Problem Details
                            description: >-
                              Bare RFC 9457 problem-details envelope. Returned
                              by middleware-level errors

                              that don't carry domain context: 401 Unauthorized
                              (auth middleware),

                              429 Too Many Requests (rate-limit middleware), and
                              route-level 404 / 405 /

                              415 (framework middleware).


                              Business and validation responses extend this
                              envelope and add additional

                              fields — see `business-problem.model.yaml` (adds
                              `code` slug) and

                              `validation-problem.model.yaml` (adds `errors[]`
                              array).
                            properties:
                              title:
                                type: string
                                description: Short, human-readable summary of the problem.
                              status:
                                type: integer
                                description: HTTP status code.
                                minimum: 100
                                maximum: 599
                              detail:
                                type: string
                                description: >-
                                  Human-readable explanation specific to this
                                  occurrence.
                          - type: object
                            properties:
                              errors:
                                type: array
                                description: >-
                                  List of field-level validation errors. Always
                                  non-empty when this

                                  envelope is returned. Each entry pins a single
                                  offending field

                                  via JSON Pointer plus a sanitized detail
                                  string.
                                items:
                                  type: object
                                  title: Validation Error
                                  description: A single field-level validation error.
                                  properties:
                                    pointer:
                                      type: string
                                      description: >-
                                        JSON Pointer (RFC 6901) to the offending
                                        field — e.g.

                                        `/steps/0/subject`.


                                        * An empty string (`""`) means the error
                                        applies to the whole
                                          request body (e.g. body is missing or unparseable).
                                        * For route or query parameter failures
                                        the pointer is the parameter
                                          name (e.g. `id`, `top`).
                                      example: /steps/0/subject
                                    detail:
                                      type: string
                                      description: >-
                                        Sanitized, human-readable explanation of
                                        this field's error. One of a

                                        small set of templates — `"Field is
                                        required."`, `"Value has an

                                        invalid type."`, `"Value has an invalid
                                        format."`, `"Request body is

                                        not valid JSON."`, `"The request body is
                                        required and cannot be

                                        empty."` — or a FluentValidator message
                                        on body endpoints.
                                      example: Field is required.
                        title: Validation Problem
                        description: >-
                          Input-validation error response at 400. Returned when
                          the request body

                          fails binding, FluentValidator rules, or when
                          route/query parameter

                          attribute validation (`[Range]`, `[Required]`) fails.
                          Route, query, and

                          body errors are combined into a single `errors[]`
                          array — clients should

                          not assume one error per request.
                      - example:
                          title: Validation failed
                          status: 400
                          detail: The request body contains validation errors.
                          errors:
                            - pointer: /name
                              detail: Field is required.
                  - allOf:
                      - allOf:
                          - type: object
                            title: Problem Details
                            description: >-
                              Bare RFC 9457 problem-details envelope. Returned
                              by middleware-level errors

                              that don't carry domain context: 401 Unauthorized
                              (auth middleware),

                              429 Too Many Requests (rate-limit middleware), and
                              route-level 404 / 405 /

                              415 (framework middleware).


                              Business and validation responses extend this
                              envelope and add additional

                              fields — see `business-problem.model.yaml` (adds
                              `code` slug) and

                              `validation-problem.model.yaml` (adds `errors[]`
                              array).
                            properties:
                              title:
                                type: string
                                description: Short, human-readable summary of the problem.
                              status:
                                type: integer
                                description: HTTP status code.
                                minimum: 100
                                maximum: 599
                              detail:
                                type: string
                                description: >-
                                  Human-readable explanation specific to this
                                  occurrence.
                          - type: object
                            properties:
                              code:
                                type: string
                                description: >-
                                  Stable, machine-readable error slug in the
                                  form

                                  `"<resource>.<variant>"`.


                                  * `resource` is the camelCased domain — e.g.
                                  `sequence`,
                                    `contact`, `inboxThread`, `blacklistDomainRule`.
                                  * `variant` is the camelCased specific failure
                                  mode — e.g.
                                    `notFound`, `forbidden`, `duplicateName`, `globalRuleReadOnly`.

                                  Use `code` for programmatic error handling;
                                  use `detail` for

                                  user-facing messages. Slugs are stable across
                                  server-side enum

                                  reorderings and never change meaning under a
                                  given resource.
                                pattern: ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)+$
                                example: sequence.notFound
                        title: Business Problem
                        description: >-
                          Domain error response carrying a stable, namespaced
                          error slug.

                          Emitted for most 4xx responses (business 400, 403,
                          404, 409, …) and

                          for 503 when a downstream dependency is unavailable.
                      - example:
                          title: Bad Request
                          status: 400
                          detail: Pagination parameters are invalid.
                          code: sequence.invalidPagination
              examples:
                no_field:
                  summary: No field was sent
                  value:
                    title: Validation failed
                    status: 400
                    detail: The request body contains validation errors.
                    errors:
                      - pointer: ''
                        detail: At least one field must be provided
                unparseable_body:
                  summary: A field has a value of the wrong type
                  value:
                    title: Request body could not be parsed
                    status: 400
                    detail: >-
                      The request body is malformed or contains invalid values
                      for one or more fields.
                    errors:
                      - pointer: /isEnabled
                        detail: >-
                          Could not convert string to boolean: yes. Path
                          'isEnabled'.
                sequence_ids_not_accepted:
                  summary: sequenceIds sent for a scope that does not take them
                  value:
                    title: Bad Request
                    status: 400
                    detail: sequenceIds is only accepted when scope is 'sequence'.
                    code: aiLearning.invalidParameter
                sequences_not_found:
                  summary: A sequence in sequenceIds is not one you can see
                  value:
                    title: Bad Request
                    status: 400
                    detail: Sequence(s) 42, 57 not found.
                    code: aiLearning.invalidParameter
        '401':
          description: >-
            Unauthorized. The response body is empty; check the
            `WWW-Authenticate` header for the expected scheme.
          content:
            application/problem+json:
              schema:
                allOf:
                  - type: object
                    title: Problem Details
                    description: >-
                      Bare RFC 9457 problem-details envelope. Returned by
                      middleware-level errors

                      that don't carry domain context: 401 Unauthorized (auth
                      middleware),

                      429 Too Many Requests (rate-limit middleware), and
                      route-level 404 / 405 /

                      415 (framework middleware).


                      Business and validation responses extend this envelope and
                      add additional

                      fields — see `business-problem.model.yaml` (adds `code`
                      slug) and

                      `validation-problem.model.yaml` (adds `errors[]` array).
                    properties:
                      title:
                        type: string
                        description: Short, human-readable summary of the problem.
                      status:
                        type: integer
                        description: HTTP status code.
                        minimum: 100
                        maximum: 599
                      detail:
                        type: string
                        description: >-
                          Human-readable explanation specific to this
                          occurrence.
                  - example:
                      title: Unauthorized
                      status: 401
                      detail: Authentication credentials are missing or invalid.
        '403':
          description: >-
            The AI Learnings feature is not enabled for your team, you may not
            move the learning to the requested

            scope, or the learning is one somebody else set for your team or
            organization.
          content:
            application/problem+json:
              schema:
                allOf:
                  - allOf:
                      - type: object
                        title: Problem Details
                        description: >-
                          Bare RFC 9457 problem-details envelope. Returned by
                          middleware-level errors

                          that don't carry domain context: 401 Unauthorized
                          (auth middleware),

                          429 Too Many Requests (rate-limit middleware), and
                          route-level 404 / 405 /

                          415 (framework middleware).


                          Business and validation responses extend this envelope
                          and add additional

                          fields — see `business-problem.model.yaml` (adds
                          `code` slug) and

                          `validation-problem.model.yaml` (adds `errors[]`
                          array).
                        properties:
                          title:
                            type: string
                            description: Short, human-readable summary of the problem.
                          status:
                            type: integer
                            description: HTTP status code.
                            minimum: 100
                            maximum: 599
                          detail:
                            type: string
                            description: >-
                              Human-readable explanation specific to this
                              occurrence.
                      - type: object
                        properties:
                          code:
                            type: string
                            description: >-
                              Stable, machine-readable error slug in the form

                              `"<resource>.<variant>"`.


                              * `resource` is the camelCased domain — e.g.
                              `sequence`,
                                `contact`, `inboxThread`, `blacklistDomainRule`.
                              * `variant` is the camelCased specific failure
                              mode — e.g.
                                `notFound`, `forbidden`, `duplicateName`, `globalRuleReadOnly`.

                              Use `code` for programmatic error handling; use
                              `detail` for

                              user-facing messages. Slugs are stable across
                              server-side enum

                              reorderings and never change meaning under a given
                              resource.
                            pattern: ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)+$
                            example: sequence.notFound
                    title: Business Problem
                    description: >-
                      Domain error response carrying a stable, namespaced error
                      slug.

                      Emitted for most 4xx responses (business 400, 403, 404,
                      409, …) and

                      for 503 when a downstream dependency is unavailable.
                  - example:
                      title: Forbidden
                      status: 403
                      detail: You do not have permission to access this resource.
                      code: sequence.forbidden
              examples:
                feature_unavailable:
                  summary: The feature is not enabled for your team
                  value:
                    title: Forbidden
                    status: 403
                    detail: AI Learnings is not available for your team
                    code: aiLearning.forbidden
                scopes_unavailable:
                  summary: >-
                    Your team's plan does not include team or organization
                    learnings
                  value:
                    title: Forbidden
                    status: 403
                    detail: >-
                      Sharing AI Learnings beyond your own account is not
                      available for your team
                    code: aiLearning.forbidden
                scope_not_permitted:
                  summary: >-
                    You lack the permission for the workspace or organization
                    scope
                  value:
                    title: Forbidden
                    status: 403
                    detail: >-
                      You do not have permission to share AI Learnings with your
                      team or organization
                    code: aiLearning.forbidden
        '404':
          description: AI learning not found
          content:
            application/problem+json:
              schema:
                allOf:
                  - allOf:
                      - type: object
                        title: Problem Details
                        description: >-
                          Bare RFC 9457 problem-details envelope. Returned by
                          middleware-level errors

                          that don't carry domain context: 401 Unauthorized
                          (auth middleware),

                          429 Too Many Requests (rate-limit middleware), and
                          route-level 404 / 405 /

                          415 (framework middleware).


                          Business and validation responses extend this envelope
                          and add additional

                          fields — see `business-problem.model.yaml` (adds
                          `code` slug) and

                          `validation-problem.model.yaml` (adds `errors[]`
                          array).
                        properties:
                          title:
                            type: string
                            description: Short, human-readable summary of the problem.
                          status:
                            type: integer
                            description: HTTP status code.
                            minimum: 100
                            maximum: 599
                          detail:
                            type: string
                            description: >-
                              Human-readable explanation specific to this
                              occurrence.
                      - type: object
                        properties:
                          code:
                            type: string
                            description: >-
                              Stable, machine-readable error slug in the form

                              `"<resource>.<variant>"`.


                              * `resource` is the camelCased domain — e.g.
                              `sequence`,
                                `contact`, `inboxThread`, `blacklistDomainRule`.
                              * `variant` is the camelCased specific failure
                              mode — e.g.
                                `notFound`, `forbidden`, `duplicateName`, `globalRuleReadOnly`.

                              Use `code` for programmatic error handling; use
                              `detail` for

                              user-facing messages. Slugs are stable across
                              server-side enum

                              reorderings and never change meaning under a given
                              resource.
                            pattern: ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)+$
                            example: sequence.notFound
                    title: Business Problem
                    description: >-
                      Domain error response carrying a stable, namespaced error
                      slug.

                      Emitted for most 4xx responses (business 400, 403, 404,
                      409, …) and

                      for 503 when a downstream dependency is unavailable.
                  - example:
                      title: Not Found
                      status: 404
                      detail: The requested resource was not found.
                      code: sequence.notFound
              example:
                title: Not Found
                status: 404
                detail: AI learning '5498' not found
                code: aiLearning.notFound
        '409':
          description: >-
            The change would exceed the number of manually authored learnings
            those categories and scope may hold.

            The detail says which limit is reached.
          content:
            application/problem+json:
              schema:
                allOf:
                  - allOf:
                      - type: object
                        title: Problem Details
                        description: >-
                          Bare RFC 9457 problem-details envelope. Returned by
                          middleware-level errors

                          that don't carry domain context: 401 Unauthorized
                          (auth middleware),

                          429 Too Many Requests (rate-limit middleware), and
                          route-level 404 / 405 /

                          415 (framework middleware).


                          Business and validation responses extend this envelope
                          and add additional

                          fields — see `business-problem.model.yaml` (adds
                          `code` slug) and

                          `validation-problem.model.yaml` (adds `errors[]`
                          array).
                        properties:
                          title:
                            type: string
                            description: Short, human-readable summary of the problem.
                          status:
                            type: integer
                            description: HTTP status code.
                            minimum: 100
                            maximum: 599
                          detail:
                            type: string
                            description: >-
                              Human-readable explanation specific to this
                              occurrence.
                      - type: object
                        properties:
                          code:
                            type: string
                            description: >-
                              Stable, machine-readable error slug in the form

                              `"<resource>.<variant>"`.


                              * `resource` is the camelCased domain — e.g.
                              `sequence`,
                                `contact`, `inboxThread`, `blacklistDomainRule`.
                              * `variant` is the camelCased specific failure
                              mode — e.g.
                                `notFound`, `forbidden`, `duplicateName`, `globalRuleReadOnly`.

                              Use `code` for programmatic error handling; use
                              `detail` for

                              user-facing messages. Slugs are stable across
                              server-side enum

                              reorderings and never change meaning under a given
                              resource.
                            pattern: ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)+$
                            example: sequence.notFound
                    title: Business Problem
                    description: >-
                      Domain error response carrying a stable, namespaced error
                      slug.

                      Emitted for most 4xx responses (business 400, 403, 404,
                      409, …) and

                      for 503 when a downstream dependency is unavailable.
                  - example:
                      title: Conflict
                      status: 409
                      detail: A resource with this name already exists.
                      code: sequence.duplicateName
              example:
                title: Conflict
                status: 409
                detail: >-
                  The limit of manually authored learnings for this scope is
                  reached.
                code: aiLearning.limitReached
        '502':
          description: The AI Learnings service is temporarily unavailable.
          content:
            application/problem+json:
              schema:
                allOf:
                  - allOf:
                      - type: object
                        title: Problem Details
                        description: >-
                          Bare RFC 9457 problem-details envelope. Returned by
                          middleware-level errors

                          that don't carry domain context: 401 Unauthorized
                          (auth middleware),

                          429 Too Many Requests (rate-limit middleware), and
                          route-level 404 / 405 /

                          415 (framework middleware).


                          Business and validation responses extend this envelope
                          and add additional

                          fields — see `business-problem.model.yaml` (adds
                          `code` slug) and

                          `validation-problem.model.yaml` (adds `errors[]`
                          array).
                        properties:
                          title:
                            type: string
                            description: Short, human-readable summary of the problem.
                          status:
                            type: integer
                            description: HTTP status code.
                            minimum: 100
                            maximum: 599
                          detail:
                            type: string
                            description: >-
                              Human-readable explanation specific to this
                              occurrence.
                      - type: object
                        properties:
                          code:
                            type: string
                            description: >-
                              Stable, machine-readable error slug in the form

                              `"<resource>.<variant>"`.


                              * `resource` is the camelCased domain — e.g.
                              `sequence`,
                                `contact`, `inboxThread`, `blacklistDomainRule`.
                              * `variant` is the camelCased specific failure
                              mode — e.g.
                                `notFound`, `forbidden`, `duplicateName`, `globalRuleReadOnly`.

                              Use `code` for programmatic error handling; use
                              `detail` for

                              user-facing messages. Slugs are stable across
                              server-side enum

                              reorderings and never change meaning under a given
                              resource.
                            pattern: ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)+$
                            example: sequence.notFound
                    title: Business Problem
                    description: >-
                      Domain error response carrying a stable, namespaced error
                      slug.

                      Emitted for most 4xx responses (business 400, 403, 404,
                      409, …) and

                      for 503 when a downstream dependency is unavailable.
                  - example:
                      title: Bad Request
                      status: 400
                      detail: Pagination parameters are invalid.
                      code: sequence.invalidPagination
              example:
                title: Bad Gateway
                status: 502
                detail: The AI Learnings service is temporarily unavailable
                code: aiLearning.upstreamFailure
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Authenticate every request with a Bearer token. Pass your Reply API key
        in the

        `Authorization` header:


        ```

        Authorization: Bearer <your-api-key>

        ```


        Get your API key from the Reply dashboard: **Settings → API Key**.

````

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