> **For coding agents and LLMs:** This is one Social Fetch marketing page (markdown export). For API orientation start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for auth and crawl rules use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for every operation use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt).

## This page

- **On-site (HTML):** <https://www.socialfetch.dev/platforms/dribbble/profiles-handle-shots>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/dribbble/profiles-handle-shots.mdx>

---

# Dribbble Shots API

A profile's shot tiles as JSON, with likes, views, dates and motion data, newest or popular.

`GET /v1/dribbble/profiles/{handle}/shots` returns up to 24 shot tiles per page in `data.shots`. Each tile has `id`, `slug`, `path`, `url`, `title`, `altText`, `thumbnailUrl`, `dominantColor`, `isMotion`, `isRebound`, `animatedUrl`, `videoUrl`, `hasAttachments`, `reboundCount`, `likesCount`, `viewsText`, `viewsEstimate`, `viewsApproximate` and `publishedAt`.

Set `sort=recent` (the default, pinned first then newest) or `sort=popular` for Dribbble's own popularity order. Page with `page` or with `cursor` from `data.page.nextCursor`, and stop when `data.page.hasMore` is false. A profile with no shots returns `lookupStatus: found` with an empty `shots` array. A page past the end of a profile is also a found page with an empty `shots` array. A tile without a metric returns null rather than a guessed number. `publishedAt` is null for a shot under a day old, where the tile shows only a relative time.

## Request

- **Endpoint:** `GET /v1/dribbble/profiles/{handle}/shots`
- **Credits:** 1 credit
Failed requests are free
- **Input:** by handle
- **Full reference:** [docs](https://www.socialfetch.dev/docs/api/v1/dribbble/profiles/handle/shots)
- **Platform page:** [/platforms/dribbble](https://www.socialfetch.dev/platforms/dribbble)

## FAQ

### What does a profile with no shots return?

A found response with an empty shots array and data.page.hasMore false. It is not an error and not a missing profile.

### Why is publishedAt null on a new shot?

A shot published in the last day shows only a relative time, so there is no dated value to return. Older shots carry a YYYY-MM-DD date.

### What is the difference between recent and popular?

sort=recent returns the profile's default order, with pinned shots first and then the newest. sort=popular returns Dribbble's popularity order. Both use the same tile fields.

### How do I page through all shots?

Request page 1, then keep the response's data.page.nextCursor and send it as cursor while data.page.hasMore is true. Pages stop at 100. A page past the end is found with an empty shots array.

### Why are likesCount or viewsText null on some tiles?

Dribbble does not show every metric on every tile. A value is null when the tile has none, and viewsApproximate is true when the displayed views were a rounded k or m value.

### How many credits does a shots page cost?

Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged: that field is the billing source of truth. Each paginated page is a separate billed request.
