Přejít na obsah

REST API V2

Veřejné API

REST API zdarma nad vším, co tu hostujeme: vyhledávání, populární, kategorie, našeptávač a hlášení sdílení. Bez registrační zdi a bez placeného tarifu.

Tvar odpovědi přesně odpovídá starému v2 GIF API, kterému už umí rozumět velká část existujících klientů, a to včetně jeho zvláštností: flags je řetězec oddělený čárkami, created je desetinné číslo v unixových sekundách a formát, který nemáme, v media_formats úplně chybí, místo aby přišel jako null. Pokud tvoje aplikace 30. června 2026 přestala fungovat, celá migrace je většinou jen změna základní adresy.

Základní adresa
https://gifs.appmaxx.io/api/v2
Společný demo klíč
01

Rychlý start

Jeden request, žádná registrace. Společný demo klíč níž funguje hned a je omezený na 2 requesty za sekundu a 2000 za den.

curl "https://gifs.appmaxx.io/api/v2/search?q=excited+cat&limit=8&key=amxg_demokey0publicdemokeyforgifsappmaxxio000"
02

Autentizace

Klíč posílej buď jako parametr key, nebo jako hlavičku Authorization: Bearer. Klíč vypadá jako amxg_ a 40 znaků: prvních 8 je veřejný prefix, který klíč identifikuje, zbylých 32 je tajná část. Ukládáme jenom hash celého klíče, takže ztracený klíč nejde obnovit, jen vydat nový.

curl -H "Authorization: Bearer amxg_demokey0publicdemokeyforgifsappmaxxio000" \
  "https://gifs.appmaxx.io/api/v2/featured?limit=8"

Je veřejný záměrně. Hodí se na zkoušení a do příkladů, ne do aplikace s uživateli.

Pro vlastní klíč s reálnými limity napiš na ahoj@appmaxx.io jméno aplikace a přibližný počet requestů za den. Je to zdarma.

API nikdy nečte cookies a nepoužívá tvoje přihlášení. Právě proto se dá volat z jakékoli domény.

03

Limity

Platí dva limity: krátkodobý limit za sekundu a denní kvóta, která přežije restart. Každá úspěšná odpověď říká, jak na tom jsi.

Hlavička
Význam
X-RateLimit-Limit
Tvoje denní kvóta.
X-RateLimit-Remaining
Kolik requestů dnes ještě zbývá.
X-RateLimit-Reset
Unixový čas, kdy se kvóta obnoví, tedy o půlnoci UTC.
Retry-After
Posílá se jen s chybou 429. Počet sekund, než to zkusíš znovu.

Čtecí endpointy odpovídají s public, max-age=60, s-maxage=300, takže cache před tvojí aplikací tě nestojí nic z kvóty. registershare se necachuje nikdy.

04

Endpointy

GET /api/v2/categories

Prohlížitelné kategorie, každá s reprezentativním obrázkem. Klíč obálky je tags.

Vrací
tags[]
Parametry
type, contentfilter, locale, country, client_key
curl "https://gifs.appmaxx.io/api/v2/categories?type=featured&key=amxg_demokey0publicdemokeyforgifsappmaxxio000"
GET /api/v2/autocomplete

Doplňování rozepsaného dotazu, pro vyhledávací pole.

Vrací
results[] of string
Parametry
q, limit, locale, country, client_key
curl "https://gifs.appmaxx.io/api/v2/autocomplete?q=exc&limit=5&key=amxg_demokey0publicdemokeyforgifsappmaxxio000"
GET /api/v2/search_suggestions

Související výrazy k dotazu, který uživatel už dopsal, pro řádek štítků pod výsledky.

Vrací
results[] of string
Parametry
q, limit, locale, country, client_key
curl "https://gifs.appmaxx.io/api/v2/search_suggestions?q=cat&limit=5&key=amxg_demokey0publicdemokeyforgifsappmaxxio000"
GET /api/v2/posts

