# Instagram Audio Scraper · Sounds, Music & Trending Reels (`memo23/instagram-audio-scraper`) Actor

Search Instagram's sound catalogue, or point at a reel and get the exact sound behind it — including the creator's own audio, which no keyword search can find. Each sound comes with artist, duration, cover art, a direct audio URL and its catalogue-wide reel count. No login.

- **URL**: https://apify.com/memo23/instagram-audio-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, AI, Automation
- **Stats:** 17 total users, 16 monthly users, 95.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 sounds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Instagram Audio Scraper

<img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/instagram-audio-logo.png" alt="Instagram Audio Scraper logo" width="96" align="right">

Search Instagram's sound catalogue, or point at a reel and get the exact sound behind it. Every sound comes with its artist, duration, cover art, a direct audio URL, and the number of reels using it across all of Instagram.

No login, no cookies, no browser.

### Why Use This Scraper?

- **Both directions.** Keyword search finds sounds by name. Post lookup goes the other way: give it a reel that is doing well and it names the sound driving it.
- **Original audio too.** A creator's own recording has no catalogue entry, so no keyword search will ever find it. Reading it off the post is the only way, and this actor does that.
- **A real trending number.** `totalReelsUsingSound` is Instagram's own catalogue-wide count, not how many reels this run happened to fetch. 43,904 reels means something; "we found 24" does not.
- **The reels, not just the sound.** Turn on expansion and each sound brings the reels actually using it, with play counts and creators, so you can see who picked it up and how it performed.

### How It Works

![How the Instagram Audio Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-instagram-audio.png)

Three input paths, mixable in one run:

1. **Search terms** query Instagram's sound catalogue and return matching tracks.
2. **Post or reel URLs** are resolved to their media and the sound is read off it — licensed track or the creator's own audio.
3. **Expansion**, when on, walks the reels using each sound found by either path.

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `queries` | array | One of the two | — | Words to search the sound catalogue for: a song title, an artist, a phrase. |
| `postUrls` | array | One of the two | — | Reels or posts whose sound you want named. |
| `maxSoundsPerQuery` | integer | No | unlimited | Cap on sounds per search term. |
| `includeReelsUsingSound` | boolean | No | `false` | Also return the reels using each sound, as `reel` rows. |
| `maxReelsPerSound` | integer | No | `24` | Cap on reels per sound when expansion is on. |

At least one of `queries` or `postUrls` must be given.

#### Example input

```json
{
    "queries": ["lofi"],
    "postUrls": ["https://www.instagram.com/reel/Dcy-7IJhWAP/"],
    "maxSoundsPerQuery": 10,
    "includeReelsUsingSound": true,
    "maxReelsPerSound": 24
}
```

### Output

Three row shapes in one dataset, told apart by `rowType`.

**`sound`** — a track matching a search term:

```json
{
    "rowType": "sound",
    "source": "lofi",
    "trackId": "1234567890",
    "audioClusterId": "9876543210",
    "title": "Cozy Day (Lofi)",
    "artist": "The Machinist Beats",
    "durationMs": 148000,
    "isExplicit": false,
    "isOriginalAudio": false,
    "coverArtworkUrl": "https://scontent.cdninstagram.com/...",
    "audioDownloadUrl": "https://scontent.cdninstagram.com/...",
    "totalReelsUsingSound": 43904,
    "scrapedAt": "2026-09-03T21:15:00.000Z"
}
```

**`post-sound`** — the sound behind a post you supplied. `isOriginalAudio: true` means the creator's own recording, and `artist` is then their handle.

**`reel`** — a reel using one of the sounds, carrying `reelUrl`, `reelCaption`, `playCount`, `likeCount`, `commentCount`, `videoUrl`, `creatorUsername`, `creatorIsVerified`, plus `soundTrackId` and `soundTitle` so it can be grouped back to its sound.

#### Key fields

| Field | What it is |
|---|---|
| `totalReelsUsingSound` | Instagram's catalogue-wide count of reels using this sound. Filled only when expansion is on, because that is the only route that returns it. |
| `isOriginalAudio` | `true` for a creator's own recording, `false` for a licensed catalogue track. |
| `audioDownloadUrl` | A direct link to the audio file. An Instagram CDN URL, so it expires. |

#### Error rows

An input the run could not answer for comes back as `{ source, error, message }` and is never charged:

| `error` | Meaning |
|---|---|
| `invalid_post_url` | The input is not a post or reel URL. |
| `post_unavailable` | The post is private, deleted, or age-restricted. |
| `no_sound` | The post carries no sound. Photos and carousels never do, and some videos are silent. |

### Pricing

Pay per event. Posts that carry no sound, and URLs that are not posts, are never charged.

| Event | When it fires | Free tier | Diamond tier |
|---|---|---|---|
| Sound | One sound, from a search term or from a post you supplied | $0.004 | $0.0028 |
| Reel using the sound | One reel, only when expansion is on | $0.0015 | $0.001 |
| Actor start | Once per run, per GB of memory | $0.005 | $0.005 |

