{
  "openapi": "3.0.1",
  "info": {
    "title": "Irish Company Website Scraper - CRO No, VAT & Contacts",
    "description": "Turn Irish company domains into registry-grade B2B leads from each site's statutory website disclosure (Companies Act 2014 s.151): registered name, CRO number, legal form, registered office, Eircode, county, mod-23-checked VAT number, charity and regulator IDs, email, phone. $0.006 per disclosure.",
    "version": "0.1",
    "x-build-id": "QNDagzZ9EdxtHnJgz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~ie-company-website-disclosure-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-ie-company-website-disclosure-scraper",
        "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/scrapersdelight~ie-company-website-disclosure-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-ie-company-website-disclosure-scraper",
        "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/scrapersdelight~ie-company-website-disclosure-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-ie-company-website-disclosure-scraper",
        "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": {
          "domains": {
            "title": "Irish domains (or legal/terms page URLs)",
            "type": "array",
            "description": "One entry per company. Accepts all three shapes: a bare domain (\"inkplus.ie\"), a homepage URL (\"https://www.chmarine.com\") or a direct legal/terms page URL (\"https://x.ie/terms-and-conditions\"). ANY TLD is accepted - measured on 6,686 real Irish business domains from OpenStreetMap, only 59.2% are .ie and 37.9% are .com, so filtering to .ie would silently drop a third of the corpus. The Actor finds each site's Companies Act 2014 s.151 disclosure and parses it into one lead per domain. Leave empty to run the built-in Irish demo batch.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (list source)",
            "type": "array",
            "description": "The same domain list handed over as URLs, so Make, Zapier, Clay or a Google Sheet can pass it natively (a link to a text/CSV file of URLs also works). Merged with \"Irish domains\".",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "sourceDatasetId": {
            "title": "Enrich an existing dataset",
            "type": "string",
            "description": "Dataset ID of a previous Actor run. Each item's domain/website column is read and enriched - the real agency workflow: run a directory, Maps or Golden Pages scraper first, then pipe its output here."
          },
          "domainFieldName": {
            "title": "Domain field / CSV column",
            "type": "string",
            "description": "Which field of the source dataset (or which CSV column of the list file) holds the domain. Leave empty to auto-detect domain / website / websiteUrl / url / site / homepage. Dotted paths like \"company.website\" work."
          },
          "domainsFileUrl": {
            "title": "Domain list file URL",
            "type": "string",
            "description": "URL of a CSV, TXT, JSON or JSONL file holding the domains - for lists too big to paste into the editor. The column is picked with \"Domain field / CSV column\"."
          },
          "skipDomains": {
            "title": "Suppression list",
            "type": "array",
            "description": "Domains to skip outright - accounts you already own, competitors, do-not-contact entries. Matched on the registrable domain, so \"www.x.ie/page\" and \"x.ie\" are the same entry.",
            "items": {
              "type": "string"
            }
          },
          "previousDatasetId": {
            "title": "Skip rows already delivered (dataset ID)",
            "type": "string",
            "description": "Dataset ID of an earlier run of THIS Actor. Its stableId / companyNumber / domain values are loaded as a suppression list, so a monthly re-run never re-delivers - and never re-charges you for - a company you already bought."
          },
          "maxItems": {
            "title": "Max results (billed rows)",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on rows DELIVERED AND BILLED this run. Distinct from \"Max domains\": coverage depends on YOUR LIST, so it was measured on two independent 400-domain samples. An OpenStreetMap frame (mapped high-street businesses) billed 56 - 14.0% of all attempted, 18.8% of those that answered. A Tranco .ie frame (domains with real traffic) billed 126 - 31.5% and 40.3%. So 1,000 cold domains yield roughly 140 to 315 billed rows depending on where the list came from. 0 = unlimited.",
            "default": 1000
          },
          "maxDomains": {
            "title": "Max domains attempted",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on domains ATTEMPTED, applied before any request. Use it to sample a big list cheaply. 0 = attempt every domain supplied.",
            "default": 0
          },
          "maxDiscoveryRequestsPerDomain": {
            "title": "Max discovery requests per domain",
            "minimum": 0,
            "maximum": 40,
            "type": "integer",
            "description": "Hard cap on discovery + confirmation requests per domain, counted AFTER the homepage. This is the knob that stops one slow host burning a minute of a run. Measured average across the whole cascade: 6.6 requests per domain.",
            "default": 8
          },
          "maxPagesParsed": {
            "title": "Max pages parsed per domain",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many fetched pages may be parsed and merged for one domain. The homepage counts as one. Raising it finds more fields on sites that split the disclosure across terms/contact/privacy pages; lowering it to 1 makes the run homepage-only and very cheap.",
            "default": 3
          },
          "perDomainTimeoutSecs": {
            "title": "Per-domain timeout (seconds)",
            "minimum": 5,
            "maximum": 600,
            "type": "integer",
            "description": "Wall-clock deadline for one domain, discovery included.",
            "default": 60
          },
          "requestConcurrency": {
            "title": "Request concurrency",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many domains are worked in parallel. Higher is faster; keep it modest to stay polite to small business sites. Memory scales with it, so the Actor lowers it automatically (and says so in the log) if the run does not have the memory for the value you pick.",
            "default": 10
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Timeout for a single HTTP request.",
            "default": 25
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "maximum": 6,
            "type": "integer",
            "description": "Retries per request, each on a FRESH proxy IP (got-scraping's own retry reuses the flagged IP, which is useless against a soft block). Measured over 400 domains: 2,790 requests, 6.6 per domain.",
            "default": 2
          },
          "discoveryChannels": {
            "title": "Discovery channels",
            "type": "array",
            "description": "Which channels may be used to locate the disclosure, tried in this order. MEASURED on two independent 400-domain samples, counting which channel found the winning page: homepage footer 30 and 55, ranked footer links 25 and 69, XML sitemap 1 and 1, guessed paths 0 and 1. Between 44% and 55% of billed rows were only complete once two pages were merged, and the registered office was never once in the homepage footer - so lowering \"Max pages parsed\" to 1 makes a run cheap but costs you the statutory address. Unlike the German Impressum, Ireland has no conventional page name for the s.151 disclosure. The homepage footer is free (that page is already fetched).",
            "items": {
              "type": "string",
              "enum": [
                "homepage",
                "anchor",
                "sitemap",
                "wpJson",
                "pathGuess"
              ],
              "enumTitles": [
                "Homepage footer (free)",
                "Ranked footer links (terms / legal / privacy)",
                "XML sitemap",
                "WordPress REST page index",
                "Guessed paths"
              ]
            },
            "default": [
              "homepage",
              "anchor",
              "sitemap",
              "wpJson",
              "pathGuess"
            ]
          },
          "followWwwAndRootVariants": {
            "title": "Try www and apex variants",
            "type": "boolean",
            "description": "If the homepage fails, retry the other host form (www.x.ie to x.ie and back) before declaring the domain unreachable.",
            "default": true
          },
          "deepJsDiscovery": {
            "title": "Deep JS fallback (JS-only footers)",
            "type": "boolean",
            "description": "Last-resort channel for a footer that only exists after client-side render. No Chromium is launched - this build is deliberately browser-free, because a browser image would multiply the compute cost of every run. Instead the Actor reads what a render would have read FROM: the page's inline JSON payloads and its external JavaScript bundles, searching them for a legal-page URL. Costs up to 6 extra requests per domain and is never charged separately.",
            "default": false
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Fetch and honour each site's robots.txt before requesting anything. Off by default because it costs one extra request per domain and these pages exist to be indexed. Turn it on if your own compliance policy requires it.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Proxy settings. Apify DATACENTER is the default and is the measured winner on this corpus: usable transport on the large majority of reachable Irish domains, with a residential retry only when a host actually challenges us.",
            "default": {
              "useApifyProxy": true
            }
          },
          "proxyCountry": {
            "title": "Proxy country",
            "enum": [
              "none",
              "IE",
              "GB",
              "US"
            ],
            "type": "string",
            "description": "Pin the exit country for sites that geo-tailor their content. MEASURED: Apify datacenter proxies cannot be pinned to a country (they answer HTTP 407), so choosing a country here switches the run to RESIDENTIAL exit nodes in that country. Leave on None for the cheaper, measured-faster datacenter path.",
            "default": "none"
          },
          "escalateToResidentialOnBlock": {
            "title": "Escalate to residential on a block",
            "type": "boolean",
            "description": "On a 403 / challenge (never on a dead host and never on a 404), retry the request once on RESIDENTIAL. Measured on two 400-domain samples: 56 escalations / 16 recovered on a high-street list, and 170 / 63 on a list of larger Irish sites - bigger sites block far more. It only fires on an actual refusal, and a refused domain is never charged.",
            "default": true
          },
          "escalateToUnblockerOnBlock": {
            "title": "Escalate to Apify Unblocker on a block",
            "type": "boolean",
            "description": "A SECOND escalation, after residential, for the Cloudflare-managed-challenge tail. Off by default because Unblocker requests are billed to your Apify account on top of the row price.",
            "default": false
          },
          "customUserAgent": {
            "title": "Custom User-Agent",
            "type": "string",
            "description": "Override the browser User-Agent sent on every request. Leave empty for the built-in Chrome 124 fingerprint."
          },
          "extraHttpHeaders": {
            "title": "Extra HTTP headers",
            "type": "object",
            "description": "Additional request headers, merged over the defaults (e.g. a From: header identifying your crawler)."
          },
          "tldFilterMode": {
            "title": "TLD filter mode",
            "enum": [
              "none",
              "include",
              "exclude"
            ],
            "type": "string",
            "description": "No TLD filter is applied by default, deliberately: of 6,686 real Irish business domains sourced from OpenStreetMap, 59.2% are .ie and 37.9% are .com. Filtering to .ie would discard a third of the corpus, including many of the larger companies. Use this only when your own list really is single-TLD.",
            "default": "none"
          },
          "tldFilter": {
            "title": "TLDs",
            "type": "array",
            "description": "The TLD list the mode above applies to, without the dot: ie, com, eu, org.",
            "items": {
              "type": "string"
            }
          },
          "irishRegisteredOnly": {
            "title": "Only companies registered in Ireland",
            "type": "boolean",
            "description": "Drop rows whose disclosure names a register OUTSIDE the Republic. Measured on 73 Irish-corpus domains: 8 of them (cotswoldoutdoor.ie, quick-step.ie, boodles.com and others) are .ie or Irish-facing storefronts operated by companies registered in England, Wales, Scotland or Northern Ireland. Their UK company number is never emitted in the CRO field, and this switch removes the row entirely.",
            "default": false
          },
          "requireRegistryId": {
            "title": "Only rows with a registry ID",
            "type": "boolean",
            "description": "Deliver (and bill) only companies whose disclosure carries a CRO number, a VAT number or a charity number.",
            "default": false
          },
          "requireCompanyRegister": {
            "title": "Only numbers on the COMPANY register",
            "type": "boolean",
            "description": "The CRO runs two registers on ONE numeric space - companies and registered business names - and this is verified, not assumed: CRO number 368047 returns both GOOGLE IRELAND LIMITED (a company) and THE RETREAT BEAUTY SALON (a business name). Turn this on to keep only rows where the page itself says the number is a company registration. A business name is a sole trader or partnership trading under a name that is not the owner's own; s.151 does not bind it.",
            "default": false
          },
          "requireValidVat": {
            "title": "Only rows with a checksum-valid VAT number",
            "type": "boolean",
            "description": "Deliver (and bill) only rows whose Irish VAT number passes the published mod-23 check character. A row with no VAT number, or one that fails the check, is filtered out here and never billed.",
            "default": false
          },
          "requireContact": {
            "title": "Only rows with a contact",
            "type": "boolean",
            "description": "Deliver (and bill) only companies with an email or a phone number.",
            "default": false
          },
          "jurisdictionFilter": {
            "title": "Jurisdictions",
            "type": "array",
            "description": "Keep only companies whose disclosure names one of these registers. Ireland is inferred from a CRO number or from the wording (\"registered in Ireland\"); the UK jurisdictions appear when an Irish-facing site is operated by a British company. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "Ireland",
                "Northern Ireland",
                "England and Wales",
                "Scotland"
              ],
              "enumTitles": [
                "Ireland (CRO)",
                "Northern Ireland",
                "England and Wales",
                "Scotland"
              ]
            },
            "default": []
          },
          "minFieldsRequired": {
            "title": "Minimum populated fields",
            "minimum": 0,
            "maximum": 22,
            "type": "integer",
            "description": "Quality floor: a row must carry at least this many of the 22 value fields before it is delivered and billed. 0 = no floor. Measured median on real Irish domains: 10.",
            "default": 0
          },
          "emailPolicy": {
            "title": "Email policy",
            "enum": [
              "all",
              "role-only",
              "exclude-role"
            ],
            "type": "string",
            "description": "Agencies split hard on whether info@ / enquiries@ counts as a lead. \"Role only\" keeps just those; \"Exclude role\" keeps only named mailboxes.",
            "default": "all"
          },
          "dedupeBy": {
            "title": "Deduplicate by",
            "enum": [
              "company-number-then-domain",
              "domain",
              "company-number",
              "none"
            ],
            "type": "string",
            "description": "Which key collapses duplicates BEFORE anything is pushed or charged. The default uses a well-formed CRO number when the page carries one and the registrable domain otherwise, so two domains owned by the same company collapse to one billed row - and a repeated input line is dropped at queue time, before it costs a request.",
            "default": "company-number-then-domain"
          },
          "validateTaxId": {
            "title": "Checksum-validate the VAT number",
            "type": "boolean",
            "description": "Run the published Irish mod-23 check character on every VAT number found, covering both the 8-character form (IE6388047V) and the newer 9-character form (IE3206488LH), and emit vatNumberValid plus which variant it passed. Note that CRO numbers carry NO check digit at all, so companyNumberFormatValid is a format and issued-range check, never a checksum.",
            "default": true
          },
          "extractRegulator": {
            "title": "Extract the regulator",
            "type": "boolean",
            "description": "The Irish regulatory body a professional-services site must name (Central Bank of Ireland, PSRA for estate agents, Law Society, Medical and Dental Councils, CORU, HIQA, the Charities Regulator, RGII, Safe Electric, the Private Security Authority and others) plus its licence or reference number where published.",
            "default": true
          },
          "extractCharity": {
            "title": "Extract the charity numbers",
            "type": "boolean",
            "description": "Ireland keeps TWO charity identifiers on two different registers and they get two fields: the Charities Regulator's RCN, and Revenue's older CHY charitable-tax-exemption number.",
            "default": true
          },
          "extractOfficer": {
            "title": "Extract a named officer",
            "type": "boolean",
            "description": "A director, proprietor or company secretary named next to a label on the page. Honest expectation: Irish sites rarely publish one - 0.0% of billed rows on a high-street sample and 3.2% on a sample of larger Irish sites. Unlike a German Impressum, s.151 does not require it at all.",
            "default": true
          },
          "extractSocials": {
            "title": "Extract social profiles",
            "type": "boolean",
            "description": "LinkedIn, Facebook, Instagram, X, YouTube and TikTok links present on the pages read.",
            "default": true
          },
          "extractPolicyUrls": {
            "title": "Extract terms & privacy-policy URLs",
            "type": "boolean",
            "description": "The site's terms and privacy-policy URLs, linked from the pages read.",
            "default": true
          },
          "includeMissRows": {
            "title": "Include unbilled miss rows",
            "type": "boolean",
            "description": "Emit a row for every domain that produced no lead - dead host, blocked, publishes no disclosure, filtered out, a duplicate, or suppressed - with its status and missReason, so you can do coverage accounting. These rows are NEVER charged.",
            "default": false
          },
          "includeFieldSources": {
            "title": "Include per-field provenance",
            "type": "boolean",
            "description": "Add a fieldSources object naming the exact URL each field was read from. Useful when a disclosure is split across a terms page and a contact page and you need to audit which said what.",
            "default": false
          },
          "flattenOutput": {
            "title": "Flat columns",
            "type": "boolean",
            "description": "On: one flat row, ready for Google Sheets, Clay or a CSV export. Off: fields grouped into company {}, registry {}, contact {}, people {} and policies {} objects.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}