Giphy Scraper (keyless)
Pricing
from $1.00 / 1,000 results
Giphy Scraper (keyless)
No API key needed. Scrape Giphy's official API: search, trending, stickers, clips, emoji, translate, random, by-id, categories. Deep pagination, direct GIF/WebP/MP4 download, optional user API key override.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
subimpact
Maintained by CommunityActor stats
0
Bookmarked
34
Total users
16
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
Keyless Giphy Scraper
Scrape GIFs, stickers, clips and emoji from the official Giphy public API — no API key required.
How this compares
Both other actors in this lane list a lower per-result price, so the difference here is capability rather than price. This actor needs no API key: it reuses the public web-client key Giphy's own site embeds, and accepts your own key through the apiKey input if you have one. One actor covers search, trending, byIds, random, translate, categories and emoji modes, includes stickers and clips, and can save media to the key-value store, all over plain HTTP with no browser and no proxy. Price: $0.001 per result item ($1.00 per 1,000), plus $0.002 per media file when downloadMedia is on.
| Actor | Price per 1,000 results | Platform usage |
|---|---|---|
| subimpact/giphy-scraper | $1.00 | Included |
| parseforge/giphy-scraper | $0.14 | see listing |
| alizarin_refrigerator-owner/giphy-api | $0.01 plus $10.00 per 1,000 API calls | see listing |
Prices are Apify Store list prices on the Free plan, checked 24 October 2026. Competitor prices can change; check their listings.
Why keyless?
Giphy's public API officially requires a user API key: beta keys are rate-limited
(~100 calls/hour) and production keys need human review + paid pricing. This actor
reuses the same public web-client key that Giphy's own website embeds, so plain HTTP
calls work with no key, no browser, no proxy, no rate limiting. Users who have
their own key can override via the apiKey input (or GIPHY_API_KEY env var).
Modes
| mode | endpoint | input |
|---|---|---|
search | /v1/gifs/search (+ /v1/stickers/search, /v1/clips/search opt-in) | searchTerms[] |
trending | /v1/gifs/trending + /v1/stickers/trending | — |
byIds | /v1/gifs?ids= | gifIds[] |
random | /v1/gifs/random | randomTags[] |
translate | /v1/gifs/translate | translateText |
categories | /v1/gifs/categories | — |
emoji | /v1/emoji | — |
Search mode hits /v1/stickers/search for each term by default (includeStickers),
and /v1/clips/search when includeClips is on. Clips carry mp4_720 variants.
Note: limit applies per content type and stickers are included and charged
by default — with the default includeStickers: true and limit: 5 a run
delivers up to 5 GIFs plus 5 stickers (10 rows), each charged as a delivered
result-item.
Inputs
mode— endpoint to hit (defaultsearch)searchTerms[]— one API call per term (default["funny cat"])gifIds[],randomTags[],translateText— mode-specific payloadslimit— items to fetch per content type per term/call, hard-capped at 150 by the API (200+ returns empty). WithincludeStickers: true(the default) you get up tolimitGIF results and up tolimitsticker results, each charged as a delivered rowoffset— pagination start (deepPaginationwalksoffset += limituntil an empty page or offset ≥ 250, because Giphy deep pagination stops advancing around offset 250)maxItems— optional global safety cap on delivered rows across all terms and content types; 0 (default) = unlimitedrating(g/pg/pg-13/r),langdownloadMedia— download each file (GIF/WebP/MP4) into the run's default key-value store. The persistent artifact is thekvsUrl(https://api.apify.com/v2/key-value-stores/{storeId}/records/{key}) and the files also appear in the run's Key-Value Store in the Apify Console. Records also carrylocalFilePathfor backwards compatibility, but container local storage is ephemeral and is not accessible after a cloud run finishes (it only exists for local runs); usekvsUrldownloadFormat—preview(preview_gif),downsized,original(defaultpreview)maxDownloadSizeMb— skip files larger than this (checked againstimages[].size)
Output record
giphyId, gifType (gif/sticker/clip/emoji/category), url, gifTitle, altText, username,
userDisplayName, userVerified, userAvatarUrl, rating, source, tags[],
createDatetime, trendingDatetime, embedUrl, bitlyUrl,
variantUrls.{preview,downsized,original,mp4} (url + size + width + height; empty
variants kept as {url:""}), optional searchTerm, subcategories/gif in
categories mode, and kvsUrl when media download is enabled (localFilePath is
also set but only resolves inside a run container/local run — see above). An
uncharged status row with an error message is emitted when malformed
upstream results had to be dropped.
Robustness
- Results are streamed: each page is pushed to the dataset and charged in batches of ≤ 10 rows as it is delivered (with a final flush), so a timed-out run keeps what it collected — and only what is delivered is charged
- 20 s per-request timeout, up to 3 retries with exponential backoff on 5xx/429/network errors
- Hard stop with a clear error if the key is rejected twice (401/403) — suggests the
apiKeyinput in case Giphy rotates the embedded key - True empty results (HTTP 200 + empty
data) end as a legitimate empty run; upstream API errors (HTTP != 200 ormeta.status != 200) fail the run with a clear status message rather than being silently reported as a successful 0-row run - Malformed upstream records (missing id/url) are dropped uncharged and reported
via a
statusrow in the dataset - Non-200 media downloads are skipped without killing the run
Local development
python -m venv .venv && . .venv/bin/activatepip install -r requirements.txtpython -m pytest tests/ -v # live-network tests (real API, default key)apify push # push a new PRIVATE build