SignalShelf · Developer documentation

Instagram posts & reels

Instagram post and reel metadata is available in sample mode. Live requests are disabled in production pending source authorization and review.

Request

POST /api/v1/posts · authenticate with the x-api-key header.

The reference GET /v1/instagram/post?url=... path is also available for public metadata. region and download_media=true return an unsupported-option error; permanent media downloads are not provided.

ParameterTypeRequiredDescription
urlstringOne of url / shortcodehttps://www.instagram.com/reel/<code>/, /p/<code>/, /reels/<code>/ or /tv/<code>/.
shortcodestringOne of url / shortcodeThe case-sensitive code from the URL, e.g. DePBA0SxalZ.
modestringNo"live" for real data, "demo" for a free labeled sample. Default "demo".
freshnessstringNoOldest cached result you accept: "1h", "24h" (default), "7d", or "live" to force a refresh.
REQUEST EXAMPLE
curl "$SIGNALSHELF_BASE_URL/api/v1/posts" \
-H "Content-Type: application/json" \
-H "x-api-key: $SIGNALSHELF_API_KEY" \
--data '{"url":"https://www.instagram.com/reel/Demo001/","mode":"demo"}'

Example response

Labeled sample fixture. Values are illustrative and do not describe a real creator.

EXAMPLE
{
  "data": {
    "platform": "instagram",
    "type": "reel",
    "shortcode": "Demo001",
    "url": "https://www.instagram.com/reel/Demo001/",
    "caption": "Illustrative sample reel for exploring SignalShelf. #sample",
    "hashtags": [
      "sample"
    ],
    "mentions": [],
    "taken_at": "2026-10-01T09:30:00.000Z",
    "likes": 4210,
    "comments": 87,
    "views": null,
    "duration_seconds": 21.4,
    "owner": {
      "username": "samplecreator",
      "name": "Sample creator"
    },
    "sample": true,
    "provider": "sample-fixture"
  },
  "meta": {
    "event_id": "sample",
    "mode": "demo",
    "cache": "SAMPLE",
    "credits_charged": 0,
    "fetched_at": null,
    "age_seconds": null,
    "duration_ms": 0
  }
}

Fields

FieldTypeDescription
typestringreel, video, image or carousel.
shortcodestringCase-sensitive post code.
idstringMedia ID.
urlstringCanonical post URL.
captionstring | nullFull caption text.
hashtagsarrayHashtags from the caption, lowercase, without #.
mentionsarray@mentions from the caption.
taken_atstringPublish time (ISO 8601).
likesnumber | nullLike count; null when the creator hid it.
commentsnumberComment count.
viewsnullInstagram does not show view counts to logged-out visitors.
duration_secondsnumber | nullVideo length.
width / heightnumberOriginal dimensions.
has_audiobooleanVideo has audio.
thumbnailstringCover image URL.
video_urlstring | nullMP4 URL. Signed by Instagram and expires after a few days; download promptly.
carouselarrayCarousel items { type, url }.
locationobject | nullTagged location { name, id, lat, lng }.
musicobject | nullTrack { title, artist, id }, or the original audio.
ownerobjectAuthor { id, username, name, avatar }.
coauthorsarrayCollaborator usernames.
like_counts_hiddenbooleanCreator hid like counts.
caption_editedbooleanCaption was edited.

Latency

Measured on 19–20 Oct 2026 through the API: fresh lookups median 1.2s (p95 1.5s); cached lookups median 1ms (p95 3ms). Browser fallback is limited to eligible parsing gaps or transient failures; access denials and rate limits stop without another request.

Errors

Every failure is free.

FieldTypeDescription
400 INVALID_POSTerrorNot an Instagram post/reel URL or shortcode.
404 PROFILE_NOT_FOUNDerrorThe post does not exist or was removed.
503 SOURCE_AUTH_REQUIREDerrorInstagram gated this post (age-restricted or private). Retry later.

Limitations

Stories and posts from private accounts are not available.

View and play counts are not public to logged-out visitors, so views is null.

Explore the API in your workspace. Sample results and accepted cache hits cost zero credits. Open the playground →