{
  "openapi": "3.0.1",
  "info": {
    "title": "AI Alt Text Generator - Image Alt Text & Image Captions",
    "description": "Find images missing alt text on pages, a sitemap or a whole site and write AI alt text in any language. Optional SEO title, caption and file name. WCAG accessibility, image SEO. $6/1,000.",
    "version": "0.1",
    "x-build-id": "8fyVa4ELcbxc76cFo"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tidytools~ai-alt-text-generator/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tidytools-ai-alt-text-generator",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/tidytools~ai-alt-text-generator/runs": {
      "post": {
        "operationId": "runs-sync-tidytools-ai-alt-text-generator",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/tidytools~ai-alt-text-generator/run-sync": {
      "post": {
        "operationId": "run-sync-tidytools-ai-alt-text-generator",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "urlsText": {
            "title": "Page URLs or domains",
            "type": "string",
            "description": "Main input (fill this, or `pageUrls` / `imageUrls` / `datasetId`). Web pages to check, one per line (bare domains such as apple.com work too). Images on each page are found automatically. With \"Scan the whole site\", these are the starting points. A line that is not a URL becomes one free error row; the rest of the run continues."
          },
          "pageUrls": {
            "title": "Page URLs (request list, optional)",
            "type": "array",
            "description": "Same as \"Page URLs or domains\", in Apify's request list format (also accepts a link to a text file with URLs). Kept for existing integrations; new integrations should use \"urlsText\".",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "imageUrls": {
            "title": "Image URLs (optional)",
            "type": "array",
            "description": "Direct links to images (JPEG, PNG, WebP, GIF) to describe.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "crawlSite": {
            "title": "Scan the whole site",
            "type": "boolean",
            "description": "Also check other pages of the same site: pages from its sitemap, or (without a sitemap) pages linked from the start pages, up to \"Max pages\". An image used on many pages is described once.",
            "default": false
          },
          "sitemapUrl": {
            "title": "Sitemap URL (optional)",
            "type": "string",
            "description": "Check the pages listed in this sitemap, e.g. https://example.com/sitemap.xml (sitemap indexes are followed), up to \"Max pages\"."
          },
          "maxPages": {
            "title": "Max pages",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Limit for pages found through the sitemap or site scan (pages you list are always checked).",
            "default": 50
          },
          "context": {
            "title": "Site context (optional)",
            "type": "string",
            "description": "What the site is about, e.g. \"handmade silver jewellery store\" or \"hiking travel blog\". Together with the page title and the image file name, it helps the AI choose precise words; it never describes things that are not visible."
          },
          "onlyMissingAlt": {
            "title": "Only images without alt text",
            "type": "boolean",
            "description": "Skip images on pages that already have alt text. Turn off to get suggestions for every image, plus a quality check of the existing alt text (altQuality, altIssues).",
            "default": true
          },
          "emptyAltIsDecorative": {
            "title": "Treat alt=\"\" as decorative",
            "type": "boolean",
            "description": "In WCAG, an empty alt attribute (alt=\"\") marks a decorative image that screen readers skip. Turn on to skip those images (free) and only describe images with no alt attribute at all. Off (default): alt=\"\" is treated like a missing alt, since many shops leave it empty by mistake. Every row shows altStatus: missing, empty or present.",
            "default": false
          },
          "language": {
            "title": "Alt text language",
            "type": "string",
            "description": "Language of the alt text, e.g. English, German, Spanish, Traditional Chinese.",
            "default": "English"
          },
          "maxCharacters": {
            "title": "Max characters",
            "minimum": 40,
            "maximum": 250,
            "type": "integer",
            "description": "Maximum length of each alt text. 125 is a common recommendation for screen readers.",
            "default": 125
          },
          "fields": {
            "title": "Extra SEO fields (optional)",
            "type": "array",
            "description": "Also write an image title, a caption, an SEO file name (e.g. red-leather-wallet.jpg) and/or keywords, returned with the alt text from the same AI call. Images with extra fields are charged as \"described image with SEO fields\" ($0.008) instead of the plain alt text ($0.006).",
            "items": {
              "type": "string",
              "enum": [
                "title",
                "caption",
                "filename",
                "keywords"
              ],
              "enumTitles": [
                "Title",
                "Caption",
                "SEO file name",
                "Keywords"
              ]
            }
          },
          "maxImagesPerPage": {
            "title": "Max images per page",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "Limit how many images are described per page (default 20).",
            "default": 20
          },
          "maxImages": {
            "title": "Max images in total",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Cap for the whole run, across all pages (a whole-site scan can find thousands of images). Images over the cap are not described and not charged; the log and SUMMARY say how many were left out.",
            "default": 1000
          },
          "reportSkipped": {
            "title": "Report skipped images",
            "type": "boolean",
            "description": "Also list images that were skipped (already have alt text, tiny icons, SVG, decorative) and why. Existing alt texts get a free quality check.",
            "default": false
          },
          "datasetId": {
            "title": "Dataset ID (optional)",
            "type": "string",
            "description": "Take page or image URLs from another Actor run's dataset (links ending in .jpg, .png, .webp... are treated as images)."
          },
          "datasetField": {
            "title": "Dataset field",
            "type": "string",
            "description": "Field with the URLs, e.g. \"url\" or \"imageUrl\". Empty = the first URL field found."
          },
          "maxConcurrency": {
            "title": "Parallel images",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many images are described at the same time.",
            "default": 5
          },
          "httpVia": {
            "title": "Plain HTTP requests from",
            "enum": [
              "auto",
              "backend",
              "direct",
              "vm"
            ],
            "type": "string",
            "description": "Some sites block requests from data centers. Auto retries from a second network before falling back to a real browser. If both are refused, Auto also tries our second server (Oracle, different IP) before a real browser.",
            "default": "auto"
          },
          "proxyConfiguration": {
            "title": "Proxy (optional)",
            "type": "object",
            "description": "Only used for requests sent from Apify's network (pages and image downloads). Apify proxy usage is billed to your Apify account."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}