xeno-canto API

⭐ Beginner's Pick Animals / No Auth Required Beginner HTTPS
Free to Use Varies (check documentation)

Overview

xeno-canto is a community-built library of over 700,000 wild bird sound recordings from around the world. You can query by species name, country, or quality rating and get back metadata plus a direct audio file URL. It is ideal for nature apps, educational tools, or anyone learning to work with scientific data APIs.

💡

Beginner Tip

Search with a plain GET request like https://xeno-canto.org/api/2/recordings?query=owl — no API key needed. The recordings[].file field gives you a direct MP3 link you can play immediately.

Available Data

Use case: Integrate bird recordings data into web and mobile applications
xeno-canto data via REST API
JSON-formatted response data
Freely accessible without authentication

Example Response

JSON Response
{
  "name": "xeno-canto",
  "data": "xeno-canto-specific information and attributes",
  "source": "xeno-canto"
}

Field Reference

numRecordings Total number of recordings matching your query
numPages Total pages available; use the page parameter to paginate through results
recordings[].en English common name of the bird species
recordings[].file Direct URL to the MP3 audio recording
recordings[].cnt Country where the recording was made
recordings[].q Quality rating from A (best) to E (worst)

Implementation Example

// ⚠️ Note: This URL may be a documentation page. Check official docs for actual API endpoint.
const url = "https://xeno-canto.org/explore/api";
const response = await fetch(url);
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();
console.log(data);

What Can You Build?

Note: These code examples are AI-generated and unverified. Always refer to the official API documentation for accurate usage.

Common Errors & Troubleshooting

CORS blocked in browser xeno-canto does not advertise CORS support, so browser fetch calls may be rejected
Make requests from a backend Node.js or Python script rather than directly from browser JavaScript
numRecordings returns 0 Misspelled species name or no recordings exist for that region filter
Try the scientific name (e.g. "Strix aluco") for more reliable results than common names
Empty page response Requesting a page number beyond the total available pages
Read the numPages field in the first response and stay within that range when paginating

Matrix Score Breakdown

🌐 Reachability 30/30
⚡ Speed 15/20
🔒 Security 15/15
🛠 Developer XP 15/20
✓ Reliability 7/15
Response Time 320ms

Fully tested on Apr 5, 2026

Technical Specifications

Auth No Auth
HTTPS REQUIRED
CORS UNKNOWN
Category Animals
Difficulty Beginner
Verified: 2026-04-04

Similar APIs

View All →