{
  "data": {
    "id": "Bm2HW4YnM5nDD2nF9",
    "actId": "jvPNFOkWdHfMwL4DL",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-11-13T02:42:58.210Z",
    "finishedAt": "2026-11-13T02:43:13.211Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 14926,
      "runTimeSecs": 14.926,
      "computeUnits": 0.016584444444444443,
      "imageSizeBytes": 332495360
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "6GwdnIcc2aWR7LzCS",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"RescueGroups Scraper Input\",\n  \"description\": \"Search adoptable pets by ZIP, radius, species, breed, age, sex and size, look up animals by ID, or fetch rescue organizations. Works without an API key; an optional free RescueGroups key adds API-only fields and organization name search.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to fetch: a pet search, specific animals by ID, or rescue organizations.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"byAnimalIds\",\n        \"orgSearch\"\n      ],\n      \"enumTitles\": [\n        \"Search adoptable pets\",\n        \"Look up animals by ID\",\n        \"Look up rescue organizations\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"apiKey\": {\n      \"title\": \"API key (optional)\",\n      \"type\": \"string\",\n      \"description\": \"Optional free public RescueGroups.org API key. Leave empty to use the cookieless public pet-search pages. A key adds API-only fields (adoption fee, energy level, exact birth date, and more) and organization name search.\",\n      \"editor\": \"textfield\",\n      \"isSecret\": true\n    },\n    \"species\": {\n      \"title\": \"Species\",\n      \"type\": \"string\",\n      \"description\": \"Species filter (mode=search). Pick (any species) to search every species.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"Alpaca\",\n        \"Bird\",\n        \"Cat\",\n        \"Chicken\",\n        \"Chinchilla\",\n        \"Cow\",\n        \"Degu\",\n        \"Dog\",\n        \"Donkey\",\n        \"Duck\",\n        \"Ferret\",\n        \"Fish\",\n        \"Frog\",\n        \"Gecko\",\n        \"Gerbil\",\n        \"Goat\",\n        \"Goose\",\n        \"Groundhog\",\n        \"Guinea Pig\",\n        \"Hamster\",\n        \"Hedgehog\",\n        \"Hermit Crab\",\n        \"Horse\",\n        \"Iguana\",\n        \"Lizard\",\n        \"Llama\",\n        \"Mouse\",\n        \"Otter\",\n        \"Pig\",\n        \"Pony\",\n        \"Prairie Dog\",\n        \"Rabbit\",\n        \"Rat\",\n        \"Sheep\",\n        \"Skunk\",\n        \"Snake\",\n        \"Sugar Glider\",\n        \"Tarantula\",\n        \"Tortoise\",\n        \"Turkey\",\n        \"Turtle\"\n      ],\n      \"enumTitles\": [\n        \"(any species)\",\n        \"Alpaca\",\n        \"Bird\",\n        \"Cat\",\n        \"Chicken\",\n        \"Chinchilla\",\n        \"Cow\",\n        \"Degu\",\n        \"Dog\",\n        \"Donkey\",\n        \"Duck\",\n        \"Ferret\",\n        \"Fish\",\n        \"Frog\",\n        \"Gecko\",\n        \"Gerbil\",\n        \"Goat\",\n        \"Goose\",\n        \"Groundhog\",\n        \"Guinea Pig\",\n        \"Hamster\",\n        \"Hedgehog\",\n        \"Hermit Crab\",\n        \"Horse\",\n        \"Iguana\",\n        \"Lizard\",\n        \"Llama\",\n        \"Mouse\",\n        \"Otter\",\n        \"Pig\",\n        \"Pony\",\n        \"Prairie Dog\",\n        \"Rabbit\",\n        \"Rat\",\n        \"Sheep\",\n        \"Skunk\",\n        \"Snake\",\n        \"Sugar Glider\",\n        \"Tarantula\",\n        \"Tortoise\",\n        \"Turkey\",\n        \"Turtle\"\n      ],\n      \"default\": \"Dog\",\n      \"prefill\": \"Dog\"\n    },\n    \"breed\": {\n      \"title\": \"Breed\",\n      \"type\": \"string\",\n      \"description\": \"Breed name filter (mode=search), e.g. `Labrador Retriever`. The cookieless source matches any breed in the animal's breed string (primary or secondary); with an optional API key the primary breed is matched exactly.\",\n      \"editor\": \"textfield\"\n    },\n    \"sex\": {\n      \"title\": \"Sex\",\n      \"type\": \"string\",\n      \"description\": \"Sex filter (mode=search).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"Male\",\n        \"Female\"\n      ],\n      \"enumTitles\": [\n        \"(any)\",\n        \"Male\",\n        \"Female\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"ageGroup\": {\n      \"title\": \"Age group\",\n      \"type\": \"string\",\n      \"description\": \"General age filter (mode=search).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"Baby\",\n        \"Young\",\n        \"Adult\",\n        \"Senior\"\n      ],\n      \"enumTitles\": [\n        \"(any)\",\n        \"Baby\",\n        \"Young\",\n        \"Adult\",\n        \"Senior\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"sizeGroup\": {\n      \"title\": \"Size\",\n      \"type\": \"string\",\n      \"description\": \"Size filter (mode=search).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"Small\",\n        \"Medium\",\n        \"Large\",\n        \"X-Large\"\n      ],\n      \"enumTitles\": [\n        \"(any)\",\n        \"Small\",\n        \"Medium\",\n        \"Large\",\n        \"X-Large\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"specialNeedsOnly\": {\n      \"title\": \"Special needs only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only animals flagged as having special needs.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"goodWithDogsOnly\": {\n      \"title\": \"Good with dogs only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only animals flagged as good with dogs.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"goodWithCatsOnly\": {\n      \"title\": \"Good with cats only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only animals flagged as good with cats.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"goodWithKidsOnly\": {\n      \"title\": \"Good with kids only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only animals flagged as good with kids.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"needsFosterOnly\": {\n      \"title\": \"Needs foster only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only animals currently looking for a foster home.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"housetrainedOnly\": {\n      \"title\": \"House-trained only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only animals flagged as house-trained.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"declawedOnly\": {\n      \"title\": \"Declawed only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only animals flagged as declawed.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"postalCode\": {\n      \"title\": \"ZIP / postal code\",\n      \"type\": \"string\",\n      \"description\": \"Center point for a radius search (mode=search). Leave empty to search everywhere.\",\n      \"editor\": \"textfield\",\n      \"prefill\": \"02108\"\n    },\n    \"radiusMiles\": {\n      \"title\": \"Radius (miles)\",\n      \"type\": \"integer\",\n      \"description\": \"Search radius around the postal code (mode=search). The source supports 25, 50, 100 and 200 miles; requests under 25 use 25, values between buckets round down, and requests above 200 use 200.\",\n      \"minimum\": 1,\n      \"maximum\": 500,\n      \"default\": 50,\n      \"prefill\": 25\n    },\n    \"includeDetails\": {\n      \"title\": \"Fetch full animal details\",\n      \"type\": \"boolean\",\n      \"description\": \"Open each animal's public detail page for shelter contact, description, photos and temperament flags. Turn off for a faster, lighter listing-only run. The optional API path always returns full details.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"animalIds\": {\n      \"title\": \"Animal IDs (mode=byAnimalIds)\",\n      \"type\": \"array\",\n      \"description\": \"RescueGroups animal IDs or animal page URLs, e.g. `22514067`.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"organizationIds\": {\n      \"title\": \"Organization IDs (mode=orgSearch)\",\n      \"type\": \"array\",\n      \"description\": \"RescueGroups organization IDs, e.g. `6260` (the number in a pet photo URL).\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"orgQuery\": {\n      \"title\": \"Organization name or ID (mode=orgSearch)\",\n      \"type\": \"string\",\n      \"description\": \"Optional organization name filter. Name search needs the optional `apiKey`; a numeric ID or organization-page URL works without one (legacy `orgQuery` inputs are supported).\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on emitted records.\",\n      \"minimum\": 1,\n      \"maximum\": 2000,\n      \"default\": 50,\n      \"prefill\": 3\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# RescueGroups.org Adoptable Pet Finder by ZIP\n\nRescueGroups.org brings together adoptable animals from thousands of shelters and rescues across the United States and Canada. This actor searches that catalogue the way a Petfinder-style site does — **ZIP + radius, species, breed, sex, age, size, and temperament** — then opens each animal's public page for the shelter contact, description, photos and personality flags.\n\nIt also looks up specific animals by ID and fetches rescue organizations by ID. **No cookies, login, or API key are required.** An optional free RescueGroups.org API key adds API-only fields and organization name search.\n\n## Modes\n\n| Mode | What it does |\n|---|---|\n| `search` (default) | Finds adoptable pets by ZIP/radius and the filters below |\n| `byAnimalIds` | Fetches the animals whose IDs (or animal-page URLs) you paste |\n| `orgSearch` | Fetches rescue organizations by ID; with an optional API key it can also search organizations by name |\n\n## What you get per animal\n\n- **Identity:** `animalId`, `name`, `status`, `species`, `breedPrimary`, `breedSecondary`, `breedString`\n- **Profile:** `sex`, `ageGroup`, `sizeGroup`, `sizePotential`, `colors`, `pattern`, `coatLength`\n- **Temperament and care:** `isAltered`, `isHousetrained`, `isCurrentVaccinations`, `isMicrochipped`, `isDeclawed`, `isSpecialNeeds`, `isNeedingFoster`, `isCatsOk`, `isDogsOk`, `isKidsOk`, `isAdultsOk`, `isYardRequired`, `isCrateTrained`, `activityLevel`, `energyLevel`, `exerciseNeeds`, `groomingNeeds`, `indoorOutdoor`, `newPeopleReaction`, `obedienceTraining`, `ownerExperience`, `sheddingLevel`, `vocalLevel`\n- **Story:** `descriptionText`, `descriptionHtml`, `adoptionArea`\n- **Shelter:** `organizationId`, `organizationName`, `organizationAddress`, `organizationCity`, `organizationState`, `organizationPostalCode`, `organizationEmail`, `organizationPhone`, `organizationUrl`\n- **Location:** `locationCity`, `locationState`, `distanceMiles` (radius searches)\n- **Links and metadata:** `pictures[]`, `pictureThumbnailUrl`, `sourceUrl`, `adoptionUrl`, `recordType`, `scrapedAt`\n\nWith an optional API key the records can also include the API-only fields: `searchString`, `rescueId`, `ageString`, `birthDate`, `isBirthDateExact`, `sizeCurrent`, `colorDetails`, `adoptionFeeString`, `distinguishingMarks`, `specialNeedsDetails`, `qualities`, `summary`, `organizationIds`, `locationCountry`, and the full temperament set.\n\n## What you get per organization\n\n`organizationId`, `name`, `about`, `services`, `adoptionProcess`, `adoptionArea`, `address`, `city`, `state`, `postalcode`, `country`, `phone`, `email`, `url`, `facebookUrl`, `donationUrl`, `adoptionUrl`, `isCommonApplicationAccepted`, `sourceUrl`, `recordType`, `scrapedAt`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `search` | `search`, `byAnimalIds`, or `orgSearch` |\n| `apiKey` | secret | – | Optional free API key; adds API-only fields and org name search |\n| `species` | string | `Dog` | Full species list, or `(any species)` |\n| `breed` | string | – | Breed name, e.g. `Labrador Retriever` (matches any breed in the animal's breed string) |\n| `sex` | string | – | `(any)`, `Male`, `Female` |\n| `ageGroup` | string | – | `(any)`, `Baby`, `Young`, `Adult`, `Senior` |\n| `sizeGroup` | string | – | `(any)`, `Small`, `Medium`, `Large`, `X-Large` |\n| `specialNeedsOnly` | boolean | `false` | Only special-needs animals |\n| `goodWithDogsOnly` | boolean | `false` | Only animals flagged good with dogs |\n| `goodWithCatsOnly` | boolean | `false` | Only animals flagged good with cats |\n| `goodWithKidsOnly` | boolean | `false` | Only animals flagged good with kids |\n| `needsFosterOnly` | boolean | `false` | Only animals looking for a foster home |\n| `housetrainedOnly` | boolean | `false` | Only house-trained animals |\n| `declawedOnly` | boolean | `false` | Only declawed animals |\n| `postalCode` | string | – | ZIP/postal code for a radius search; empty searches everywhere |\n| `radiusMiles` | integer | `50` | Radius in miles (1–500; requests under 25 use 25, values between buckets round down, and requests above 200 use 200) |\n| `includeDetails` | boolean | `true` | Open each animal's detail page (richer, slightly slower) |\n| `animalIds` | array | `[]` | Animal IDs or page URLs for `mode=byAnimalIds` |\n| `organizationIds` | array | `[]` | Organization IDs for `mode=orgSearch` |\n| `orgQuery` | string | – | Organization name (needs the optional key) or a numeric ID / organization-page URL (keyless; legacy inputs supported) |\n| `maxItems` | integer | `50` | Hard cap on emitted records (1–2000) |\n\n### Example: dogs within 25 miles of Boston\n\n```json\n{\n  \"mode\": \"search\",\n  \"species\": \"Dog\",\n  \"postalCode\": \"02108\",\n  \"radiusMiles\": 25,\n  \"maxItems\": 50\n}\n```\n\n### Example: senior cats, good with kids\n\n```json\n{\n  \"mode\": \"search\",\n  \"species\": \"Cat\",\n  \"ageGroup\": \"Senior\",\n  \"goodWithKidsOnly\": true,\n  \"maxItems\": 30\n}\n```\n\n### Example: one breed, nationwide\n\n```json\n{\n  \"mode\": \"search\",\n  \"species\": \"Dog\",\n  \"breed\": \"Labrador Retriever\",\n  \"maxItems\": 100\n}\n```\n\n### Example: look up animals by ID\n\n```json\n{\n  \"mode\": \"byAnimalIds\",\n  \"animalIds\": [\"22514067\", \"22813117\"]\n}\n```\n\n### Example: fetch a rescue organization\n\n```json\n{\n  \"mode\": \"orgSearch\",\n  \"organizationIds\": [\"6260\"]\n}\n```\n\n## How it works\n\n- **Default, credential-free path.** The actor reads the public National Pet Search toolkit pages (`toolkit.rescuegroups.org`), the same pages RescueGroups.org serves to any website visitor. Search pages return 24 animals at a time; the actor paginates until `maxItems` or the result set ends. Each animal's public detail page supplies the profile, shelter contact, description and photos.\n- **Optional API path.** Paste a free RescueGroups.org public API key and the actor uses the official v5 JSON:API instead. It returns the same records plus API-only fields and supports organization name search. No key is required for any core mode.\n- **Filters are source-side.** Species, breed, sex, age, size, ZIP/radius, special-needs, foster, house-trained, declawed and good-with filters are applied by the source, not discarded afterwards.\n- **Pagination is honest.** The actor stops on `maxItems`, source exhaustion, or a short page — it never cuts a run short with a wall-clock timer.\n- **Empty values are omitted.** A field the source does not expose for a particular animal is left out, never sent as `null`, `\"\"`, `[]` or a placeholder.\n\n## FAQ\n\n**Do I need an API key?** No. The default path needs no key, account, cookie or proxy. The optional key is free and only adds fields and organization name search.\n\n**Why is the radius rounded?** The public search page offers 25, 50, 100 and 200 mile buckets. The actor picks the closest supported bucket: values between buckets round down, requests under 25 use the 25-mile minimum, and requests above 200 use the 200-mile maximum instead of widening to a nationwide search.\n\n**Why did a breed return nothing?** Breed names are shelter-entered. Use the exact name from the RescueGroups breed list, optionally prefixed with the species (`Dog: Labrador Retriever`).\n\n**Are all adoptable animals included?** The public search lists currently available animals. Most have photos, but a few listings show only a placeholder, so their `pictures` fields are omitted.\n\n**How fresh is the data?** Every run queries the live source.\n\n**Is this affiliated with RescueGroups.org?** No. This is an independent third-party actor using publicly available pages and, optionally, the public API.\n\n## Limitations\n\n- The public search exposes 25/50/100/200-mile radius buckets; the actor rounds down, using 25 for smaller requests and 200 for larger ones.\n- Age and size are single-choice filters on the public path (the source's own checkboxes support multiple values).\n- Breed matching is exact after case-folding and matches any breed in the animal's breed string (primary or secondary); near-miss spellings return a clear status message instead of wrong results.\n- Without an API key, organization lookup works by numeric ID only; organization name search needs the optional key.\n- The source is US/Canada focused; most listings have photos, but some have no public photo and omit the picture fields.\n- Some animals and organizations omit fields such as size, contact details, address or phone; those fields are absent from the record rather than guessed.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "rescuegroups-org-adoptable-pet-finder-by-zip",
      "title": "RescueGroups.org Adoptable Pet Finder by ZIP",
      "description": "Search RescueGroups.org adoptable dogs, cats, rabbits and more with Petfinder-style filters (species, breed, sex, age, size, ZIP + radius), fetch animals by ID, or browse rescue organizations and their contact details.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# RescueGroups.org Adoptable Pet Finder by ZIP\n\nRescueGroups.org brings together adoptable animals from thousands of shelters and rescues across the United States and Canada. This actor searches that catalogue the way a Petfinder-style site does — **ZIP + radius, species, breed, sex, age, size, and temperament** — then opens each animal's public page for the shelter contact, description, photos and personality flags.\n\nIt also looks up specific animals by ID and fetches rescue organizations by ID. **No cookies, login, or API key are required.** An optional free RescueGroups.org API key adds API-only fields and organization name search.\n\n## Modes\n\n| Mode | What it does |\n|---|---|\n| `search` (default) | Finds adoptable pets by ZIP/radius and the filters below |\n| `byAnimalIds` | Fetches the animals whose IDs (or animal-page URLs) you paste |\n| `orgSearch` | Fetches rescue organizations by ID; with an optional API key it can also search organizations by name |\n\n## What you get per animal\n\n- **Identity:** `animalId`, `name`, `status`, `species`, `breedPrimary`, `breedSecondary`, `breedString`\n- **Profile:** `sex`, `ageGroup`, `sizeGroup`, `sizePotential`, `colors`, `pattern`, `coatLength`\n- **Temperament and care:** `isAltered`, `isHousetrained`, `isCurrentVaccinations`, `isMicrochipped`, `isDeclawed`, `isSpecialNeeds`, `isNeedingFoster`, `isCatsOk`, `isDogsOk`, `isKidsOk`, `isAdultsOk`, `isYardRequired`, `isCrateTrained`, `activityLevel`, `energyLevel`, `exerciseNeeds`, `groomingNeeds`, `indoorOutdoor`, `newPeopleReaction`, `obedienceTraining`, `ownerExperience`, `sheddingLevel`, `vocalLevel`\n- **Story:** `descriptionText`, `descriptionHtml`, `adoptionArea`\n- **Shelter:** `organizationId`, `organizationName`, `organizationAddress`, `organizationCity`, `organizationState`, `organizationPostalCode`, `organizationEmail`, `organizationPhone`, `organizationUrl`\n- **Location:** `locationCity`, `locationState`, `distanceMiles` (radius searches)\n- **Links and metadata:** `pictures[]`, `pictureThumbnailUrl`, `sourceUrl`, `adoptionUrl`, `recordType`, `scrapedAt`\n\nWith an optional API key the records can also include the API-only fields: `searchString`, `rescueId`, `ageString`, `birthDate`, `isBirthDateExact`, `sizeCurrent`, `colorDetails`, `adoptionFeeString`, `distinguishingMarks`, `specialNeedsDetails`, `qualities`, `summary`, `organizationIds`, `locationCountry`, and the full temperament set.\n\n## What you get per organization\n\n`organizationId`, `name`, `about`, `services`, `adoptionProcess`, `adoptionArea`, `address`, `city`, `state`, `postalcode`, `country`, `phone`, `email`, `url`, `facebookUrl`, `donationUrl`, `adoptionUrl`, `isCommonApplicationAccepted`, `sourceUrl`, `recordType`, `scrapedAt`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `search` | `search`, `byAnimalIds`, or `orgSearch` |\n| `apiKey` | secret | – | Optional free API key; adds API-only fields and org name search |\n| `species` | string | `Dog` | Full species list, or `(any species)` |\n| `breed` | string | – | Breed name, e.g. `Labrador Retriever` (matches any breed in the animal's breed string) |\n| `sex` | string | – | `(any)`, `Male`, `Female` |\n| `ageGroup` | string | – | `(any)`, `Baby`, `Young`, `Adult`, `Senior` |\n| `sizeGroup` | string | – | `(any)`, `Small`, `Medium`, `Large`, `X-Large` |\n| `specialNeedsOnly` | boolean | `false` | Only special-needs animals |\n| `goodWithDogsOnly` | boolean | `false` | Only animals flagged good with dogs |\n| `goodWithCatsOnly` | boolean | `false` | Only animals flagged good with cats |\n| `goodWithKidsOnly` | boolean | `false` | Only animals flagged good with kids |\n| `needsFosterOnly` | boolean | `false` | Only animals looking for a foster home |\n| `housetrainedOnly` | boolean | `false` | Only house-trained animals |\n| `declawedOnly` | boolean | `false` | Only declawed animals |\n| `postalCode` | string | – | ZIP/postal code for a radius search; empty searches everywhere |\n| `radiusMiles` | integer | `50` | Radius in miles (1–500; requests under 25 use 25, values between buckets round down, and requests above 200 use 200) |\n| `includeDetails` | boolean | `true` | Open each animal's detail page (richer, slightly slower) |\n| `animalIds` | array | `[]` | Animal IDs or page URLs for `mode=byAnimalIds` |\n| `organizationIds` | array | `[]` | Organization IDs for `mode=orgSearch` |\n| `orgQuery` | string | – | Organization name (needs the optional key) or a numeric ID / organization-page URL (keyless; legacy inputs supported) |\n| `maxItems` | integer | `50` | Hard cap on emitted records (1–2000) |\n\n### Example: dogs within 25 miles of Boston\n\n```json\n{\n  \"mode\": \"search\",\n  \"species\": \"Dog\",\n  \"postalCode\": \"02108\",\n  \"radiusMiles\": 25,\n  \"maxItems\": 50\n}\n```\n\n### Example: senior cats, good with kids\n\n```json\n{\n  \"mode\": \"search\",\n  \"species\": \"Cat\",\n  \"ageGroup\": \"Senior\",\n  \"goodWithKidsOnly\": true,\n  \"maxItems\": 30\n}\n```\n\n### Example: one breed, nationwide\n\n```json\n{\n  \"mode\": \"search\",\n  \"species\": \"Dog\",\n  \"breed\": \"Labrador Retriever\",\n  \"maxItems\": 100\n}\n```\n\n### Example: look up animals by ID\n\n```json\n{\n  \"mode\": \"byAnimalIds\",\n  \"animalIds\": [\"22514067\", \"22813117\"]\n}\n```\n\n### Example: fetch a rescue organization\n\n```json\n{\n  \"mode\": \"orgSearch\",\n  \"organizationIds\": [\"6260\"]\n}\n```\n\n## How it works\n\n- **Default, credential-free path.** The actor reads the public National Pet Search toolkit pages (`toolkit.rescuegroups.org`), the same pages RescueGroups.org serves to any website visitor. Search pages return 24 animals at a time; the actor paginates until `maxItems` or the result set ends. Each animal's public detail page supplies the profile, shelter contact, description and photos.\n- **Optional API path.** Paste a free RescueGroups.org public API key and the actor uses the official v5 JSON:API instead. It returns the same records plus API-only fields and supports organization name search. No key is required for any core mode.\n- **Filters are source-side.** Species, breed, sex, age, size, ZIP/radius, special-needs, foster, house-trained, declawed and good-with filters are applied by the source, not discarded afterwards.\n- **Pagination is honest.** The actor stops on `maxItems`, source exhaustion, or a short page — it never cuts a run short with a wall-clock timer.\n- **Empty values are omitted.** A field the source does not expose for a particular animal is left out, never sent as `null`, `\"\"`, `[]` or a placeholder.\n\n## FAQ\n\n**Do I need an API key?** No. The default path needs no key, account, cookie or proxy. The optional key is free and only adds fields and organization name search.\n\n**Why is the radius rounded?** The public search page offers 25, 50, 100 and 200 mile buckets. The actor picks the closest supported bucket: values between buckets round down, requests under 25 use the 25-mile minimum, and requests above 200 use the 200-mile maximum instead of widening to a nationwide search.\n\n**Why did a breed return nothing?** Breed names are shelter-entered. Use the exact name from the RescueGroups breed list, optionally prefixed with the species (`Dog: Labrador Retriever`).\n\n**Are all adoptable animals included?** The public search lists currently available animals. Most have photos, but a few listings show only a placeholder, so their `pictures` fields are omitted.\n\n**How fresh is the data?** Every run queries the live source.\n\n**Is this affiliated with RescueGroups.org?** No. This is an independent third-party actor using publicly available pages and, optionally, the public API.\n\n## Limitations\n\n- The public search exposes 25/50/100/200-mile radius buckets; the actor rounds down, using 25 for smaller requests and 200 for larger ones.\n- Age and size are single-choice filters on the public path (the source's own checkboxes support multiple values).\n- Breed matching is exact after case-folding and matches any breed in the animal's breed string (primary or secondary); near-miss spellings return a clear status message instead of wrong results.\n- Without an API key, organization lookup works by numeric ID only; organization name search needs the optional key.\n- The source is US/Canada focused; most listings have photos, but some have no public photo and omit the picture fields.\n- Some animals and organizations omit fields such as size, contact details, address or phone; those fields are absent from the record rather than guessed.\n",
      "input": {
        "title": "RescueGroups Scraper Input",
        "description": "Search adoptable pets by ZIP, radius, species, breed, age, sex and size, look up animals by ID, or fetch rescue organizations. Works without an API key; an optional free RescueGroups key adds API-only fields and organization name search.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to fetch: a pet search, specific animals by ID, or rescue organizations.",
            "editor": "select",
            "enum": [
              "search",
              "byAnimalIds",
              "orgSearch"
            ],
            "enumTitles": [
              "Search adoptable pets",
              "Look up animals by ID",
              "Look up rescue organizations"
            ],
            "default": "search",
            "prefill": "search"
          },
          "apiKey": {
            "title": "API key (optional)",
            "type": "string",
            "description": "Optional free public RescueGroups.org API key. Leave empty to use the cookieless public pet-search pages. A key adds API-only fields (adoption fee, energy level, exact birth date, and more) and organization name search.",
            "editor": "textfield",
            "isSecret": true
          },
          "species": {
            "title": "Species",
            "type": "string",
            "description": "Species filter (mode=search). Pick (any species) to search every species.",
            "editor": "select",
            "enum": [
              "",
              "Alpaca",
              "Bird",
              "Cat",
              "Chicken",
              "Chinchilla",
              "Cow",
              "Degu",
              "Dog",
              "Donkey",
              "Duck",
              "Ferret",
              "Fish",
              "Frog",
              "Gecko",
              "Gerbil",
              "Goat",
              "Goose",
              "Groundhog",
              "Guinea Pig",
              "Hamster",
              "Hedgehog",
              "Hermit Crab",
              "Horse",
              "Iguana",
              "Lizard",
              "Llama",
              "Mouse",
              "Otter",
              "Pig",
              "Pony",
              "Prairie Dog",
              "Rabbit",
              "Rat",
              "Sheep",
              "Skunk",
              "Snake",
              "Sugar Glider",
              "Tarantula",
              "Tortoise",
              "Turkey",
              "Turtle"
            ],
            "enumTitles": [
              "(any species)",
              "Alpaca",
              "Bird",
              "Cat",
              "Chicken",
              "Chinchilla",
              "Cow",
              "Degu",
              "Dog",
              "Donkey",
              "Duck",
              "Ferret",
              "Fish",
              "Frog",
              "Gecko",
              "Gerbil",
              "Goat",
              "Goose",
              "Groundhog",
              "Guinea Pig",
              "Hamster",
              "Hedgehog",
              "Hermit Crab",
              "Horse",
              "Iguana",
              "Lizard",
              "Llama",
              "Mouse",
              "Otter",
              "Pig",
              "Pony",
              "Prairie Dog",
              "Rabbit",
              "Rat",
              "Sheep",
              "Skunk",
              "Snake",
              "Sugar Glider",
              "Tarantula",
              "Tortoise",
              "Turkey",
              "Turtle"
            ],
            "default": "Dog",
            "prefill": "Dog"
          },
          "breed": {
            "title": "Breed",
            "type": "string",
            "description": "Breed name filter (mode=search), e.g. `Labrador Retriever`. The cookieless source matches any breed in the animal's breed string (primary or secondary); with an optional API key the primary breed is matched exactly.",
            "editor": "textfield"
          },
          "sex": {
            "title": "Sex",
            "type": "string",
            "description": "Sex filter (mode=search).",
            "editor": "select",
            "enum": [
              "",
              "Male",
              "Female"
            ],
            "enumTitles": [
              "(any)",
              "Male",
              "Female"
            ],
            "default": "",
            "prefill": ""
          },
          "ageGroup": {
            "title": "Age group",
            "type": "string",
            "description": "General age filter (mode=search).",
            "editor": "select",
            "enum": [
              "",
              "Baby",
              "Young",
              "Adult",
              "Senior"
            ],
            "enumTitles": [
              "(any)",
              "Baby",
              "Young",
              "Adult",
              "Senior"
            ],
            "default": "",
            "prefill": ""
          },
          "sizeGroup": {
            "title": "Size",
            "type": "string",
            "description": "Size filter (mode=search).",
            "editor": "select",
            "enum": [
              "",
              "Small",
              "Medium",
              "Large",
              "X-Large"
            ],
            "enumTitles": [
              "(any)",
              "Small",
              "Medium",
              "Large",
              "X-Large"
            ],
            "default": "",
            "prefill": ""
          },
          "specialNeedsOnly": {
            "title": "Special needs only",
            "type": "boolean",
            "description": "Only animals flagged as having special needs.",
            "default": false,
            "prefill": false
          },
          "goodWithDogsOnly": {
            "title": "Good with dogs only",
            "type": "boolean",
            "description": "Only animals flagged as good with dogs.",
            "default": false,
            "prefill": false
          },
          "goodWithCatsOnly": {
            "title": "Good with cats only",
            "type": "boolean",
            "description": "Only animals flagged as good with cats.",
            "default": false,
            "prefill": false
          },
          "goodWithKidsOnly": {
            "title": "Good with kids only",
            "type": "boolean",
            "description": "Only animals flagged as good with kids.",
            "default": false,
            "prefill": false
          },
          "needsFosterOnly": {
            "title": "Needs foster only",
            "type": "boolean",
            "description": "Only animals currently looking for a foster home.",
            "default": false,
            "prefill": false
          },
          "housetrainedOnly": {
            "title": "House-trained only",
            "type": "boolean",
            "description": "Only animals flagged as house-trained.",
            "default": false,
            "prefill": false
          },
          "declawedOnly": {
            "title": "Declawed only",
            "type": "boolean",
            "description": "Only animals flagged as declawed.",
            "default": false,
            "prefill": false
          },
          "postalCode": {
            "title": "ZIP / postal code",
            "type": "string",
            "description": "Center point for a radius search (mode=search). Leave empty to search everywhere.",
            "editor": "textfield",
            "prefill": "02108"
          },
          "radiusMiles": {
            "title": "Radius (miles)",
            "type": "integer",
            "description": "Search radius around the postal code (mode=search). The source supports 25, 50, 100 and 200 miles; requests under 25 use 25, values between buckets round down, and requests above 200 use 200.",
            "minimum": 1,
            "maximum": 500,
            "default": 50,
            "prefill": 25
          },
          "includeDetails": {
            "title": "Fetch full animal details",
            "type": "boolean",
            "description": "Open each animal's public detail page for shelter contact, description, photos and temperament flags. Turn off for a faster, lighter listing-only run. The optional API path always returns full details.",
            "default": true,
            "prefill": true
          },
          "animalIds": {
            "title": "Animal IDs (mode=byAnimalIds)",
            "type": "array",
            "description": "RescueGroups animal IDs or animal page URLs, e.g. `22514067`.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "organizationIds": {
            "title": "Organization IDs (mode=orgSearch)",
            "type": "array",
            "description": "RescueGroups organization IDs, e.g. `6260` (the number in a pet photo URL).",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "orgQuery": {
            "title": "Organization name or ID (mode=orgSearch)",
            "type": "string",
            "description": "Optional organization name filter. Name search needs the optional `apiKey`; a numeric ID or organization-page URL works without one (legacy `orgQuery` inputs are supported).",
            "editor": "textfield",
            "default": "",
            "prefill": ""
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Hard cap on emitted records.",
            "minimum": 1,
            "maximum": 2000,
            "default": 50,
            "prefill": 3
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "RescueGroups.org Adoptable Pet Finder by ZIP Output",
        "description": "Adoptable animals and rescue organizations from RescueGroups.org — species, breed, age, sex, size, temperament flags, photos, contact details and optional API-only fields such as adoption fee.",
        "properties": {
          "animals": {
            "type": "string",
            "title": "RescueGroups animals and organizations",
            "description": "Dataset containing every scraped adoptable animal and rescue organization.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Animals & organizations",
              "transformation": {
                "fields": [
                  "recordType",
                  "name",
                  "species",
                  "breedPrimary",
                  "ageGroup",
                  "sex",
                  "sizeGroup",
                  "organizationName",
                  "locationState",
                  "distanceMiles",
                  "sourceUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "64cdab900370bd40767102fbe5ac78a92558e83cd061d98a4756a118c264961d",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.016584444444444443
    }
  }
}