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/trendingMost shared right now
GET /api/v1/gifs/{id}One GIF
GET /api/v1/reactionsEvery 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}/gifsA 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.