A 1,000-sound run costs about $4 on the free tier. Reels are billed separately because they are opt-in.

### What Makes This Richer Than the Competition

| Capability | Other audio scrapers | This actor |
|---|---|---|
| Search the sound catalogue | Yes | Yes |
| Artist, duration, cover art, audio URL | Yes | Yes |
| Name the sound behind a given reel | No | Yes, via `postUrls` |
| A creator's own audio | Unreachable by search | Identified, with the creator as the artist |
| Catalogue-wide reel count | No | `totalReelsUsingSound` |
| The reels using each sound | Partial | Opt-in, with plays, likes and creator |
| Search terms and post URLs in one run | No | Yes |

The post-to-sound direction is the one a keyword search cannot serve. A reel using a creator's own recording has no catalogue entry, so no amount of searching will ever find it — reading it off the post is the only route.

### Notes & Limitations

- `totalReelsUsingSound` is null unless `includeReelsUsingSound` is on. The count comes back on the reels route and nowhere else, so asking for it without asking for the reels is not possible.
- `audioDownloadUrl`, `coverArtworkUrl` and `videoUrl` are Instagram CDN links and expire. Download what you need during or shortly after the run.
- Original audio is identified by the creator who recorded it. It has no catalogue entry and cannot be found by searching.

### FAQ

**Can I find which sound a specific reel uses?**

Yes — that is what `postUrls` is for, and it is the only way to identify a creator's own audio.

**Does it download the audio file?**

It returns a direct URL to it. The URL is an Instagram CDN link that expires, so fetch it promptly.

**Why is `totalReelsUsingSound` empty?**

Because expansion was off. Instagram returns that count on the reels route, so it arrives only when the reels are being fetched.

### 🤖 For AI Agents & LLM Apps

**Input:** `{ "queries": ["lofi"], "postUrls": ["https://www.instagram.com/reel/ABC123/"], "includeReelsUsingSound": true }`

**Output:** rows discriminated by `rowType` — `sound`, `post-sound`, `reel`. Sound rows carry `trackId`, `audioClusterId`, `title`, `artist`, `durationMs`, `isExplicit`, `isOriginalAudio`, `coverArtworkUrl`, `audioDownloadUrl`, `totalReelsUsingSound`. Post-sound rows add `postUrl`, `postShortCode`, `postAuthor`. Reel rows carry `reelId`, `reelUrl`, `reelCaption`, `playCount`, `likeCount`, `commentCount`, `videoUrl`, `creatorUsername`, `creatorFullName`, `creatorIsVerified`, `soundTrackId`, `soundTitle`. Failures return `{ source, error, message }`.

**Notes for agents:** branch on `rowType` before reading fields; `totalReelsUsingSound` is null unless expansion ran; media and audio URLs expire.

### ⚠️ Disclaimer

This scraper collects only data Instagram publishes publicly, without logging in and without accessing private content. Audio files remain the property of their rights holders — returning a URL is not a licence to reuse the recording. Use this in line with Instagram's terms, with copyright law, and with the data-protection law that applies to you.

### SEO Keywords

instagram audio scraper, instagram sound scraper, instagram music scraper, what sound does this reel use, instagram trending sounds, instagram reel audio finder, instagram original audio, instagram sound analytics, reels using a sound, instagram audio download url

# Actor input Schema

## `queries` (type: `array`):

Words to search Instagram's sound catalogue for — a song title, an artist, or a phrase. Leave empty if you only want the sounds behind specific posts.

## `postUrls` (type: `array`):

Reels or posts whose sound you want named. This is the direction a keyword search cannot answer, and it is the only way to identify a creator's own audio, which has no catalogue entry.

## `maxSoundsPerQuery` (type: `integer`):

Cap on sounds returned per search term. Instagram's catalogue returns about 10 per term, so a cap above that changes nothing. Whole number, e.g. 5. Leave empty to take everything the catalogue returns.

## `includeReelsUsingSound` (type: `boolean`):

For every sound found, add the reels actually using it, as separate rows with rowType "reel". This is how you see which creators picked a sound up and how those reels performed.

## `maxReelsPerSound` (type: `integer`):

Cap on how many reels are collected per sound when "Also return the reels using each sound" is on. Ignored otherwise. Whole number, e.g. 24. Defaults to 24.

## Actor input object example

```json
{
  "queries": [
    "coffee",
    "lofi"
  ],
  "postUrls": [],
  "includeReelsUsingSound": false,
  "maxReelsPerSound": 24
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "coffee",
        "lofi"
    ],
    "postUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/instagram-audio-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": [
        "coffee",
        "lofi",
    ],
    "postUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/instagram-audio-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "coffee",
    "lofi"
  ],
  "postUrls": []
}' |
apify call memo23/instagram-audio-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/instagram-audio-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/a7hQJJpo1MrquHy6k/builds/lBjsJ5ukNzePHdzZb/openapi.json
