{
  "openapi": "3.0.1",
  "info": {
    "title": "Phone Number Validator & Email Cleaner: Contact Normalizer",
    "description": "Validate and format phone numbers (E.164, type, region) and clean emails, names and countries in bulk for CRM imports, lead lists and AI agents. Flags disposable, role and invalid emails, dedupes records. Offline, $0.0005 per record.",
    "version": "1.0",
    "x-build-id": "M6dg1IEw56kj7GybN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tinplatelabs~contact-normalizer/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tinplatelabs-contact-normalizer",
        "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/tinplatelabs~contact-normalizer/runs": {
      "post": {
        "operationId": "runs-sync-tinplatelabs-contact-normalizer",
        "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/tinplatelabs~contact-normalizer/run-sync": {
      "post": {
        "operationId": "run-sync-tinplatelabs-contact-normalizer",
        "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",
            "type": "array",
            "description": "Contact records to validate and clean (phone numbers to E.164, emails checked, names and countries tidied), as JSON objects, e.g. <code>[{\"name\": \"ada LOVELACE\", \"email\": \"Ada@Example.com\", \"phone\": \"(650) 253-0000\", \"country\": \"USA\"}]</code>. Any other columns are copied through unchanged. You can also (or instead) use <b>datasetId</b> or <b>dataUrl</b>."
          },
          "datasetId": {
            "title": "Apify dataset",
            "type": "string",
            "description": "Read records from an Apify dataset, for example the output of a lead-scraping Actor: pick it or paste its ID (or <code>username~dataset-name</code>). Each dataset item is one record. The Actor gets read access to the dataset you choose here and to nothing else in your account."
          },
          "dataUrl": {
            "title": "CSV or JSON file URL",
            "type": "string",
            "description": "Public http(s) URL of a CSV file with a header row (comma, semicolon, tab or pipe separated), a JSON array, an object with an <code>items</code> array, or JSON Lines, in UTF-8, UTF-16 or Windows-1252. Max 200 MB."
          },
          "fieldMapping": {
            "title": "Field mapping",
            "type": "object",
            "description": "Which columns hold which kind of data, e.g. <code>{\"email\": [\"Work email\"], \"phone\": [\"Mobile\", \"Office\"], \"name\": [\"First\", \"Last\"], \"country\": [\"Ctry\"]}</code>. Leave empty to detect columns by name (email, e-mail, phone, mobile, tel, fax, name, first name, surname, country...). When set, only the listed columns are normalized."
          },
          "defaultCountry": {
            "title": "Default country for phone numbers",
            "type": "string",
            "description": "Country used to read phone numbers written without a country code, as an ISO code or name (US, DE, GB, Canada...). Leave empty to require '+' country codes.",
            "default": "US"
          },
          "useRecordCountry": {
            "title": "Use the record's country for its phones",
            "type": "boolean",
            "description": "If a record has a recognised country field, read its phone numbers with that country instead of the default.",
            "default": true
          },
          "phoneFormat": {
            "title": "Phone format in the normalized record",
            "enum": [
              "e164",
              "international",
              "national"
            ],
            "type": "string",
            "description": "All three formats are always in <code>fields</code>; this picks the one written into <code>normalized</code>.",
            "default": "e164"
          },
          "countryFormat": {
            "title": "Country format in the normalized record",
            "enum": [
              "alpha2",
              "alpha3",
              "name"
            ],
            "type": "string",
            "description": "All formats are always in <code>fields</code>; this picks the one written into <code>normalized</code>.",
            "default": "alpha2"
          },
          "lowercaseEmail": {
            "title": "Lowercase whole email address",
            "type": "boolean",
            "description": "Domains are always lowercased. This also lowercases the part before @ (almost every mail server ignores its case).",
            "default": true
          },
          "canonicalizeEmail": {
            "title": "Canonical email (Gmail dots, +tags)",
            "type": "boolean",
            "description": "Add a <code>canonical</code> address: Gmail/Googlemail dots and +tags removed, +tags removed for Outlook, iCloud, Fastmail and Proton. Dedupe then uses it. The normalized address itself is not changed.",
            "default": false
          },
          "checkMx": {
            "title": "Check mail servers (DNS MX)",
            "type": "boolean",
            "description": "Look up each email domain's mail servers in DNS (once per domain). Off by default: the Actor is then fully offline. Slower, and the domain names are sent to DNS resolvers.",
            "default": false
          },
          "dedupe": {
            "title": "Find duplicates by",
            "enum": [
              "none",
              "email",
              "phone",
              "emailOrPhone"
            ],
            "type": "string",
            "description": "Mark records whose (normalized) email and/or E.164 phone already appeared earlier in this run. Uses the canonical email when <b>canonicalizeEmail</b> is on.",
            "default": "none"
          },
          "dropDuplicates": {
            "title": "Drop duplicates from the output",
            "type": "boolean",
            "description": "Omit duplicates (they are not charged). Otherwise they are kept and marked with <code>isDuplicate</code> and <code>duplicateOf</code>.",
            "default": false
          },
          "maxRecords": {
            "title": "Max records",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop after this many records. Use it to cap cost on large inputs.",
            "default": 1000000
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}