{
  "openapi": "3.0.1",
  "info": {
    "title": "Citation God Mode - NAP Consistency Checker",
    "description": "Checks a local business's name, address and phone against 58 directories (up to 32 per scan, by industry) plus Moz Local, and reports matching, wrong and missing listings as JSON. For every directory, allow a max cost per run of $3 (quick, standard), $4 (deep) or $5 (god-mode).",
    "version": "1.5",
    "x-build-id": "SC3TuYgQonlxuHk22"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alizarin_refrigerator-owner~citation-god-mode/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alizarin_refrigerator-owner-citation-god-mode",
        "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/alizarin_refrigerator-owner~citation-god-mode/runs": {
      "post": {
        "operationId": "runs-sync-alizarin_refrigerator-owner-citation-god-mode",
        "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/alizarin_refrigerator-owner~citation-god-mode/run-sync": {
      "post": {
        "operationId": "run-sync-alizarin_refrigerator-owner-citation-god-mode",
        "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": {
          "businessName": {
            "title": "Business Name",
            "type": "string",
            "description": "The exact business name to check across all directories"
          },
          "streetAddress": {
            "title": "Street Address",
            "type": "string",
            "description": "Street address (e.g., '123 Main St Suite 100')"
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "City name"
          },
          "state": {
            "title": "State",
            "maxLength": 2,
            "type": "string",
            "description": "State abbreviation (e.g., 'FL', 'CA')"
          },
          "zipCode": {
            "title": "ZIP Code",
            "type": "string",
            "description": "5-digit ZIP code"
          },
          "phone": {
            "title": "Phone Number",
            "type": "string",
            "description": "Business phone number in any format"
          },
          "website": {
            "title": "Website URL",
            "type": "string",
            "description": "Business website (optional)"
          },
          "industry": {
            "title": "Business Industry",
            "type": "string",
            "description": "The business's industry or Google Business Profile category (e.g., 'restaurant', 'HVAC contractor', 'law firm', 'dentist'). Industry-specific directories (DoorDash, Avvo, Healthgrades, Angi, Zillow, G2 and others) are checked only for businesses in that industry and are otherwise reported as n/a, not missing. When empty, the industry is read from the business name; if that says nothing, industry-specific directories are skipped."
          },
          "providerNames": {
            "title": "Practitioner Names",
            "type": "array",
            "description": "Optional. The names of the doctors, dentists or other practitioners at this location, for example 'Dr. John Roe'. Healthgrades often lists a practice only under each practitioner's own profile, so these names are searched there too (up to 3), and such a profile counts only when it shows this phone number or street. When empty, a healthcare practice's own website is read for the names.",
            "items": {
              "type": "string"
            }
          },
          "googlePlaceId": {
            "title": "Google Place ID",
            "type": "string",
            "description": "Google Maps Place ID for the business. When provided, GBP is automatically marked as 'correct' since it's the source of truth for NAP data."
          },
          "scanMode": {
            "title": "Scan Mode",
            "enum": [
              "quick",
              "standard",
              "deep",
              "god-mode"
            ],
            "type": "string",
            "description": "Scan depth: quick (the 7 critical directories), standard (the 14 most important), deep (51: every directory except food delivery, employer and software review sites), god-mode (all 62). Directories outside the business's industry are skipped in every mode. Bigger modes start more scraper sub-runs: see the maximum cost per run each mode needs in the description above.",
            "default": "standard"
          },
          "enableMozScan": {
            "title": "Enable Moz Scan",
            "type": "boolean",
            "description": "Run the Moz Local listing check (free; its report covers about a dozen major directories such as Yelp, Facebook, Bing, Apple Maps, BBB and Yellow Pages)",
            "default": true
          },
          "enableDirectScrape": {
            "title": "Enable Direct Scraping",
            "type": "boolean",
            "description": "Directly scrape directory platforms for detailed NAP data",
            "default": true
          },
          "useDedicatedScrapers": {
            "title": "Use Dedicated Scrapers",
            "type": "boolean",
            "description": "Use our dedicated Apify scrapers for the directories that have one (Yelp, BBB, Yellow Pages, Apple Maps, Bing Places, Manta, Trustpilot, Angi, Houzz, HomeAdvisor, Clutch, GoodFirms, Crunchbase and others). They run as separate Actors on your Apify account and are billed at their own prices.",
            "default": true
          },
          "enableFirecrawl": {
            "title": "Enable Firecrawl",
            "type": "boolean",
            "description": "Use Firecrawl to check directories that have no dedicated scraper. Needs a Firecrawl API key.",
            "default": true
          },
          "firecrawlApiKey": {
            "title": "Firecrawl API Key",
            "type": "string",
            "description": "Your Firecrawl API key (firecrawl.dev). Used for Firecrawl extraction and by the Avvo, Glassdoor and DoorDash scrapers; credits come from your Firecrawl account. Without it, Avvo and Glassdoor are reported as not checked."
          },
          "enableCrossValidation": {
            "title": "Enable Cross-Validation",
            "type": "boolean",
            "description": "Cross-reference data from multiple sources to determine canonical NAP",
            "default": true
          },
          "enableAiAnalysis": {
            "title": "Enable AI Analysis",
            "type": "boolean",
            "description": "Use Claude AI to generate recommendations and fix suggestions",
            "default": true
          },
          "anthropicApiKey": {
            "title": "Anthropic API Key",
            "type": "string",
            "description": "Your Anthropic API key for Claude AI analysis (required if AI analysis enabled)"
          },
          "platforms": {
            "title": "Specific Platforms",
            "type": "array",
            "description": "Only check these directories (leave empty to use the scan mode's list). Named directories are checked whatever the industry.",
            "items": {
              "type": "string"
            }
          },
          "providedUrls": {
            "title": "Known Listing URLs",
            "type": "object",
            "description": "Known listing URLs by directory name, e.g. {\"Yelp\": \"https://www.yelp.com/biz/...\", \"BBB\": \"https://www.bbb.org/us/...\"}. Each saved URL is reported, and the directory's scraper opens it directly where the scraper supports that. A directory with a saved URL is checked whatever the industry."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "URL to POST results to when complete"
          },
          "demoMode": {
            "title": "Demo Mode",
            "type": "boolean",
            "description": "Run with sample data to test the actor without real scraping",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}