Dohledání id, která sis uložil, ve stejném pořadí, v jakém je pošleš. Id, která už neexistují, se přeskočí a dávka kvůli nim neselže.

Vrací
results[]
Parametry
ids, media_filter, client_key
curl "https://gifs.appmaxx.io/api/v2/posts?ids=1J8QK2M4KDR7&key=amxg_demokey0publicdemokeyforgifsappmaxxio000"
GET, POST /api/v2/registershare

Řekni nám, že uživatel GIF skutečně sdílel. Nic tě to nestojí a je to nejsilnější signál pro řazení, který máme, takže to prosím posílej.

Vrací
status
Parametry
id, q, locale, country, client_key
curl "https://gifs.appmaxx.io/api/v2/registershare?id=1J8QK2M4KDR7&q=excited+cat&key=amxg_demokey0publicdemokeyforgifsappmaxxio000"
05

Tvar odpovědi

Seznamové endpointy vracejí obálku s next a results. Hodnotu next pošli zpátky jako pos pro další stránku a skonči, až bude prázdný řetězec, který dostaneš místo null. Kurzory jsou podepsané a vázané na dotaz, který je vytvořil, takže kurzor použitý na jiný dotaz skončí čistou chybou 400, a ne stránkou nesouvisejících výsledků.

Dva endpointy se záměrně odchylují, protože stejně to dělalo i API, které nahrazujeme: categories vrací tags místo results a posts nevrací next vůbec.

Tři endpointy pro výrazy vracejí ploché pole řetězců, ne objekty odpovědi.

{
  "next": "eyJvIjo4LCJrIjpudWxsLCJwIjoxLCJoIjoiOTFmMiJ9.qN0m1c8Y",
  "results": [
    {
      "id": "1J8QK2M4KDR7",
      "title": "excited cat",
      "content_description": "orange cat vibrating with excitement",
      "media_formats": {
        "gif": {
          "url": "https://gifs.appmaxx.io/m/ab/cd/<hash>/gif.gif",
          "dims": [498, 372],
          "duration": 2.4,
          "size": 812344,
          "preview": "https://gifs.appmaxx.io/m/ab/cd/<hash>/preview.webp"
        },
        "tinygif": {
          "url": "https://gifs.appmaxx.io/m/ab/cd/<hash>/tinygif.gif",
          "dims": [220, 164],
          "duration": 2.4,
          "size": 98213,
          "preview": "https://gifs.appmaxx.io/m/ab/cd/<hash>/preview.webp"
        },
        "mp4": {
          "url": "https://gifs.appmaxx.io/m/ab/cd/<hash>/mp4.mp4",
          "dims": [498, 372],
          "duration": 2.4,
          "size": 141002,
          "preview": "https://gifs.appmaxx.io/m/ab/cd/<hash>/preview.webp"
        }
      },
      "created": 1785283200.0,
      "hasaudio": false,
      "hascaption": false,
      "flags": "",
      "bg_color": "#1e1e1e",
      "tags": ["cat", "excited"],
      "itemurl": "https://gifs.appmaxx.io/g/excited-cat-1J8QK2M4KDR7",
      "url": "https://gifs.appmaxx.io/g/1J8QK2M4KDR7"
    }
  ]
}

Objekt odpovědi

Pole
Typ
Význam
id
string
Neprůhledné id. Vrací se přes posts a registershare.
title
string
Krátký titulek. Může být prázdný.
content_description
string
Popis pro lidi, vhodný jako alt text.
media_formats
object
Varianty médií podle jména formátu.
created
float, unix seconds
Čas nahrání v unixových sekundách.
hasaudio
boolean
Jestli měl zdroj zvukovou stopu.
hascaption
boolean
Jestli je text vypálený do obrázku. Zatím vždy false.
flags
string, comma separated
Odděleno čárkami: prázdné, sticker, static nebo sticker,static.
bg_color
string
Dominantní barva, použitelná jako podklad před načtením.
tags
string[]
Tagy, malými písmeny.
itemurl
string
Adresa stránky se sdílením včetně čitelného slugu.
url
string
Krátká adresa stránky se sdílením.

