# Instagram Profile Download API

Export a public Instagram profile as a ZIP file with photos, reels, videos, captions, post metadata,
`manifest.json`, and `posts.csv`. Authenticated runs are recommended in async mode and
      pricing depends on your account. Standard pricing is 80 credits for up to 1,000 posts, plus 10 credits for each additional started 1,000 posts. Grandfathered accounts retain 40 credits plus 5 per additional 1,000 posts. Before the new pricing launches, all accounts retain the original rates.

  POST  `/v1/instagram/profile-download` 

Canonical execution route: `/v1/tasks/instagram-profile-download/runs`. For the live task contract,
      inspect `GET /v1/tasks/instagram-profile-download`.

Execution notes

- Use authenticated API access for full-profile exports.

- Async execution is recommended for large profiles.

- The task catalogue shows your account’s starting price. The final charge depends on the posts included in the ZIP.

- Set `maxPosts` to cap the export; omit it to attempt the full public profile.

- Marketing-site free exports are capped separately to the first 20 posts and do not use this API route.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| profile | string | Yes | Instagram username, @handle, or full profile URL. |
| maxPosts | number | No | Maximum number of posts to include. Omit to attempt the full public profile. |
| _run.async | boolean | No | Set to `true` to return immediately with a run envelope and poll later. |

## Response

```json
{
  "run_id": "00000000-0000-4000-8000-000000000001",
  "task_key": "instagram-profile-download",
  "task_name": "Instagram Profile Download",
  "run_status": "succeeded",
  "status_url": "/v1/runs/00000000-0000-4000-8000-000000000001",
  "result": {
    "success": true,
    "export_id": "054b71a5-9971-49ee-9470-2fe863901a44",
    "status": "completed",
    "file_name": "natgeo.zip",
    "download_url": "https://...",
    "download_url_expires_at": "2026-04-05T11:55:00.000Z",
    "expires_at": "2026-04-05T11:55:00.000Z",
    "truncated": false,
    "profile": {
      "id": "787132",
      "username": "natgeo",
      "full_name": "National Geographic",
      "is_private": false,
      "total_posts": 1000,
      "profile_pic_url": "https://..."
    },
    "result_summary": {
      "postsDiscovered": 84,
      "mediaDiscovered": 120,
      "estimatedBytes": 456789123,
      "downloadedFiles": 120,
      "failedFiles": 0,
      "skippedFiles": 0,
      "truncated": false
    }
  },
  "error": null
}
```

### Result Fields

`download_url` - Temporary signed ZIP URL.

`download_url_expires_at` - Expiry for the signed download URL.

`expires_at` - Export artifact retention expiry.

`truncated` - Whether the final ZIP is partial.

`result_summary` - Counts for posts, media, downloads, skips, and estimated bytes.

## Code Examples

```bash
curl -X POST "https://api-ingress-worker-staging.browsable-staging.workers.dev/v1/instagram/profile-download" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"profile":"natgeo","maxPosts":1000,"_run":{"async":true}}'
```

```python
import requests

response = requests.post(
    "https://api-ingress-worker-staging.browsable-staging.workers.dev/v1/instagram/profile-download",
    headers={
        "Authorization": "Bearer YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "profile": "natgeo",
        "maxPosts": 1000,
        "_run": {"async": True},
    },
)

payload = response.json()
print(payload["run_status"])
print(payload["status_url"])
```

```javascript
const response = await fetch("https://api-ingress-worker-staging.browsable-staging.workers.dev/v1/instagram/profile-download", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    profile: "natgeo",
    maxPosts: 1000,
    _run: { async: true },
  }),
});

const payload = await response.json();
console.log(payload.run_status);
console.log(payload.status_url);
```

## Try it Out

### API Playground

API Key

Stored locally only

profile * 

Instagram username or full profile URL

maxPosts

Maximum posts to include; omit for full profile

## Error Codes

400 Bad Request

The JSON body does not match the task input schema.

401 Unauthorized

Missing or invalid API key.

403 Forbidden

Your account cannot execute the task, usually because of access or credits.

429 / upstream throttling

Instagram may temporarily limit full-profile exports. Poll the run and inspect the final error or partial ZIP result.

---
Source: https://browsable-api-ux-staging.pages.dev/docs/api/instagram/profile-download
