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

# Update SEO settings

> <Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Saves SEO settings for the app and returns the settings as they now stand.

This is a partial update even though it is a `PUT`. Keys you leave out of `settings` keep their saved values, and `pages` merges twice over: a page you don't mention keeps its overrides, and a field you don't send on a page you do mention keeps its saved value. Sending one page's `title` therefore leaves that page's `description` and every other page untouched.

<Note>You can't remove a page or a page override here. Sending `pages: {}` changes nothing, and a `null` page entry is rejected with a 422. To stop a page overriding a tag, send an empty string as that field's value.</Note>

Saving is immediate, and the copy the live site serves is refreshed right after on a best-effort basis. A 200 means the settings are stored, so re-read them with [Get SEO settings](/api-reference/get-seo-settings) rather than treating the published pages as confirmation.

This endpoint is limited to 30 requests per minute per app, and that budget is shared with the app's other SEO endpoints.

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time. Send only the fields documented here. Other request fields are not supported and their behavior can change.</Warning>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json put /api/apps/{app_id}/seo/settings
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - ApiKeyAuth: []
paths:
  /api/apps/{app_id}/seo/settings:
    put:
      summary: Update SEO settings
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Saves SEO settings for the app and returns the settings as they now
        stand.


        This is a partial update even though it is a `PUT`. Keys you leave out
        of `settings` keep their saved values, and `pages` merges twice over: a
        page you don't mention keeps its overrides, and a field you don't send
        on a page you do mention keeps its saved value. Sending one page's
        `title` therefore leaves that page's `description` and every other page
        untouched.


        <Note>You can't remove a page or a page override here. Sending `pages:
        {}` changes nothing, and a `null` page entry is rejected with a 422. To
        stop a page overriding a tag, send an empty string as that field's
        value.</Note>


        Saving is immediate, and the copy the live site serves is refreshed
        right after on a best-effort basis. A 200 means the settings are stored,
        so re-read them with [Get SEO settings](/api-reference/get-seo-settings)
        rather than treating the published pages as confirmation.


        This endpoint is limited to 30 requests per minute per app, and that
        budget is shared with the app's other SEO endpoints.


        <Warning>The response includes fields beyond the ones documented here.
        Don't rely on undocumented response fields, as they can change at any
        time. Send only the fields documented here. Other request fields are not
        supported and their behavior can change.</Warning>
      operationId: update_seo_settings_api_apps__app_id__seo_settings_put
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app whose SEO settings you want.
            title: App Id
          description: ID of the app whose SEO settings you want.
          example: 6820f3a4e7b91d003c45a1f2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              title: UpdateSEOSettings
              type: object
              required:
                - settings
              properties:
                settings:
                  description: The settings to save. Send only the keys you want to change.
                  properties:
                    seo_disabled:
                      description: >-
                        Whether you run your own SEO. When `true`, Base44 stops
                        injecting titles, descriptions, Open Graph and Twitter
                        tags, canonical URLs, JSON-LD and prerender snapshots,
                        and serves your own `public/robots.txt` when you ship
                        one. Defaults to `false` while the key is absent. This
                        does not add a `noindex` tag, and a login-gated or
                        private app stays unindexed whatever you set here.
                      example: false
                      title: Seo Disabled
                      type: boolean
                    platform_meta_injection_enabled:
                      description: >-
                        Whether Base44 injects the title, description, Open
                        Graph and Twitter tag block. Set it to `false` when your
                        deployed `index.html` already carries a complete set.
                        Narrower than `seo_disabled`, which also turns off
                        canonical URLs, JSON-LD and snapshots. Defaults to
                        `true` while the key is absent.
                      example: true
                      title: Platform Meta Injection Enabled
                      type: boolean
                    platform_jsonld_injection_enabled:
                      description: >-
                        Whether Base44 injects its own WebSite, Organization,
                        BreadcrumbList and FAQPage JSON-LD. Set it to `false`
                        when your app ships its own structured data. Defaults to
                        `true` while the key is absent.
                      example: true
                      title: Platform Jsonld Injection Enabled
                      type: boolean
                    robots_txt_enabled:
                      description: >-
                        Whether Base44 generates `/robots.txt`. When `false`,
                        your deployed `public/robots.txt` is served instead, and
                        the path returns 404 when you ship none. Defaults to
                        `true` while the key is absent.
                      example: true
                      title: Robots Txt Enabled
                      type: boolean
                    sitemap_xml_enabled:
                      description: >-
                        Whether Base44 generates `/sitemap.xml`. When `false`,
                        your deployed `public/sitemap.xml` is served instead,
                        and the path returns 404 when you ship none. Defaults to
                        `true` while the key is absent.
                      example: true
                      title: Sitemap Xml Enabled
                      type: boolean
                    llms_txt_enabled:
                      description: >-
                        Whether Base44 serves a generated `/llms.txt` describing
                        the app to AI crawlers. Defaults to `false` while the
                        key is absent.
                      example: false
                      title: Llms Txt Enabled
                      type: boolean
                    ai_crawlers_enabled:
                      description: >-
                        Whether known AI crawlers are allowed in the generated
                        `robots.txt`. Defaults to `true` while the key is
                        absent.
                      example: true
                      title: Ai Crawlers Enabled
                      type: boolean
                    synthesized_breadcrumb_enabled:
                      description: >-
                        Whether Base44 builds a BreadcrumbList for each request
                        path at render time. Set it to `false` to serve the
                        saved `breadcrumb_schema` instead, which is what keeps a
                        hand-written breadcrumb intact. Defaults to `true` while
                        the key is absent.
                      example: true
                      title: Synthesized Breadcrumb Enabled
                      type: boolean
                    canonical_url:
                      anyOf:
                        - type: string
                        - type: 'null'
                      title: Canonical Url
                      description: >-
                        Base URL Base44 builds canonical tags from. The app's
                        own published URL is used while the key is absent.
                      example: https://acme.com
                    content_query_params:
                      items:
                        type: string
                      type: array
                      maxItems: 25
                      title: Content Query Params
                      description: >-
                        Query-string parameter names whose values serve distinct
                        content, such as `article` for `/guides?article=slug`.
                        Naming one opts its URL variants into prerender warming,
                        which otherwise only covers paths. Send at most 25
                        names, counted before the list is cleaned up, and match
                        each name's casing exactly. Names are trimmed, and blank
                        or repeated entries are dropped, so the list you read
                        back can be shorter than the one you sent. Defaults to
                        an empty list, meaning no query variants are warmed.
                      example:
                        - article
                    custom_json_ld:
                      anyOf:
                        - items:
                            additionalProperties: true
                            type: object
                          type: array
                        - type: 'null'
                      title: Custom Json Ld
                      description: >-
                        Extra JSON-LD objects Base44 injects alongside its own.
                        Every entry must be a JSON object. The key is absent
                        while you have added none.
                      example:
                        - '@context': https://schema.org
                          '@type': Product
                          name: Acme CRM
                    website_schema:
                      anyOf:
                        - additionalProperties: true
                          type: object
                        - type: 'null'
                      title: Website Schema
                      description: >-
                        Saved WebSite JSON-LD object. The key is absent while
                        none is saved.
                      example:
                        '@context': https://schema.org
                        '@type': WebSite
                        name: Acme CRM
                        url: https://acme.com
                    organization_schema:
                      anyOf:
                        - additionalProperties: true
                          type: object
                        - type: 'null'
                      title: Organization Schema
                      description: >-
                        Saved Organization JSON-LD object. The key is absent
                        while none is saved.
                      example:
                        '@context': https://schema.org
                        '@type': Organization
                        name: Acme
                        url: https://acme.com
                    breadcrumb_schema:
                      anyOf:
                        - additionalProperties: true
                          type: object
                        - type: 'null'
                      title: Breadcrumb Schema
                      description: >-
                        Saved BreadcrumbList JSON-LD object. It is served only
                        while `synthesized_breadcrumb_enabled` is `false`. The
                        key is absent while none is saved.
                      example:
                        '@context': https://schema.org
                        '@type': BreadcrumbList
                        itemListElement: []
                    faq_schema:
                      anyOf:
                        - additionalProperties: true
                          type: object
                        - type: 'null'
                      title: Faq Schema
                      description: >-
                        Saved FAQPage JSON-LD object. The key is absent while
                        none is saved.
                      example:
                        '@context': https://schema.org
                        '@type': FAQPage
                        mainEntity: []
                    pages:
                      additionalProperties:
                        properties:
                          title:
                            anyOf:
                              - type: string
                              - type: 'null'
                            title: Title
                            description: >-
                              Title tag for this page. The key is absent while
                              the page overrides no title.
                            example: Acme CRM
                          description:
                            anyOf:
                              - type: string
                              - type: 'null'
                            title: Description
                            description: >-
                              Meta description for this page. The key is absent
                              while the page overrides no description.
                            example: Track leads and deals in one place.
                          og_image:
                            anyOf:
                              - type: string
                                maxLength: 2048
                              - type: 'null'
                            title: Og Image
                            description: >-
                              Image URL for the `og:image` and `twitter:image`
                              tags on this page. It must be an `https://` URL
                              with a host and no backslashes, and it cannot
                              exceed 2048 characters. Send an empty string to
                              stop overriding the image.
                            example: https://cdn.example.com/acme-og.png
                        type: object
                        title: SEOPageSettings
                        description: The meta tags one page overrides.
                      description: >-
                        Per-page tag overrides, keyed by the page's component
                        name as it appears in the app's code. The key is absent
                        while no page overrides anything.
                      example:
                        Home:
                          description: Track leads and deals in one place.
                          og_image: https://cdn.example.com/acme-og.png
                          title: Acme CRM
                      title: Pages
                      type: object
                  title: SEOSettingsUpdate
                  type: object
            example:
              settings:
                pages:
                  Home:
                    title: Acme CRM
                    description: Track leads and deals in one place.
                    og_image: https://cdn.example.com/acme-og.png
                sitemap_xml_enabled: true
      responses:
        '200':
          description: The settings as they stand after the merge.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SEOSettingsResponse'
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have access to this app, or you used a workspace API key.
            These endpoints accept a user's credentials only.
        '404':
          description: App not found.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    SEOSettingsResponse:
      properties:
        result:
          $ref: '#/components/schemas/SEOSettingsResource'
          description: >-
            The saved settings. This is an empty object for an app whose SEO
            settings have never been changed.
      type: object
      required:
        - result
      title: SEOSettingsResponse
      description: >-
        An app's SEO settings, wrapped in the field the endpoint returns them
        under.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    SEOSettingsResource:
      properties:
        seo_disabled:
          type: boolean
          title: Seo Disabled
          description: >-
            Whether you run your own SEO. When `true`, Base44 stops injecting
            titles, descriptions, Open Graph and Twitter tags, canonical URLs,
            JSON-LD and prerender snapshots, and serves your own
            `public/robots.txt` when you ship one. Defaults to `false` while the
            key is absent. This does not add a `noindex` tag, and a login-gated
            or private app stays unindexed whatever you set here.
          default: false
          example: false
        platform_meta_injection_enabled:
          type: boolean
          title: Platform Meta Injection Enabled
          description: >-
            Whether Base44 injects the title, description, Open Graph and
            Twitter tag block. Set it to `false` when your deployed `index.html`
            already carries a complete set. Narrower than `seo_disabled`, which
            also turns off canonical URLs, JSON-LD and snapshots. Defaults to
            `true` while the key is absent.
          default: true
          example: true
        platform_jsonld_injection_enabled:
          type: boolean
          title: Platform Jsonld Injection Enabled
          description: >-
            Whether Base44 injects its own WebSite, Organization, BreadcrumbList
            and FAQPage JSON-LD. Set it to `false` when your app ships its own
            structured data. Defaults to `true` while the key is absent.
          default: true
          example: true
        robots_txt_enabled:
          type: boolean
          title: Robots Txt Enabled
          description: >-
            Whether Base44 generates `/robots.txt`. When `false`, your deployed
            `public/robots.txt` is served instead, and the path returns 404 when
            you ship none. Defaults to `true` while the key is absent.
          default: true
          example: true
        sitemap_xml_enabled:
          type: boolean
          title: Sitemap Xml Enabled
          description: >-
            Whether Base44 generates `/sitemap.xml`. When `false`, your deployed
            `public/sitemap.xml` is served instead, and the path returns 404
            when you ship none. Defaults to `true` while the key is absent.
          default: true
          example: true
        llms_txt_enabled:
          type: boolean
          title: Llms Txt Enabled
          description: >-
            Whether Base44 serves a generated `/llms.txt` describing the app to
            AI crawlers. Defaults to `false` while the key is absent.
          default: false
          example: false
        ai_crawlers_enabled:
          type: boolean
          title: Ai Crawlers Enabled
          description: >-
            Whether known AI crawlers are allowed in the generated `robots.txt`.
            Defaults to `true` while the key is absent.
          default: true
          example: true
        synthesized_breadcrumb_enabled:
          type: boolean
          title: Synthesized Breadcrumb Enabled
          description: >-
            Whether Base44 builds a BreadcrumbList for each request path at
            render time. Set it to `false` to serve the saved
            `breadcrumb_schema` instead, which is what keeps a hand-written
            breadcrumb intact. Defaults to `true` while the key is absent.
          default: true
          example: true
        canonical_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Canonical Url
          description: >-
            Base URL Base44 builds canonical tags from. The app's own published
            URL is used while the key is absent.
          example: https://acme.com
        content_query_params:
          items:
            type: string
          type: array
          maxItems: 25
          title: Content Query Params
          description: >-
            Query-string parameter names whose values serve distinct content,
            such as `article` for `/guides?article=slug`. Naming one opts its
            URL variants into prerender warming, which otherwise only covers
            paths. Send at most 25 names, counted before the list is cleaned up,
            and match each name's casing exactly. Names are trimmed, and blank
            or repeated entries are dropped, so the list you read back can be
            shorter than the one you sent. Defaults to an empty list, meaning no
            query variants are warmed.
          example:
            - article
        custom_json_ld:
          anyOf:
            - items:
                additionalProperties: true
                type: object
              type: array
            - type: 'null'
          title: Custom Json Ld
          description: >-
            Extra JSON-LD objects Base44 injects alongside its own. Every entry
            must be a JSON object. The key is absent while you have added none.
          example:
            - '@context': https://schema.org
              '@type': Product
              name: Acme CRM
        website_schema:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Website Schema
          description: Saved WebSite JSON-LD object. The key is absent while none is saved.
          example:
            '@context': https://schema.org
            '@type': WebSite
            name: Acme CRM
            url: https://acme.com
        organization_schema:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Organization Schema
          description: >-
            Saved Organization JSON-LD object. The key is absent while none is
            saved.
          example:
            '@context': https://schema.org
            '@type': Organization
            name: Acme
            url: https://acme.com
        breadcrumb_schema:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Breadcrumb Schema
          description: >-
            Saved BreadcrumbList JSON-LD object. It is served only while
            `synthesized_breadcrumb_enabled` is `false`. The key is absent while
            none is saved.
          example:
            '@context': https://schema.org
            '@type': BreadcrumbList
            itemListElement: []
        faq_schema:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Faq Schema
          description: Saved FAQPage JSON-LD object. The key is absent while none is saved.
          example:
            '@context': https://schema.org
            '@type': FAQPage
            mainEntity: []
        pages:
          additionalProperties:
            $ref: '#/components/schemas/SEOPageSettings'
          type: object
          title: Pages
          description: >-
            Per-page tag overrides, keyed by the page's component name as it
            appears in the app's code. The key is absent while no page overrides
            anything.
          example:
            Home:
              description: Track leads and deals in one place.
              og_image: https://cdn.example.com/acme-og.png
              title: Acme CRM
      type: object
      title: SEOSettingsResource
      description: An app's saved SEO settings.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    SEOPageSettings:
      properties:
        title:
          anyOf:
            - type: string
            - type: 'null'
          title: Title
          description: >-
            Title tag for this page. The key is absent while the page overrides
            no title.
          example: Acme CRM
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: >-
            Meta description for this page. The key is absent while the page
            overrides no description.
          example: Track leads and deals in one place.
        og_image:
          anyOf:
            - type: string
              maxLength: 2048
            - type: 'null'
          title: Og Image
          description: >-
            Image URL for the `og:image` and `twitter:image` tags on this page.
            It must be an `https://` URL with a host and no backslashes, and it
            cannot exceed 2048 characters. Send an empty string to stop
            overriding the image.
          example: https://cdn.example.com/acme-og.png
      type: object
      title: SEOPageSettings
      description: The meta tags one page overrides.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````