Objekt media

url
string
Přímá adresa média. Jde hotlinkovat, je immutable a podporuje Range.
dims
[width, height]
Šířka a výška v pixelech.
duration
float, seconds
Délka v sekundách. 0 u statických.
size
integer, bytes
Velikost v bajtech.
preview
string
Statický obrázek k této variantě. Vždy řetězec.

Klíče formátů

  • gif
  • mediumgif
  • tinygif
  • nanogif
  • mp4
  • tinymp4
  • webm
  • webp
  • preview

Každý klíč níž je v media_formats tehdy, když danou variantu máme, a jinak tam není. Přes media_filter si vyžádej jen podmnožinu a odpovědi zůstanou malé.

06

Přehled parametrů

Parametr
Typ
Výchozí
Význam
key
string
required
Tvůj API klíč. Povinný na každém endpointu.
q
string
-
Hledaný dotaz.
id
string
-
Jedno id objektu odpovědi.
ids
string, comma separated, max 50
-
Id objektů odpovědi k dohledání, v pořadí.
limit
integer 1-50
20
Kolik výsledků vrátit.
pos
cursor from next
-
Hodnota next z předchozí odpovědi.
media_filter
comma separated, or minimal / basic
all
Které klíče formátů zahrnout. Bere i sady minimal a basic.
contentfilter
off | low | medium | high
off
Jak přísně filtrovat obsah. Obsah pro dospělé navíc vyžaduje klíč, který ho má povolený.
ar_range
all | wide | standard
all
Okno poměru stran. standard je 0.56 až 1.78, wide je 0.42 až 2.36.
random
boolean
false
Zamíchat výsledky místo řazení.
type
featured | trending | emoji
featured
Který seznam kategorií vrátit. Emoji kategorie nemáme, takže ten typ odpoví prázdným seznamem.
locale
xx or xx_YY
en_US
Preferovaná lokalizace. Přijímáme ji, zatím se ale projeví jen v cestách kategorií.
country
ISO 3166-1 alpha-2
-
Kód země. Přijímáme kvůli kompatibilitě.
client_key
string
-
Tvůj vlastní identifikátor volající aplikace. Přijímáme kvůli kompatibilitě.
07

Chyby

Chyby používají stejnou obálku jako API, které nahrazujeme, takže existující ošetření chyb funguje dál. Pole details je vždycky přítomné a vždycky prázdné.

HTTP
Status
Význam
400
INVALID_ARGUMENT
Parametr chybí, neznáme ho, nebo je mimo rozsah.
401
UNAUTHENTICATED
Nepřišel žádný klíč.
403
PERMISSION_DENIED
Klíč neznáme, je zneplatněný nebo má špatný formát.
404
NOT_FOUND
Objekt s tímto id neexistuje.
429
RESOURCE_EXHAUSTED
Vyčerpaný krátkodobý nebo denní limit. Viz Retry-After.
500
INTERNAL
Chyba na naší straně. Zkus to znovu s odstupem.
{
  "error": {
    "code": 429,
    "message": "Daily quota exceeded: 2000 requests per day",
    "status": "RESOURCE_EXHAUSTED",
    "details": []
  }
}
08

Migrace existujícího klienta

Nasměruj klienta na základní adresu výš a vyměň klíč. Jeden rozdíl je dobré znát: naše id jsou neprůhledné alfanumerické řetězce, ne čísla, takže kód, který id parsuje jako celé číslo, potřebuje opravit. Jména endpointů, parametrů a polí jsou jinak stejná, registershare včetně.

09

oEmbed

K dispozici je i oEmbed provider na /api/oembed pro všechno, co umí oEmbed, tedy třeba Slack, WordPress nebo Discourse. Adresu stránky se sdílením pošli jako url. Klíč nepotřebuje.