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

# Replace a project's GEO settings

> Writes the full settings document and re-arms the recurring scan. Engines must be ids from the model catalog this organization can see (the ones `GET /geo/settings` returns) and languages must be supported languages; an unknown value is rejected with a 400 instead of being replaced by a default. Zero data retention is forced off without the ZDR add-on, and engines that are not visible to this caller keep their stored selection. Competitors are managed through the competitors endpoints and are not part of this payload. The language the project's prompts are written in always stays tracked: leaving it out of `languages` adds it back as the first entry, and a full list without it is rejected with a 400.



## OpenAPI

````yaml https://api.usenotra.com/openapi.json patch /v1/projects/{projectId}/geo/settings
openapi: 3.1.1
info:
  title: Notra API
  version: 1.0.0
  description: >-
    OpenAPI schema for Notra content endpoints. Use GET /v1/status for public
    reachability. Error responses include recovery guidance.
servers:
  - url: https://api.usenotra.com
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Webhooks
    description: Manage outbound webhook subscriptions and delivery history.
  - name: Discovery
    description: Public API status and authenticated workspace discovery.
  - name: Content
    description: >-
      Manage posts, brand identities, and GitHub or Linear integrations, and
      queue content generation. Organization is inferred from the API key
      (identity.externalId).
  - name: Schedules
    description: >-
      Manage scheduled content generation. Organization is inferred from the API
      key (identity.externalId).
  - name: Event Triggers
    description: >-
      Manage event-based content generation triggered by GitHub webhooks.
      Organization is inferred from the API key (identity.externalId).
  - name: Chats
    description: >-
      Manage chat sessions. Organization is inferred from the API key
      (identity.externalId).
  - name: Skills
    description: >-
      Manage reusable writing skills. Organization is inferred from the API key
      (identity.externalId).
  - name: Feedback
    description: >-
      Collect and triage feedback submitted by AI agents. Agents post to the
      organization's feedback URL without credentials; reading and triage
      require an API key with feedback.read or feedback.write.
  - name: GEO
    description: >-
      Manage generative engine optimization: projects, tracking settings,
      prompts, prompt sequences, competitors, scans, visibility reads, content
      gaps and briefs, agent readiness and AI traffic. Project-scoped endpoints
      require the GEO plan entitlement in addition to their scope;
      organization-level ingest endpoints require only the traffic scope.
paths:
  /v1/projects/{projectId}/geo/settings:
    patch:
      tags:
        - GEO
      summary: Replace a project's GEO settings
      description: >-
        Writes the full settings document and re-arms the recurring scan.
        Engines must be ids from the model catalog this organization can see
        (the ones `GET /geo/settings` returns) and languages must be supported
        languages; an unknown value is rejected with a 400 instead of being
        replaced by a default. Zero data retention is forced off without the ZDR
        add-on, and engines that are not visible to this caller keep their
        stored selection. Competitors are managed through the competitors
        endpoints and are not part of this payload. The language the project's
        prompts are written in always stays tracked: leaving it out of
        `languages` adds it back as the first entry, and a full list without it
        is rejected with a 400.
      operationId: updateGeoSettings
      parameters:
        - schema:
            type: string
            minLength: 1
            pattern: ^[A-Za-z0-9_-]{1,100}$
            example: b1f2c3d4-0000-4000-8000-000000000000
          required: true
          name: projectId
          in: path
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchGeoSettingsRequest'
      responses:
        '200':
          description: Settings updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeoSettingsResponse'
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: GEO plan or available AI credits required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Organization, project or resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Authentication or billing service unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    PatchGeoSettingsRequest:
      type: object
      properties:
        companyName:
          type: string
          minLength: 1
          maxLength: 128
        aliases:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 128
          maxItems: 10
        conversionPaths:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 200
          maxItems: 20
          description: >-
            Paths that count as a conversion when an AI referral reaches them.
            Prefix match. Omit to keep the stored list.
        domains:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 128
          maxItems: 20
          description: >-
            Additional hostnames that send AI traffic to this project, besides
            the brand website. Subdomains of a listed domain are included. Omit
            to keep the stored list.
        languages:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 128
          minItems: 1
          maxItems: 4
        engines:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 128
          minItems: 1
          maxItems: 64
        enforceZdr:
          type: boolean
        nonZdrApprovedEngines:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 128
          maxItems: 64
        trackWithoutSearch:
          type: boolean
          description: >-
            Also scan search-capable models without web search. Omit to keep the
            stored value (default false).
        pausedAutoPromptIds:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 128
          maxItems: 8
          description: >-
            Ids of auto-generated prompts to skip in scans. Omit to keep the
            current list.
        removedAutoPromptIds:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 128
          maxItems: 8
          description: >-
            Ids of auto-generated prompts removed from tracking. Omit to keep
            the current list.
        enabled:
          type: boolean
        scanIntervalHours:
          type: integer
          minimum: 24
          maximum: 2160
          description: >-
            Hours between automatic scans, 24-2160, in whole days (multiple of
            24). Presets: 24, 48, 72, 168, 336, 720.
      required:
        - companyName
        - aliases
        - languages
        - engines
        - enforceZdr
        - nonZdrApprovedEngines
        - enabled
        - scanIntervalHours
    GeoSettingsResponse:
      type: object
      properties:
        configured:
          type: boolean
          description: Whether the analytics backend is configured.
        settings:
          $ref: '#/components/schemas/GeoSettings'
        organization:
          type: object
          properties:
            id:
              type: string
            slug:
              type: string
            name:
              type: string
            logo:
              type:
                - string
                - 'null'
          required:
            - id
            - slug
            - name
            - logo
      required:
        - configured
        - settings
        - organization
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
        code:
          type: string
        recovery:
          type: string
      required:
        - error
    GeoSettings:
      type:
        - object
        - 'null'
      properties:
        id:
          type: string
        organizationId:
          type: string
        projectId:
          type: string
        companyName:
          type: string
        aliases:
          type: array
          items:
            type: string
        conversionPaths:
          type: array
          items:
            type: string
        domains:
          type: array
          items:
            type: string
        competitors:
          type: array
          items:
            type: string
        languages:
          type: array
          items:
            type: string
        engines:
          type: array
          items:
            type: string
        enforceZdr:
          type: boolean
        nonZdrApprovedEngines:
          type: array
          items:
            type: string
        trackWithoutSearch:
          type: boolean
        pausedAutoPromptIds:
          type: array
          items:
            type: string
        removedAutoPromptIds:
          type: array
          items:
            type: string
        enabled:
          type: boolean
        scanIntervalHours:
          type: integer
        scanStartedAt:
          type:
            - string
            - 'null'
        lastScanAt:
          type:
            - string
            - 'null'
        isScanning:
          type: boolean
        createdAt:
          type: string
        updatedAt:
          type: string
      required:
        - id
        - organizationId
        - projectId
        - companyName
        - aliases
        - conversionPaths
        - domains
        - competitors
        - languages
        - engines
        - enforceZdr
        - nonZdrApprovedEngines
        - trackWithoutSearch
        - pausedAutoPromptIds
        - removedAutoPromptIds
        - enabled
        - scanIntervalHours
        - scanStartedAt
        - lastScanAt
        - isScanning
        - createdAt
        - updatedAt
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: Send your API key in the Authorization header as Bearer API_KEY.

````

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