{
  "openapi": "3.0.1",
  "info": {
    "title": "CRM Contact Cleanup & Dedupe Prep",
    "description": "Clean supplied URL, email, and address fields for contact records, preserving one row per input with changed-field, review, dedupe-key, and cross-field signals. Does not scrape, find, verify, enrich, geocode, score confidence, choose survivors, or merge contacts.",
    "version": "1.0",
    "x-build-id": "SGItgAmu63wncrqxk"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/critd~contact-cleanup/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-critd-contact-cleanup",
        "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/critd~contact-cleanup/runs": {
      "post": {
        "operationId": "runs-sync-critd-contact-cleanup",
        "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/critd~contact-cleanup/run-sync": {
      "post": {
        "operationId": "run-sync-critd-contact-cleanup",
        "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": {
          "records": {
            "title": "Records",
            "minItems": 1,
            "maxItems": 1000,
            "type": "array",
            "description": "Inline supplied contact-like records. Use this legacy route without Source. Each record may include recordId, url, email, and address. Invalid-looking field values are kept for row diagnostics instead of being silently dropped.",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "recordId": {
                  "title": "Record ID",
                  "type": "string",
                  "description": "Optional source identifier to map output rows back to your system. It is not required to be unique and does not authorize automatic dedupe or merge.",
                  "editor": "textfield",
                  "nullable": true,
                  "maxLength": 256
                },
                "url": {
                  "title": "URL",
                  "type": "string",
                  "description": "Optional supplied website URL or bare domain to normalize. Malformed values remain row diagnostics; this Actor does not crawl the site or prove reachability.",
                  "editor": "textfield",
                  "nullable": true,
                  "maxLength": 4096
                },
                "email": {
                  "title": "Email",
                  "type": "string",
                  "description": "Optional supplied email address to normalize for cleanup and matching signals. This Actor does not verify deliverability, inbox existence, or inbox ownership.",
                  "editor": "textfield",
                  "nullable": true,
                  "maxLength": 320
                },
                "address": {
                  "title": "Address",
                  "type": "string",
                  "description": "Optional supplied U.S.-leaning address text to normalize for cleanup and comparison-key signals. This Actor does not certify postal deliverability or geocode addresses.",
                  "editor": "textarea",
                  "nullable": true,
                  "maxLength": 1024
                }
              }
            }
          },
          "source": {
            "title": "Source",
            "required": [
              "type"
            ],
            "type": "object",
            "description": "High-volume source route contract. Set type and only the matching route fields: file, datasetId, or storeId plus recordKey. Previews with previewOnly=true read and diagnose supported file, Dataset, or key-value-store sources with zero default dataset rows. Execution-mode sources run the same preflight and spend-cap checks, then emit one default dataset row per accepted source record with bounded source metadata and a structured OUTPUT v2 summary for buyer, API, and agent review.",
            "properties": {
              "type": {
                "title": "Source Route",
                "type": "string",
                "description": "Exactly one source route. Rust validation rejects mixed inline records and source routes, and rejects fields that do not match this selected route.",
                "editor": "select",
                "enum": [
                  "file",
                  "dataset",
                  "keyValueStore"
                ],
                "enumTitles": [
                  "File upload",
                  "Dataset",
                  "Key-value store record"
                ]
              },
              "file": {
                "title": "File",
                "type": "string",
                "description": "File upload string for type=file. Supported Apify KVS record URLs and KVS-reference URI shapes can be read for source preview or execution without preserving query tokens or raw source bodies in output.",
                "editor": "fileupload",
                "nullable": true,
                "maxLength": 4096
              },
              "datasetId": {
                "title": "Source Dataset",
                "type": "string",
                "description": "Dataset ID or unique name for type=dataset. This route reads selected object fields with READ permission, pages rows through bounded preflight, and treats Dataset metadata counts as advisory.",
                "resourceType": "dataset",
                "resourcePermissions": [
                  "READ"
                ],
                "nullable": true,
                "maxLength": 256
              },
              "storeId": {
                "title": "Source Key-Value Store",
                "type": "string",
                "description": "Key-value store ID or unique name for type=keyValueStore. This route reads only the selected text record with READ permission, byte limits, and format guardrails.",
                "resourceType": "keyValueStore",
                "resourcePermissions": [
                  "READ"
                ],
                "nullable": true,
                "maxLength": 256
              },
              "recordKey": {
                "title": "KVS Record Key",
                "type": "string",
                "description": "Record key inside the selected key-value store for type=keyValueStore. The selected record is parsed as csv, jsonl, or json_array before preview or execution output.",
                "editor": "textfield",
                "nullable": true,
                "maxLength": 512
              },
              "format": {
                "title": "Source Format",
                "type": "string",
                "description": "Declared body format for file and key-value-store routes. When set to auto or omitted, preview routes detect csv, jsonl, or json_array from the selected record key or content type. Dataset sources already provide object rows and must leave this empty.",
                "editor": "select",
                "nullable": true,
                "enum": [
                  "auto",
                  "csv",
                  "jsonl",
                  "json_array"
                ],
                "enumTitles": [
                  "Auto-detect",
                  "CSV with header",
                  "JSON Lines",
                  "JSON array"
                ]
              },
              "fieldMap": {
                "title": "Field Map",
                "type": "object",
                "description": "Optional map from Contact Cleanup fields to source column or object-field names. Only recordId, url, email, and address are accepted; arbitrary CRM columns are not preserved.",
                "editor": "json",
                "additionalProperties": false,
                "properties": {
                  "recordId": {
                    "title": "Record ID Field",
                    "type": "string",
                    "description": "Source field or column name that maps to recordId.",
                    "nullable": true,
                    "maxLength": 256
                  },
                  "url": {
                    "title": "URL Field",
                    "type": "string",
                    "description": "Source field or column name that maps to url.",
                    "nullable": true,
                    "maxLength": 256
                  },
                  "email": {
                    "title": "Email Field",
                    "type": "string",
                    "description": "Source field or column name that maps to email.",
                    "nullable": true,
                    "maxLength": 256
                  },
                  "address": {
                    "title": "Address Field",
                    "type": "string",
                    "description": "Source field or column name that maps to address.",
                    "nullable": true,
                    "maxLength": 256
                  }
                }
              },
              "offset": {
                "title": "Dataset Offset",
                "type": "integer",
                "description": "Optional starting offset for type=dataset. It is ignored by other routes and rejected by Rust validation if mixed with them.",
                "editor": "number",
                "minimum": 0
              }
            },
            "additionalProperties": false
          },
          "previewOnly": {
            "title": "Preview Only",
            "type": "boolean",
            "description": "Source-route control. File, Dataset, and key-value-store previews diagnose source rows and write zero default dataset rows. Use preview before agentic or API execution to inspect OUTPUT.ingestion and OUTPUT.billingPreview. When false or omitted, supported source routes execute after preflight and spend-cap checks."
          },
          "sourceMaxRows": {
            "title": "Source Row Cap",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum accepted source rows for high-volume routes. The first-release source default is 10000 rows; over-limit sources fail before default dataset writes."
          },
          "rowLimitBehavior": {
            "title": "Row Limit Behavior",
            "enum": [
              "fail_over_limit"
            ],
            "type": "string",
            "description": "First-release source row-limit mode. Sources over the cap fail before output; silent truncation is not supported."
          },
          "fieldGroups": {
            "title": "Field Groups",
            "minItems": 1,
            "uniqueItems": true,
            "type": "array",
            "description": "Choose which supplied field families to process. This is a field selector, not a child Actor, stage, scraping, or live-enrichment control.",
            "items": {
              "type": "string",
              "enum": [
                "url",
                "email",
                "address"
              ],
              "enumTitles": [
                "URL",
                "Email",
                "Address"
              ]
            },
            "default": [
              "url",
              "email",
              "address"
            ]
          },
          "reviewStrictness": {
            "title": "Review Strictness",
            "enum": [
              "minimal",
              "standard",
              "strict"
            ],
            "type": "string",
            "description": "Controls how strongly deterministic review signals affect row status. It does not add verification, enrichment, confidence scoring, survivor choice, or merge authority.",
            "default": "standard"
          },
          "dedupeKeyMode": {
            "title": "Dedupe Key Mode",
            "enum": [
              "off",
              "keys_only",
              "keys_and_candidates"
            ],
            "type": "string",
            "description": "Controls whether match-prep keys and same-run candidate labels are emitted. It never deletes rows, ranks records, chooses survivors, or merges contacts.",
            "default": "keys_only"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}