API
Free. Search GIFs and reactions, get every file, and show who made each one.
curl "https://ohmagif.com/api/v1/search?q=side-eye&limit=1"
Credit
Show the creator's handle with each GIF and link it to creator.url. Every file already carries the credit along its bottom edge: do not crop it or cover it.
Files
Files are AVIF, served from i.ohmagif.com, and never change once published. Hotlink them. full is the largest: the original size, long side at most 1080 pixels, small ones scaled up to 320 wide. tiny is 320 pixels wide for grids, poster is a JPEG of the first frame for link previews. embed_url is a page for an iframe embed_width by embed_height: the GIF at its own size with a credit line under it, which takes the place of the credit strip.
Endpoints
GET /api/v1/search?q= | GIFs for text, a reaction or @handle |
GET /api/v1/trending | Most shared right now |
GET /api/v1/gifs/{id} | One GIF |
GET /api/v1/reactions | Every reaction with its top GIF |
GET /api/v1/tags/{slug} | GIFs for a tag or reaction |
GET /api/v1/creators/{handle} | A creator's profile |
GET /api/v1/creators/{handle}/gifs | A creator's GIFs, sort=shared or newest |
Lists take limit (1 to 50, default 25) and offset (up to 1000) and answer {"results": [...], "next": 25, "total": 1204}. next is the offset of the next page, or null. Search and lists take rating: g, pg or pg13, the highest you accept.
A GIF
{
"id": "7Kq2xVbN3p",
"title": "Side-eye from the back row",
"description": "A cat in the back row looks sideways at the camera.",
"url": "https://ohmagif.com/g/side-eye-from-the-back-row-7Kq2xVbN3p",
"embed_url": "https://ohmagif.com/embed/7Kq2xVbN3p",
"embed_width": 642, "embed_height": 514,
"created": "2026-11-02T14:03:11Z",
"width": 640, "height": 508, "duration": 2.4,
"rating": "g",
"tags": ["side-eye", "suspicious"],
"reaction": "side-eye",
"creator": {"handle": "mira", "name": "Mira Rautio", "url": "https://ohmagif.com/@mira"},
"files": {
"full": {"url": "https://i.ohmagif.com/g/7Kq2xVbN3p/3f9a1c2e/full.avif", "type": "image/avif", "width": 640, "height": 508, "bytes": 184210},
"tiny": {"url": "https://i.ohmagif.com/g/7Kq2xVbN3p/3f9a1c2e/tiny.avif", "type": "image/avif", "width": 320, "height": 266, "bytes": 61002},
"poster": {"url": "https://i.ohmagif.com/g/7Kq2xVbN3p/3f9a1c2e/poster.jpg", "type": "image/jpeg", "width": 640, "height": 508, "bytes": 40311}
}
}Keys and limits
No key is needed: 60 requests a minute per address. With a key, 600 a minute per key. Make one under Account and send it as Authorization: Bearer omg_.... Over the limit the answer is 429 with Retry-After.
Every endpoint above answers pages on any site, so it can be called from the browser. A key sent from a browser is visible to anyone using the page.
Errors
Errors answer {"error": "...", "code": "..."} with a 4xx or 5xx status.