{
  "openapi": "3.0.1",
  "info": {
    "title": "Reverse Image Search Monitor: Discover, Verify & Track Matches",
    "description": "Automatically discovers every site hosting your image via reverse image search, then verifies each candidate with CLIP similarity and perceptual hashing for duplicate and near-duplicate verdicts, not just one score. Monitor mode flags only new copies on repeat scans. From $0.0025 per candidate.",
    "version": "0.1",
    "x-build-id": "j5VT8FyvsZUMGEX5Z"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~reverse-image-search-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-reverse-image-search-monitor",
        "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/getascraper~reverse-image-search-monitor/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-reverse-image-search-monitor",
        "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/getascraper~reverse-image-search-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-reverse-image-search-monitor",
        "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",
        "required": [
          "sourceImage"
        ],
        "properties": {
          "sourceImage": {
            "title": "Source Image",
            "type": "string",
            "description": "The image you want to search for, as a direct http(s) image URL or a base64 data URI. A data URI is temporarily re-hosted by this Actor so the reverse-image-search step has a real URL to fetch, and is not kept after the run."
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "discover",
              "compareTargets",
              "both"
            ],
            "type": "string",
            "description": "Discover finds candidate images across the open web from just the source image, a capability no named competitor (image-comparator, image-similarity-api, image-diff) offers at all. Compare targets scores an explicit list you already have, matching image-similarity-api's own input shape. Both runs discovery and your target list together.",
            "default": "discover"
          },
          "targetImages": {
            "title": "Target Images",
            "maxItems": 20,
            "type": "array",
            "description": "Explicit candidate image URLs to score against the source image. Only used when Mode is \"Compare against my target images\" or \"Both\". Capped at 20 per run; split a larger list across multiple runs.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "comparisonMode": {
            "title": "Comparison Signals",
            "enum": [
              "embedding",
              "phash",
              "both"
            ],
            "type": "string",
            "description": "Embedding uses a CLIP visual-similarity score (0 to 1). Perceptual hash uses pHash and dHash bit-distance, a second independent signal. Both runs the same dual-signal verification as image-similarity-api, stronger than image-comparator's single score and image-diff's plain pixel diff.",
            "default": "both"
          },
          "similarityThreshold": {
            "title": "Similarity Threshold",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Minimum CLIP cosine similarity (0 to 1) for a candidate to count as a duplicate. Lower this to catch looser visual matches, raise it to only flag near-exact copies.",
            "default": 0.85
          },
          "phashThreshold": {
            "title": "Perceptual Hash Threshold",
            "minimum": 0,
            "maximum": 64,
            "type": "integer",
            "description": "Maximum Hamming distance out of 64 bits between the source and candidate perceptual hashes for a duplicate verdict. Lower is stricter; 0 means the hashes must match exactly.",
            "default": 8
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Datacenter proxy is the default and is normally enough for the reverse-image-search step. Switch to a residential group only if runs start failing, since reliability at high query volume against the search engine has not been stress-tested.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxCandidates": {
            "title": "Max Candidates",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of candidate images to discover, download and score in one run. Each candidate costs one image fetch plus one local similarity computation, so this is the main driver of run time and cost. Kept low by default so a default run finishes in a few minutes.",
            "default": 12
          },
          "incrementalMonitorMode": {
            "title": "Incremental Monitor Mode",
            "type": "boolean",
            "description": "When on, this run compares its candidates against the last run that used the same Monitor State Name and only reports genuinely new hosting sites since then, real image-appearance monitoring the way paid reverse-image-search alert tools do. Off by default so a first run always reports the full picture.",
            "default": false
          },
          "monitorStateName": {
            "title": "Monitor State Name",
            "type": "string",
            "description": "Name for the saved monitor state when Incremental Monitor Mode is on. Use a different name per source image you track on its own schedule, otherwise their histories mix together.",
            "default": "default"
          },
          "customId": {
            "title": "Custom ID",
            "type": "string",
            "description": "Optional identifier echoed back on every output row, useful for joining results to your own database when running this Actor for many source images.",
            "default": ""
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}