---
title: "Apply SEO fix"
method: POST
path: "/api/apps/{app_id}/seo/fix"
---

# Apply SEO fix

`POST /api/apps/{app_id}/seo/fix`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/apps/{app_id}/seo/fix`
- Auth: HTTP bearer

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

Applies the fix for one check from an SEO scan and returns what it did.

Get the checks from [Run SEO scan](/api-reference/run-seo-scan) or [Get last SEO scan](/api-reference/get-last-seo-scan). Each check Base44 can act on carries a `fix_action`. Send its `type` as `fix_type` and its `params` as `params`.

The [fix actions](/developers/references/apps-api/sections/seo#fix-actions) fall into three groups. Some change the app's SEO settings, some change the app itself, and the rest change nothing and point you to the app editor screen where you make the fix. An action that changes settings replaces the value it sets, including a value someone edited by hand. The exception is `generate_page_meta` with `overwrite_existing` set to `false` in `params`, as the scan sends it: it keeps page titles and descriptions someone wrote by hand.

No action edits the app's code, creates a checkpoint, or uses the workspace's credits.

A call can succeed and still report `success` as `false` when the action had nothing to apply, such as `generate_json_ld` on an app with no entity Base44 can match to a Schema.org type.

Calling an action again applies it again. Most land on the same result every time, but `generate_description` writes a new description on each call.

A successful call means the change is saved. The live site can take a little while to catch up.

<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 `fix_type` values documented here. Other values are not supported and their behavior can change.</Warning>

## Path parameters

- `app_id` string, required: ID of the app to fix.

## Request body

- object
  - `fix_type` 'enable_llms_txt' | 'enable_ai_crawlers' | 'generate_json_ld' | 'generate_page_meta' | 'generate_website_schema' | 'generate_organization_schema' | 'generate_faq_schema' | 'generate_breadcrumb_schema' | 'generate_canonical' | 'generate_description' | 'suggest_shorter_title' | 'set_app_title' | 'edit_app_description' | 'edit_public_access' | 'open_seo_advanced' | 'set_og_image' | 'connect_domain' | 'edit_slug' | 'enable_https' | 'publish_app' | 'fix_with_ai', required: Action to apply, the `type` of a check's `fix_action` in [Run SEO scan](/api-reference/run-seo-scan) or [Get last SEO scan](/api-reference/get-last-seo-scan). See [Fix actions](/developers/references/apps-api/sections/seo#fix-actions) for what each one does.
  - `params` object: Arguments for the action, the `params` of the same `fix_action`, sent as they are. Defaults to an empty object.

## Response `200`

What the action did.

- SEOFixResponse
  - `result` SEOFixResult, required: What one fix action did.
    - `success` boolean, required: Whether the action was applied. It's `false` when the action had nothing to apply, and `message` says why.
    - `message` string, required: Summary of the outcome, written for the app's owner.
    - `redirect` 'overview' | 'app-settings' | 'seo-meta-tags' | 'domains' | 'publish', nullable: App editor screen where the app's owner makes this fix, either `"overview"`, `"app-settings"`, `"seo-meta-tags"`, `"domains"`, or `"publish"`. The key is present only for the actions that change nothing.

## Other responses

- `400`: `fix_type` isn't an action Base44 knows.
- `401`: Missing or invalid credentials.
- `403`: You don't have access to this app, you used a workspace API key, or you used a read-only personal access token. These endpoints accept a user's credentials only, and this one refuses a read-only credential.
- `404`: App not found.
- `422`: The body is missing or isn't a JSON object, `fix_type` is missing or isn't a string, or `params` isn't an object.
- `429`: Rate limit exceeded. The base limit is 30 requests per minute for each app, counted across the workspace rather than per caller, and shared with the app's other SEO endpoints. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Changes

- **2026-10-11** `80287813ab84`: 1 info
  - the endpoint scheme security `PersonalAccessTokenAuth` was added to the API
- **2026-09-30** `63675fa5257c`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/base44/apis/base44-app-management-api/changes/api/apps/:app_id/seo/fix/post.md)

---

[API](https://skmtc.dev/base44/apis/base44-app-management-api.md) - [All operations](https://skmtc.dev/base44/apis/base44-app-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/base44/apis/base44-app-management-api/revisions/c534f09cf314?raw)
