GifSnap Public API
Embed GIFs and stickers in your app, website, or mobile project. All media URLs are served directly from gifsnap.com — no Tenor, Giphy, or third-party brand links exposed to your users.
Overview
The GifSnap API aggregates GIFs from multiple sources (Giphy, Tenor, Klipy) and serves them through a unified interface. All media is proxied through gifsnap.com, so your users never see a Tenor or Giphy URL.
https://gifsnap.com/api/v1Quick Start
No API key needed. Pick a language and make your first request:
const res = await fetch(
"https://gifsnap.com/api/v1/gifs/search?q=funny+cats&page=1&limit=10"
);
const { data, pagination } = await res.json();
data.forEach(gif => {
const img = document.createElement("img");
img.src = gif.url; // gifsnap.com proxy URL
document.body.appendChild(img);
});Example response:
{
"data": [
{
"id": "giphy_abc123",
"title": "Funny Cats Compilation",
"url": "https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZWRpYS...",
"preview_url": "https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZWRpYS...",
"width": 480,
"height": 270,
"type": "gif",
"source": "giphy"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 84,
"has_next": true,
"next_page": 2,
"offset": 0
},
"query": "funny cats"
}Endpoints
All endpoints are GET requests that return JSON. No authentication required.
/api/v1/gifs/searchSearch for GIFs by keyword. Returns paginated results with gifsnap.com media URLs.
Query Parameters
q* | string | Search keyword (e.g. funny cats, dance, reactions) |
page | integer | Page number, starting from 1. Default: 1 |
limit | integer | Results per page. Default: 25, max: 50 |
const res = await fetch(
"https://gifsnap.com/api/v1/gifs/search?q=funny+cats&page=1&limit=10"
);
const { data, pagination } = await res.json();
data.forEach(gif => {
const img = document.createElement("img");
img.src = gif.url; // gifsnap.com proxy URL
document.body.appendChild(img);
});/api/v1/gifs/trendingFetch trending GIFs aggregated from multiple sources.
Query Parameters
page | integer | Page number, starting from 1. Default: 1 |
limit | integer | Results per page. Default: 25, max: 50 |
const res = await fetch(
"https://gifsnap.com/api/v1/gifs/trending?page=1&limit=25"
);
const { data, pagination } = await res.json();
console.log(`Got ${data.length} trending GIFs`);
// Load next page:
// fetch(`...trending?page=${pagination.next_page}`)/api/v1/gifs/{id}Get metadata for a single GIF by its ID. The ID is returned in search/trending results.
Path Parameters
id* | string | GIF ID from a previous search/trending result (e.g. giphy_abc123) |
const res = await fetch(
"https://gifsnap.com/api/v1/gifs/giphy_abc123"
);
const gif = await res.json();
console.log(gif.url); // https://gifsnap.com/api/v1/media/...Response:
{
"id": "giphy_abc123",
"title": "Funny Cats Compilation",
"url": "https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZWRpYS...",
"preview_url": "https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZWRpYS...",
"width": 480,
"height": 270,
"type": "gif",
"source": "giphy",
"created_at": "2025-03-22T10:00:00"
}/api/v1/stickers/searchSearch for animated stickers (transparent background GIFs) by keyword.
q* | string | Search keyword (e.g. love, happy, fire) |
page | integer | Page number. Default: 1 |
limit | integer | Results per page. Default: 25, max: 50 |
const res = await fetch(
"https://gifsnap.com/api/v1/stickers/search?q=love&page=1"
);
const { data } = await res.json();
// data[0].url points to gifsnap.com — no Giphy branding/api/v1/stickers/trendingFetch currently trending animated stickers.
page | integer | Page number. Default: 1 |
limit | integer | Results per page. Default: 25, max: 50 |
const res = await fetch("https://gifsnap.com/api/v1/stickers/trending");
const { data } = await res.json();/api/v1/media/{id}Serves the actual GIF/WebM/WebP file. All search and trending results return URLs pointing here — you don't need to call this directly.
url field directly in an <img> or <video> tag.<!-- Use the url field from API responses directly: -->
<img src="https://gifsnap.com/api/v1/media/aHR0cHM6Ly9tZW..." />
<!-- Response headers include:
Content-Type: image/gif (or video/webm, image/webp)
Cache-Control: public, max-age=31536000, immutable
Access-Control-Allow-Origin: *
-->/api/v1/statsReturns statistics about the GifSnap media library.
const res = await fetch("https://gifsnap.com/api/v1/stats");
const stats = await res.json();
console.log(`${stats.total_gifs} GIFs indexed`);Response:
{
"total_gifs": 12480,
"cached_gifs": 9341,
"unique_tags": 847,
"total_searches": 5203,
"estimated_storage_mb": 1121.0,
"status": "ok",
"api_version": "v1"
}Response Format
All list endpoints return a consistent JSON structure with a data array and a pagination object.
GIF Object
| Field | Type | Description |
|---|---|---|
id | string | Unique GIF identifier (e.g. giphy_abc123, klipy_456) |
title | string | Human-readable title for the GIF |
url | string | gifsnap.com proxy URL for the GIF/video file — use in <img> or <video> |
preview_url | string | Preview/thumbnail URL (also a gifsnap.com proxy URL) |
width | integer | Width in pixels |
height | integer | Height in pixels |
type | string | 'gif' or 'sticker' |
source | string | Original content source: 'giphy', 'tenor', or 'klipy' |
Pagination Object
| Field | Type | Description |
|---|---|---|
page | integer | Current page number |
limit | integer | Results per page |
total | integer | Total results available (approximate for live searches) |
has_next | boolean | Whether a next page is available |
next_page | integer | null | Next page number, or null if on the last page |
offset | integer | Zero-based offset of the first result on this page |
Pagination
Use the page and limit query parameters to paginate through results. The pagination.next_page field gives you the next page number, or null when you've reached the end.
async function* fetchAllGifs(query) {
let page = 1;
while (page) {
const res = await fetch(
`https://gifsnap.com/api/v1/gifs/search?q=${encodeURIComponent(query)}&page=${page}&limit=25`
);
const result = await res.json();
yield* result.data;
page = result.pagination.next_page;
}
}
// Usage:
for await (const gif of fetchAllGifs("cats")) {
console.log(gif.url);
}Rate Limits
The GifSnap API is currently free with no authentication required. There are no hard rate limits, but please be considerate:
- Cache API responses on your side to reduce redundant requests.
- Avoid polling the API in tight loops — use pagination instead.
- The media proxy (
/api/v1/media/...) caches aggressively — browsers and CDNs will cache media for up to 1 year.
For high-volume production use, cache responses in Redis or a CDN. The media URLs are immutable, so you can safely cache them indefinitely.
No sign-up, no API key. Just make a request.
