API Reference

Introduction

The ScrapingIsNotACrime API lets you retrieve public data from Instagram, TikTok, YouTube, and the Apple App Store via simple HTTP requests — X (Twitter) is coming soon. Every endpoint returns clean, typed JSON.

Base URLhttps://api.scrapingisnotacrime.com/v1
Public data only. Every endpoint targets publicly accessible content — profiles, posts, and metadata visible without logging in. We never bypass authentication or access private accounts.

Authentication

All requests must include your API key in the X-API-Key header. Get your key from the dashboard — no extra setup needed.

bashexample
curl "https://api.scrapingisnotacrime.com/v1/instagram/profile/cristiano" \
  -H "X-API-Key: sinac_your_api_key"
Keep it secret. Never expose your API key in client-side code or public repos. Rotate it from the dashboard immediately if compromised.

Credits

Every successful API response consumes exactly 1 credit. Failed requests (4xx / 5xx) are never charged. Credits never expire.

Credit usage is returned in every response:

responseevery endpoint
{
  "success": true,
  "data": "{ ... }",
  "credits_used": 1,
  "credits_remaining": 4823
}

Errors

The API uses standard HTTP status codes. Error responses always include a machine-readable error code and a human-readable hint.

error response
{
  "success": false,
  "error": "user_not_found",
  "hint": "No public profile found for username 'xyz123'. Check spelling.",
  "credits_used": 0
}
StatusError codeMeaning
200Success
400invalid_paramsMissing or malformed parameter
401invalid_keyAPI key missing or not recognized
402insufficient_creditsAccount has 0 credits remaining
404user_not_foundProfile or content not found on the platform
429rate_limitedToo many concurrent requests from this key
500internal_errorOur fault — retrying usually works
502platform_unavailableSource platform temporarily unreachable

Instagram

Access public Instagram profiles, contact blocks, timelines, posts, reels, and media download links. All endpoints target publicly visible content only.

GET/instagram/profile/{username}

Returns public profile metadata for any Instagram username — follower count, following, post count, bio, verification status, and business information.

Parameters

NameTypeInDescription
usernamestringpathInstagram username without @
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/instagram/profile/natgeo" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "username": "natgeo",
    "full_name": "National Geographic",
    "bio": "See the world through the eyes of National Geographic photographers.",
    "followers": 283400000,
    "following": 172,
    "posts": 28941,
    "verified": true,
    "profile_pic_url": "https://...",
    "external_url": "https://www.nationalgeographic.com",
    "is_business": true,
    "business_category": "Media/news company"
  },
  "credits_used": 1,
  "credits_remaining": 4822
}
GET/instagram/profile/{username}/contact

Returns the public contact block of a profile — the structured business email, phone, and address Instagram exposes, plus any email addresses and phone numbers written into the bio itself. Built from the same payload as the profile endpoint, so it costs no extra round trip to Instagram. A profile with no contact information returns 200 with the fields set to null.

Parameters

NameTypeInDescription
usernamestringpathInstagram username without @
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/instagram/profile/cafedaesquina/contact" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "username": "cafedaesquina",
    "full_name": "Café da Esquina",
    "biography": "☕ Pedidos: [email protected] | wa.me/5511999990000",
    "is_verified": false,
    "is_business": true,
    "category": "Coffee shop",
    "email": null,
    "phone": null,
    "external_url": "https://cafe.com.br",
    "address": {
      "street_address": "Rua X, 123",
      "zip_code": "01310-100",
      "city_name": "São Paulo",
      "region_name": "SP",
      "country_code": "BR"
    },
    "emails_found": [
      {
        "value": "[email protected]",
        "source": "biography"
      }
    ],
    "phones_found": [
      {
        "value": "+5511999990000",
        "source": "whatsapp_link"
      }
    ]
  },
  "credits_used": 1
}
GET/instagram/profile/{username}/timeline/latest

Returns up to 12 of the most recent public posts from a profile, with media URLs, captions, likes, comment counts, and timestamps.

Parameters

