{
  "openapi": "3.0.1",
  "info": {
    "title": "Image Metadata & EXIF Extractor: GPS, Camera, Colors, Hash",
    "description": "Read image metadata in bulk: EXIF camera and lens, exposure settings, date taken, GPS location with map link, size, color profile, dominant colors and perceptual hashes to find near-duplicates. Image URLs or a dataset column in. Failed images are free.",
    "version": "0.0",
    "x-build-id": "YOedrSxrpa7qFPFQN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/charlesmarkette~image-metadata-exif-extractor-gps-camera/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-charlesmarkette-image-metadata-exif-extractor-gps-camera",
        "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/charlesmarkette~image-metadata-exif-extractor-gps-camera/runs": {
      "post": {
        "operationId": "runs-sync-charlesmarkette-image-metadata-exif-extractor-gps-camera",
        "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/charlesmarkette~image-metadata-exif-extractor-gps-camera/run-sync": {
      "post": {
        "operationId": "run-sync-charlesmarkette-image-metadata-exif-extractor-gps-camera",
        "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": {
          "imageUrls": {
            "title": "Image URLs",
            "type": "array",
            "description": "One per line. Direct links to JPEG, PNG, WebP, GIF, AVIF, TIFF or BMP images (HEIC isn't supported). Google Drive and Dropbox share links to a single file work too. The format is detected from the file itself, so links without an extension are fine. Use the original file's address: social networks and many CDNs remove EXIF when they resize images.",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "Dataset to enrich",
            "type": "string",
            "description": "Optional. A dataset from another run with image links (product photos, listing pictures, profile images…). For each item, the first field below that holds an image URL is analyzed and the metadata columns are added next to the item's fields. A field holding a list of URLs gives one row per image. Use {{resource.defaultDatasetId}} in an integration."
          },
          "urlFields": {
            "title": "Image URL fields",
            "type": "array",
            "description": "Item fields to take the image URL from, in order of preference. Dotted paths work (product.image). Default: imageUrl, imageUrls, image, images, thumbnailUrl, thumbnail, photo, src, url.",
            "items": {
              "type": "string"
            }
          },
          "keepItemFields": {
            "title": "Keep the item's original fields",
            "type": "boolean",
            "description": "On: each output row is the original item plus the metadata columns (metadata columns win if a name clashes). Off: only the metadata columns.",
            "default": true
          },
          "includeGps": {
            "title": "GPS location",
            "type": "boolean",
            "description": "On: latitude, longitude and altitude in decimal degrees and metres, plus a Google Maps link, when the photo has them. Off: no coordinates anywhere in the output (also left out of the raw EXIF); the hasGps column still says whether the file contains a location. Location data can be personal data: see the README.",
            "default": true
          },
          "includeColors": {
            "title": "Dominant colours",
            "type": "boolean",
            "description": "The 5 most common colours (hex and share of the picture) and the average colour.",
            "default": true
          },
          "includeHashes": {
            "title": "Hashes",
            "type": "boolean",
            "description": "SHA-256 of the file (exact copies) and the 64-bit perceptual hashes aHash, pHash and dHash (similar-looking images have hashes a few bits apart).",
            "default": true
          },
          "includeRawExif": {
            "title": "All EXIF tags (raw)",
            "type": "boolean",
            "description": "Adds rawExif: every EXIF tag by name. Serial numbers, the camera owner's name and the binary MakerNote are never included.",
            "default": false
          },
          "findDuplicates": {
            "title": "Find near-duplicates",
            "type": "boolean",
            "description": "Compares each image's pHash with every image before it. Rows get duplicateOf (the first earlier image that looks the same) and duplicateDistance, and the run summary (OUTPUT) lists all groups of near-duplicates. Turns on Hashes.",
            "default": false
          },
          "duplicateThreshold": {
            "title": "Near-duplicate threshold",
            "minimum": 0,
            "maximum": 16,
            "type": "integer",
            "description": "Maximum number of differing pHash bits (0–16) for two images to count as near-duplicates. 0 = visually identical; 6 (default) catches resized, re-compressed and slightly edited copies; higher values also match different photos of a similar scene.",
            "default": 6
          },
          "dedupe": {
            "title": "Analyze each URL once",
            "type": "boolean",
            "description": "Skip repeats of the same image URL (no row, no charge).",
            "default": true
          },
          "concurrency": {
            "title": "Images in parallel",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "How many images are downloaded and analyzed at once (1–16).",
            "default": 4
          },
          "maxResults": {
            "title": "Max output rows",
            "minimum": 1,
            "type": "integer",
            "description": "Optional cap on output rows (one row per image URL, including free error rows)."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}