The PawPlacer public API gives you read and limited write access to public pet data so you can power listings, embeds, and partner workflows. Every request requires an API key created in Settings → API and must be issued from a trusted server-side environment.
Pick your integration path
- Use the official JavaScript SDK for typed helpers, caching, and retries.
- Synchronize adoptable pets to your website or mobile app directly via the public API.
- Embed filtered lists (featured pets, species-specific pages, adoption campaigns).
- Create new pet profiles from intake kiosks or partner systems.
- Populate forms with the same custom fields your staff uses internally.
- Run incremental sync jobs using
GET /api/pets?updated_since=....
Available Endpoints
| Endpoint | Description | Rate Limit |
|---|---|---|
GET /api/pets | Paginated list of public pets with filtering | 100/hr |
GET /api/pets/{petId} | Fetch a single public pet | 400/hr |
GET /api/pets/custom-fields | Available custom form fields | 15/hr |
POST /api/pets | Create a new pet record | 10/hr |
All endpoints respond with JSON. CORS is enabled so you can proxy requests through your own backend, but never expose your API key to untrusted clients.
Standard API Metadata
Every public pet endpoint includes:
X-Request-Idfor tracing support issuesX-Api-VersionandX-Generated-Atfor contract/timing visibilityX-RateLimit-*headers to expose current limit window state
OpenAPI 3.1 Contract
Use the official OpenAPI contract for language-agnostic integrations, Postman imports, and client generation:
- Spec URL:
https://pawplacer.com/openapi/public-api-v1.yaml
Authentication
Send your API key in the x-api-key header:
const response = await fetch('https://pawplacer.com/api/pets', {
headers: { 'x-api-key': process.env.PAWPLACER_API_KEY }
});
Missing keys return 401 with { "error": "API key required", "code": "api_key_required", "request_id": "..." }, and invalid keys return 401 with { "error": "Invalid API key", "code": "invalid_api_key", "request_id": "..." }.
Handling Rate Limits
The API enforces per-organization rate limits. When a limit is hit you receive 429 and a descriptive JSON error. Best practices:
- Cache responses for at least 5–10 minutes.
- Batch frontend requests through your server.
- Use background jobs to refresh data instead of polling from client devices.
Quick Start Workflow
- Generate an API key in Settings → API.
- Call
GET /api/petswith the key to render public listings. - Fetch
GET /api/pets/custom-fieldsto learn whichfield_keyvalues you can send. - Create a pet via
POST /api/petswhen you need to push new data into PawPlacer.
Example Requests
// List adoptable dogs
const listResponse = await fetch('https://pawplacer.com/api/pets?species=dog&status=available&limit=8', {
headers: { 'x-api-key': process.env.PAWPLACER_API_KEY }
});
const dogs = await listResponse.json();
// Fetch a single pet
const petResponse = await fetch(`https://pawplacer.com/api/pets/${dogs.pets[0].id}`, {
headers: { 'x-api-key': process.env.PAWPLACER_API_KEY }
});
const pet = await petResponse.json();
// Create a new pet
const createResponse = await fetch('https://pawplacer.com/api/pets', {
method: 'POST',
headers: {
'x-api-key': process.env.PAWPLACER_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Max',
species: 'dog',
age_category: 'young',
sex: 'male',
size: 'medium',
status: 'Available',
health: 'good',
show_public: true,
breed: ['Labrador Retriever'],
custom_field_data: {
favorite_toy: 'Tennis ball'
}
})
});
const created = await createResponse.json();
Security Checklist
- Keep API keys in environment variables or secret managers.
- Proxy requests through your own backend when serving public sites.
- Rotate keys immediately if you suspect they were exposed.
- Respect rate limits and handle error responses gracefully.
Next Steps
- Follow the detailed GET guide for response formats and error handling.
- Review the POST guide to understand required fields and validation.
- Visit Settings → API to regenerate or revoke keys when needed.