{
  "openapi": "3.0.1",
  "info": {
    "title": "UK Vet Practice Leads - RCVS Register",
    "description": "From $1.50 per 1,000 practices, no start fee. All 5,647 UK veterinary practices on the RCVS register: direct email (79%), phone (84%), full address, postcode, lat/lng and RCVS accreditation tier. Optional detail-page enrichment adds species treated, opening hours and facilities. No API key.",
    "version": "0.1",
    "x-build-id": "ecQCqFe7bD9ch1W9I"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~rcvs-vet-practices-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-rcvs-vet-practices-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~rcvs-vet-practices-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-rcvs-vet-practices-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~rcvs-vet-practices-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-rcvs-vet-practices-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": {
          "maxPractices": {
            "title": "Max practices",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on practices delivered - and therefore charged. 0 means the whole register (5,647 practices, 565 requests, measured 2m0s). Without a filter the crawl stops as soon as this many rows are in hand - and because RCVS returns the register in two blocks, an unfiltered capped run reads only the first 320 practices, which have websites but NO email or phone. Pair a cap with requireEmail to sample the whole register instead.",
            "default": 1000
          },
          "requireEmail": {
            "title": "Only practices with an email",
            "type": "boolean",
            "description": "Drop practices that publish no email address. Measured over a full 5,647-row census: 81.9% have one (4,623 practices). STRONGLY RECOMMENDED when you also set maxPractices - the register returns its first 320 practices in a block that has no email addresses at all, so a small unfiltered run reads only those. With any filter set, the whole register is read and only matching rows are delivered and charged.",
            "default": false
          },
          "requirePhone": {
            "title": "Only practices with a phone number",
            "type": "boolean",
            "description": "Drop practices that publish no phone number. Measured over the full register: 86.6% (4,889 practices).",
            "default": false
          },
          "requireWebsite": {
            "title": "Only practices with a website",
            "type": "boolean",
            "description": "Drop practices that publish no website. WARNING - the register almost never carries one: measured over the full register it is 4.9% (279 practices), and 274 of those 279 sit in the first 320 records, which carry no email or phone.",
            "default": false
          },
          "accreditationTier": {
            "title": "RCVS accreditation tier",
            "type": "array",
            "description": "Filter by the practice's standing in the RCVS Practice Standards Scheme. Leave empty for all three.",
            "items": {
              "type": "string",
              "enum": [
                "Accredited Practice",
                "Accreditation in progress",
                "Non-accredited Practice"
              ]
            },
            "default": []
          },
          "accreditationModules": {
            "title": "Accreditation modules",
            "type": "array",
            "description": "Filter by the specific Practice Standards Scheme modules a practice holds - the cheap way to separate small-animal from equine and farm-animal practices, because it comes from the listing and needs no detail-page fetch. Measured over the full register: 63.8% of practices list at least one module (3,600).",
            "items": {
              "type": "string",
              "enum": [
                "Small Animal Veterinary Hospital (No Dentistry)",
                "Equine General Practice (Ambulatory)",
                "Small Animal Emergency Service Clinic",
                "Equine Emergency Service Clinic",
                "Small Animal Veterinary Hospital",
                "Small Animal General Practice",
                "Farm Animal General Practice",
                "Equine Veterinary Hospital",
                "Core Standards (Small Animal)",
                "Core Standards (Farm Animal)",
                "Equine General Practice",
                "Core Standards (Equine)"
              ]
            },
            "default": []
          },
          "postcodeAreas": {
            "title": "Postcode areas",
            "type": "array",
            "description": "Filter to one or more UK postcode AREAS - the letters only, such as SW, M, LS, EH, CF. Matched exactly, so M does not also return ME.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "counties": {
            "title": "Counties",
            "type": "array",
            "description": "Filter by county exactly as the register writes it, for example Leicestershire, West Sussex, Argyll. Measured over the full register: 93.6% (5,286) - London practices usually publish no county, so use postcodeAreas for London.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "nameOrTownIncludes": {
            "title": "Name or town contains",
            "type": "string",
            "description": "Free-text match against the practice name, town, county and postcode. Case-insensitive."
          },
          "enrichFromDetailPages": {
            "title": "Enrich from practice pages (species, hours, facilities)",
            "type": "boolean",
            "description": "Fetch each matching practice's own RCVS page to add species treated, opening hours, facilities and training status. These four fields DO NOT exist in the register's listing API - this is the only way to get them, and it costs one extra request per practice (5,647 for the full register instead of 565). Off by default.",
            "default": false
          },
          "animalsTreated": {
            "title": "Species treated",
            "type": "array",
            "description": "Keep only practices that treat these species. Requires detail-page enrichment and switches it on automatically. Measured: 97.8% of practice pages publish a species list; a practice that publishes none is excluded rather than guessed at.",
            "items": {
              "type": "string",
              "enum": [
                "Aquatic",
                "Birds",
                "Camelids",
                "Cats",
                "Cattle",
                "Deer",
                "Dogs",
                "Exotic/Wild",
                "Horses",
                "Pigs",
                "Poultry",
                "Sheep/Goats",
                "Small Mammals"
              ]
            },
            "default": []
          },
          "animalsMatchAll": {
            "title": "Species: match ALL rather than ANY",
            "type": "boolean",
            "description": "By default a practice is kept if it treats ANY of the chosen species. Turn this on to require ALL of them.",
            "default": false
          },
          "facilities": {
            "title": "Facilities",
            "type": "array",
            "description": "Keep only practices offering ALL of these. Requires detail-page enrichment and switches it on automatically. Measured: 69.9% of practice pages publish a facilities list.",
            "items": {
              "type": "string",
              "enum": [
                "Client Car Park",
                "Disabled Public Access",
                "Open At Weekends",
                "Out Of Hours"
              ]
            },
            "default": []
          },
          "developmentAndTraining": {
            "title": "Development and training",
            "type": "array",
            "description": "Keep only practices that take veterinary students (EMS) or are RCVS Approved Graduate Development Practices (VetGDP). Requires detail-page enrichment and switches it on automatically. Measured: 63.4% of practice pages publish this.",
            "items": {
              "type": "string",
              "enum": [
                "Extra Mural Studies (EMS)",
                "VetGDP"
              ]
            },
            "default": []
          },
          "maxConcurrency": {
            "title": "Concurrent requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel requests to rcvs.org.uk. The register's robots.txt declares 'Crawl-delay: 10' - set this to 1 and requestDelayMs to 10000 to honour it exactly, which takes about 94 minutes for the full register.",
            "default": 5
          },
          "requestDelayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "type": "integer",
            "description": "Pause between requests. 0 by default. Set to 10000 with maxConcurrency 1 to match the Crawl-delay the site declares.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy. Datacenter is plenty - the register served 200 on every request during testing, with no anti-bot challenge and no rate limit.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}