NameTypeInDescription
usernamestringpathInstagram username without @
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/instagram/profile/natgeo/timeline/latest" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "posts": [
      {
        "id": "3671234567890",
        "shortcode": "C8xQz1aP9Kv",
        "type": "image",
        "caption": "A lone wolf traverses the Yellowstone...",
        "likes": 482000,
        "comments": 3241,
        "media_url": "https://...",
        "timestamp": "2026-06-14T18:22:00Z"
      }
    ]
  },
  "credits_used": 1
}
GET/instagram/profile/{username}/timeline

Walks a profile's full post history page by page. Pass the previous response's next_cursor back as cursor to advance; has_more tells you when there is nothing left. Use this instead of /timeline/latest whenever you need more than the first page.

Parameters

NameTypeInDescription
usernamestringpathInstagram username without @
countintegerquery·optPosts per page, 1–50. Default 12. This is a request, not a guarantee — Instagram may return fewer.
cursorstringquery·optCursor from the previous response's next_cursor. Omit it to fetch the first page.
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/instagram/profile/nasa/timeline?count=12&cursor=3950671748375397992_528817151" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "medias": [
      {
        "id": "3957840214710558089",
        "shortcode": "DbtErSrlB2J",
        "type": "image",
        "caption": "A beautiful sunset 🌅",
        "likes": 12500,
        "comments": 150,
        "preview_comments": [],
        "location": null,
        "display_url": "https://...",
        "taken_at_timestamp": "2026-08-05 18:30:00 UTC"
      }
    ],
    "has_more": true,
    "next_cursor": "3943186559128294411_528817151"
  },
  "credits_used": 1
}
GET/instagram/profile/{username}/media/{mediaId}

Returns full details for a specific media item identified by its numeric ID, scoped to the profile. Includes media type, caption, engagement metrics, and media URLs.

Parameters

NameTypeInDescription
usernamestringpathInstagram username without @
mediaIdstringpathNumeric media ID (e.g. 3671234567890)
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/instagram/profile/natgeo/media/3671234567890" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "id": "3671234567890",
    "shortcode": "C8xQz1aP9Kv",
    "type": "image",
    "caption": "A lone wolf traverses the Yellowstone...",
    "likes": 482000,
    "comments": 3241,
    "media_url": "https://...",
    "thumbnail_url": "https://...",
    "timestamp": "2026-06-14T18:22:00Z",
    "owner": {
      "username": "natgeo"
    }
  },
  "credits_used": 1
}
GET/instagram/media/{shortcode}

Fetches a media item directly by its shortcode — the alphanumeric code found in Instagram post URLs. Supports single images, videos, and carousel/sidecar posts.

Parameters

NameTypeInDescription
shortcodestringpathPost shortcode (e.g. C8xQz1aP9Kv from instagram.com/p/C8xQz1aP9Kv/)
GET/instagram/media/{shortcode}/download

Returns a flat list of every downloadable asset behind a post, reel, or carousel — video files, images, and thumbnails — each with its resolution and expiry. The list is ordered so that assets[0] is always the best primary asset; on a carousel, every asset carries the index of the child it belongs to. The response holds Meta CDN links, not the bytes: fetch them directly from the CDN before expires_at. An existing post with no downloadable asset returns an empty assets array, not a 404.

Parameters

NameTypeInDescription
shortcodestringpathPost, reel, or carousel shortcode (e.g. DbtErSrlB2J)
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/instagram/media/DbtErSrlB2J/download" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "shortcode": "DbtErSrlB2J",
    "type": "video",
    "expires_at": "2026-08-08 07:51:36 UTC",
    "assets": [
      {
        "kind": "video",
        "index": 0,
        "url": "https://instagram.fxxx.fbcdn.net/o1/v/t2/f2/m86/video.mp4",
        "width": 720,
        "height": 1280,
        "quality": "101",
        "expires_at": "2026-08-08 07:51:36 UTC"
      },
      {
        "kind": "thumbnail",
        "index": 0,
        "url": "https://instagram.fxxx.fbcdn.net/v/t51/thumb.jpg",
        "width": 1080,
        "height": 1920,
        "quality": null,
        "expires_at": "2026-08-08 07:51:36 UTC"
      }
    ]
  },
  "credits_used": 1
}
GET/instagram/reels/{shortcode}

