Petfinnly maintains a directory of real, currently operating cat and kitten shelters and rescue organizations across the United States, contact info, adoption details, and (where available) county-level demographic context. This API gives you programmatic access to that same data, free, with a rate limit generous enough for a real app.
No email verification, no card, and no expiration. One key per email, requesting again regenerates it.
Pass your key as an X-API-Key header on every request:
curl "https://petfinnly.com/api/v1/shelters" \ -H "X-API-Key: YOUR_API_KEY"For quick testing in a browser, a ?api_key=YOUR_API_KEY query parameter works the same way.
| Method & path | Description |
|---|---|
GET /api/v1/shelters | Paginated, filterable list of published shelters. |
GET /api/v1/shelters/{id} | A single shelter by its numeric id. |
GET /api/v1/shelters/{state}/{slug} | A single shelter by the same state/slug shown in its petfinnly.com URL. |
GET /api/v1/states | Every state with a published shelter count, alphabetical. |
GET /api/v1/shelters)| Param | Meaning |
|---|---|
state | Two-letter state code (CA) or state slug (california). |
city | Exact city match, case-insensitive. |
zip | Exact ZIP code match. |
q | Substring search on shelter name. |
claimed | true or false. |
featured | true or false. |
page | Defaults to 1. |
per_page | Defaults to 25, maximum 100. |
A single shelter, exactly what GET /api/v1/shelters/{id} and GET /api/v1/shelters/{state}/{slug} return, and the shape of each item inside a list response's data array:
{
"id": 3110,
"name": "1Love4Animals",
"slug": "1love4animals",
"url": "https://petfinnly.com/shelters/pennsylvania/1love4animals",
"state_code": "PA",
"state_name": "Pennsylvania",
"city": "Southeastern",
"address": "PO Box 1414, Southeastern, PA 19399",
"zip": "19399",
"phone": "610-405-1514",
"email": "billsmith4animals@gmail.com",
"website_url": "https://www.1love4animals.org",
"is_claimed": false,
"is_featured": false,
"updated_at": "2026-08-31T20:55:13Z"
}GET /api/v1/shelters wraps a page of these in an envelope:
{
"data": [ ... ],
"pagination": { "page": 1, "per_page": 25, "total": 1111, "total_pages": 45 }
}Fields left out of a given shelter (no confirmed phone, no matched county for demographics, and so on) are omitted rather than sent as an empty string or fabricated.
60 requests per minute per API key. Every response includes X-RateLimit-Limit and X-RateLimit-Remaining headers; going over returns a 429 with a Retry-After header telling you how many seconds to wait. Need a higher limit for a real project? Contact us.
Every /api/v1/ response allows cross-origin requests, so you can call this API directly from client-side JavaScript without a proxy.
This data is free to use in your own project, attribution to Petfinnly is appreciated but not required. Don't use it to spam the shelters and organizations listed here. Full details in our Terms & Conditions.