> ## 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.

# Create 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 a new standing rule for how the AI writes. text is required and
limited to 1000 characters, and categories says where the rule applies — personalizedMessage for
outbound drafting, replyHandling for answering incoming mail, or both. scope decides who the rule
binds: user for yourself across all your sequences, sequence for named sequences only,
workspace for everyone in your team, or organization for every workspace in the org.
sequenceIds names the sequences — at most 50 and no repeats, each one you can see — and is
required for the sequence scope and rejected for every other one. Creating a workspace or
organization learning needs the matching permission, and an organization learning needs you to
belong to one — without either the call is refused and nothing is written. A learning created
here is always enabled and counts as manually authored, so it can be refused with a conflict when
those categories and scope already hold as many manually authored learnings as they may; the
message says which budget is full. The created learning is returned in full with its assigned
id — unless the service cannot be reached to read it straight back, in which case the response
carries the assigned id and the fields you sent rather than the stored learning. Contradictions
with your other learnings are looked for after the learning is stored, so conflictState comes
back as none here — read the learning again a moment later to see its conflict standing.
The AI Learnings feature must be enabled for your team.



## OpenAPI

````yaml /api-reference/bundled.yaml post /v3/ai-sdr/learnings
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:
    post:
      tags:
        - AI SDR Learnings
      summary: Create 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 a new standing rule for how the AI
        writes. text is required and

        limited to 1000 characters, and categories says where the rule applies —
        personalizedMessage for

        outbound drafting, replyHandling for answering incoming mail, or both.
        scope decides who the rule

        binds: user for yourself across all your sequences, sequence for named
        sequences only,

        workspace for everyone in your team, or organization for every workspace
        in the org.

        sequenceIds names the sequences — at most 50 and no repeats, each one
        you can see — and is

        required for the sequence scope and rejected for every other one.
        Creating a workspace or

        organization learning needs the matching permission, and an organization
        learning needs you to

        belong to one — without either the call is refused and nothing is
        written. A learning created

        here is always enabled and counts as manually authored, so it can be
        refused with a conflict when

        those categories and scope already hold as many manually authored
        learnings as they may; the

        message says which budget is full. The created learning is returned in
        full with its assigned

        id — unless the service cannot be reached to read it straight back, in
        which case the response

        carries the assigned id and the fields you sent rather than the stored
        learning. Contradictions

        with your other learnings are looked for after the learning is stored,
        so conflictState comes

        back as none here — read the learning again a moment later to see its
        conflict standing.

        The AI Learnings feature must be enabled for your team.
      operationId: CreateAiLearning
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              title: AiLearningCreationRequest
              description: >-
                Request body for creating an AI learning. A learning created
                through the API is always enabled

                and counts as manually authored.
              properties:
                text:
                  type: string
                  minLength: 1
                  maxLength: 1000
                  description: The standing rule the AI should follow
                categories:
                  type: array
                  minItems: 1
                  uniqueItems: true
                  description: >-
                    Where the rule applies. Send one or both values, without
                    repeats.
                  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. `workspace` and `organization` need
                    the matching permission, and

                    `organization` also needs you to belong to an organization.
                  type: string
                  title: AI Learning Scope
                  enum:
                    - organization
                    - workspace
                    - user
                    - sequence
                sequenceIds:
                  type: array
                  maxItems: 50
                  uniqueItems: true
                  description: >-
                    Sequences the learning is limited to, each one a sequence
                    you can see. Required when `scope`

                    is `sequence` and rejected for every other scope.
                  items:
                    type: integer
                    minimum: 1
              required:
                - text
                - categories
                - scope
              example:
                text: Keep subject lines under six words.
                categories:
                  - personalizedMessage
                scope: sequence
                sequenceIds:
                  - 42
                  - 57
      responses:
        '201':
          description: The learning was created
          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 failed validation, 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:
                text_too_long:
                  summary: text is longer than 1000 characters
                  value:
                    title: Validation failed
                    status: 400
                    detail: The request body contains validation errors.
                    errors:
                      - pointer: /text
                        detail: text must not exceed 1000 characters.
                sequence_ids_required:
                  summary: scope is sequence but sequenceIds is missing
                  value:
                    title: Validation failed
                    status: 400
                    detail: The request body contains validation errors.
                    errors:
                      - pointer: /sequenceIds
                        detail: sequenceIds is required when scope is 'sequence'.
                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, or you may
            not create a learning with the requested scope.
          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 not found
                code: aiLearning.notFound
        '409':
          description: >-
            Those categories and scope already hold as many manually authored
            learnings as they may. 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.