Returns reel-specific data by shortcode — video view count, play count, like and comment counts, audio/music attribution, and cover image URL.

Parameters

NameTypeInDescription
shortcodestringpathReel shortcode (e.g. DBxQz1aP9Kv from instagram.com/reels/DBxQz1aP9Kv/)
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/instagram/reels/DBxQz1aP9Kv" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "shortcode": "DBxQz1aP9Kv",
    "type": "video",
    "caption": "Golden hour in the Serengeti. #nature",
    "play_count": 8200000,
    "likes": 612000,
    "comments": 4871,
    "duration": 29.8,
    "cover_url": "https://...",
    "video_url": "https://...",
    "audio": {
      "title": "Original audio",
      "artist": "natgeo"
    },
    "timestamp": "2026-06-10T09:00:00Z"
  },
  "credits_used": 1
}

TikTok

Access public TikTok profiles and individual videos.

GET/tiktok/profile/{username}

Returns public profile metadata — follower count, total likes, video count, bio, verification status, and engagement rate.

Parameters

NameTypeInDescription
usernamestringpathTikTok username without @
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/tiktok/profile/natgeo" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "username": "natgeo",
    "nickname": "National Geographic",
    "followers": 3200000,
    "following": 84,
    "likes": 41200000,
    "videos": 612,
    "verified": true,
    "bio": "Experience the world through our lens.",
    "avatar_url": "https://..."
  },
  "credits_used": 1
}
GET/tiktok/video/{videoId}

Returns full details for a single public TikTok video — view/like/share/comment counts, duration, cover image, and audio information.

Parameters

NameTypeInDescription
videoIdstringpathTikTok numeric video ID

YouTube

List a channel's public videos by handle.

GET/youtube/channel/{handle}/videos

Returns the public videos published by a channel, identified by its @handle — title, video ID, thumbnail, publish date, and view count.

Parameters

NameTypeInDescription
handlestringpathChannel handle without @ (e.g. natgeo)
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/youtube/channel/natgeo/videos" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "videos": [
      {
        "video_id": "dQw4w9WgXcQ",
        "title": "Inside the Amazon rainforest",
        "thumbnail_url": "https://...",
        "published_at": "2026-06-20T14:00:00Z",
        "views": 1284000
      }
    ]
  },
  "credits_used": 1
}

App Store

Search public apps and read customer reviews from the Apple App Store.

GET/appstore/reviews

Returns customer reviews for a public app, sorted by most recent. Apple's own feed caps at 10 pages (roughly 500 reviews) — requesting further pages returns a 400.

Parameters

NameTypeInDescription
appIdstringquery·reqNumeric App Store app ID (the id field from a search result)
countrystringquery·opt2-letter country code (ISO 3166-1 alpha-2). Default us.
pageintegerquery·optReview page, 1–10. Default 1.
bashrequest
curl "https://api.scrapingisnotacrime.com/v1/appstore/reviews?appId=389801252&country=us&page=1" \
  -H "X-API-Key: sinac_••••••"
200 OKresponse
{
  "success": true,
  "data": {
    "appId": "389801252",
    "country": "us",
    "page": 1,
    "reviews": [
      {
        "id": "14288247378",
        "author": "exampleuser",
        "rating": 4,
        "title": "Great app overall",
        "content": "Does what it says, minor bugs here and there.",
        "version": "437.2.0",
        "updatedAt": "2026-07-10T18:19:36-07:00",
        "voteCount": 3,
        "voteSum": 2
      }
    ]
  },
  "credits_used": 1
}

X / Twitter

coming soon

Tweets, profiles, search, timelines, trends, and reply threads from public X accounts.

In development. These endpoints are not yet available. The paths shown below reflect the planned API contract — follow our blog to be notified when they ship.

We use privacy-respecting Google Analytics on our public pages only — never inside your dashboard — to understand traffic. It's off until you opt in, and you can change your mind anytime in the footer.