imgpile API
Lade Bilder und Videos hoch, teile sie und verwalte sie per Programmierung.
https://imgpile.com/api/v1 — alle Endpoints
https://cdn.imgpile.com/api/v1/media — nur Dateiuploads (siehe unten)
Hol dir ein API-Token
Anmelden oder registrieren um ein API-Token zu erstellen.
Konzepte
imgpile hat zwei zentrale Objekte. Wenn du den Unterschied verstehst, sparst du Zeit.
Medien
Eine einzelne Datei (Bild oder Video). Hat eine direkte CDN-URL - ideal für Hotlinking, Einbettung oder Teilen.
Beitrag
Eine teilbare Seite mit einem oder mehreren Medien. Hat einen Titel, eine Beschreibung, Abstimmungen, Kommentare und Tags.
/media. Verwende urls.original aus der Antwort. Fertig.
/posts mit den Medien-IDs auf.
Schnellstart
Lade eine einzelne Datei hoch und erhalte eine direkte CDN-URL. Perfekt für ShareX, Discord-Bots oder jedes Skript, das einfach nur ein Bild hosten muss.
Hinweis: Uploads gehen an cdn.imgpile.com, nicht imgpile.com.
curl -X POST https://cdn.imgpile.com/api/v1/media \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "[email protected]"Antwort:
{
"message": "Media created successfully",
"media": {
"slug": "abc1234",
"type": "image/jpeg",
"urls": {
"original": "https://cdn.imgpile.com/f/abc1234.jpg",
...
}
}
}Lade mehrere Dateien hoch und gruppiere sie dann zu einem Beitrag mit Metadaten, Bewertung und Kommentaren.
1. Lade jede Datei hoch nach cdn.imgpile.com und behalte die zurückgegebene Media-ID:
curl -X POST https://cdn.imgpile.com/api/v1/media \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "[email protected]"
# Returns: { "media": { "id": 12345, ... } }2. Erstelle einen Beitrag mit diesen IDs:
curl -X POST https://imgpile.com/api/v1/posts \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"media_ids": [12345, 12346]}'
# Returns: { "post": { "slug": "xyz789", ... } }3. (Optional) Füge einen Titel und eine Beschreibung hinzu:
curl -X PATCH https://imgpile.com/api/v1/posts/xyz789 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "My post", "description": "Summer 2026"}'Dein Beitrag ist jetzt live unter https://imgpile.com/p/xyz789
Lade ein Bild aus dem Browser oder mit Node.js hoch:
const formData = new FormData();
formData.append('file', fileInput.files[0]);
const response = await fetch('https://cdn.imgpile.com/api/v1/media', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_TOKEN',
},
body: formData,
});
const { media } = await response.json();
console.log(media.urls.original); // https://cdn.imgpile.com/f/abc1234.jpgAuthentifizierung
Lese-Endpunkte (GET) sind öffentlich und erfordern keine Authentifizierung. Alle anderen Endpoints erfordern ein Bearer-Token.
curl https://imgpile.com/api/v1/postsFür authentifizierte Anfragen gib dein Token im Authorization Header an:
curl -H "Authorization: Bearer YOUR_TOKEN" https://cdn.imgpile.com/api/v1/media -F "[email protected]"Datei-Uploads-Ziel cdn.imgpile.com; siehe Medien -> Hochladen für Details.
Erstelle ein Token im Einführung Abschnitt oben.
Fehler
Die API gibt standardmäßige HTTP-Statuscodes zurück. Fehlerantworten enthalten einen JSON-Body mit einem message (oder error) Feld, das beschreibt, was schiefgelaufen ist.
Statuscodes
| Code | Bedeutung |
|---|---|
200 | OK — Anfrage erfolgreich |
201 | Created — Ressource wurde erstellt |
400 | Bad Request — fehlerhafte Anfrage |
401 | Unauthenticated — Token fehlt oder ist ungültig |
403 | Verboten — du hast keine Berechtigung für diese Aktion |
404 | Nicht gefunden — die Ressource existiert nicht |
422 | Validation failed — Request-Body hat ungültige Felder |
429 | Rate Limited — zu viele Anfragen, bitte langsamer |
451 | Nicht verfügbar aus rechtlichen Gründen — Datei hat einen gesperrten Hash getroffen |
500 | Server Error — bei uns ist etwas schiefgelaufen |
Beispiel für Fehlerantworten
401 Unauthenticated
{ "message": "Unauthenticated." }403 Forbidden
{ "message": "This action is unauthorized." }422 Validation failed
{
"message": "The file field is required.",
"errors": {
"file": ["The file field is required."]
}
}429 Rate limited
{ "message": "Too Many Attempts." }Prüfe den Retry-After Response-Header für die Sekunden, bis das Limit zurückgesetzt wird.
451 Verbotener Inhalt
{ "error": "This file is not allowed." }API-Paginierung
Endpunkte auflisten (GET /posts, GET /media) gibt paginierte Ergebnisse zurück. Die Standard-Seitengröße ist 10; du kannst bis zu 250 anfordern mit ?limit=N.
Verwende ?page=N um Seiten zu navigieren. Die Antwort enthält Paginierungs-Metadaten:
{
"data": [ ... ],
"links": {
"first": "https://imgpile.com/api/v1/posts?page=1",
"last": "https://imgpile.com/api/v1/posts?page=42",
"prev": null,
"next": "https://imgpile.com/api/v1/posts?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"to": 10,
"per_page": 10,
"total": 421,
"last_page": 42
}
}Wenn du iterierst, folge links.next bis es null, oder prüfe meta.current_page gegen meta.last_page.
Inhaltsfilterung
Standardmäßig listen Endpunkte (GET /posts, GET /media) nur sicheren Inhalt zurück (Moderationsstatus approved). Um auch Inhalte für Erwachsene einzuschließen (nsfw), übergeben ?nsfw=1:
curl https://imgpile.com/api/v1/posts?nsfw=1Verbotener Inhalt (rejected, d. h. Spam oder Missbrauch) wird nie an öffentliche Feed-Endpunkte zurückgegeben, unabhängig von der ?nsfw Kennzeichnung.
Jede Post- und Media-Antwort enthält ein moderation_status Feld, damit du in deinem Client markierte Elemente warnen, verpixeln oder ausblenden kannst:
{
"moderation_status": "approved" | "pending" | "nsfw" | "rejected",
...
}approved— sicher für alle Zielgruppen.pending— wartet auf automatisierte Moderation.nsfw— Inhalte für Erwachsene; nur von öffentlichen Endpunkten zurückgegeben, wenn?nsfw=1.rejected— Spam/Missbrauch; niemals an öffentliche Endpunkte zurückgegeben.
Ausgeblendete Posts sind über ihren Slug zugänglich, erscheinen aber nie in Feeds. Private Posts erfordern ein ?key=xxx Query-Parameter (der Besitzer kann das im Freigabelink des Beitrags finden).
Ratenbegrenzungen
- Öffentliche Anfragen (kein Token): 30 Anfragen/Minute pro IP
- Authentifizierte Anfragen: 120 Anfragen/Minute pro Benutzer
- Datei-Uploads: 1.000 Dateien/Tag pro Benutzer/IP
- Maximale Dateigröße: 100 MB
- Akzeptierte Typen: image/* und video/*
Rate-Limit-Header sind in jeder Antwort enthalten (X-RateLimit-Limit, X-RateLimit-Remaining).
Das Media-Objekt
Von Media-Endpunkten zurückgegeben und in Post-Antworten eingebettet.
| Feld | Typ | Beschreibung |
|---|---|---|
| slug | string | Eindeutiger 7-Zeichen-Identifier. Wird in URLs verwendet. |
| filename | string | Dateiname in der Speicherung (gleich wie Slug). |
| title | string|null | Vom Benutzer bereitgestellter Titel. |
| description | string|null | Vom Benutzer bereitgestellte Beschreibung. |
| type | string | MIME-Typ — z. B. image/jpeg, video/mp4. |
| width | integer | Pixelbreite. |
| height | integer | Pixelhöhe. |
| moderation_status | enum | Eines von approved, pending, nsfw, oder rejected. Sieh Inhaltsfilterung. |
| processed | boolean | false während die größenabhängigen Varianten erstellt werden; true wenn es bereit ist. |
| created_at | timestamp | ISO-8601-Zeitstempel. |
| urls | object | CDN-URLs in jeder verfügbaren Größe — siehe Direkte Bild-URLs. |
| user | object|null | Der Uploader (Benutzername, Avatar). Null bei Gast-Uploads. |
Das Post-Objekt
Ein teilbarer Container für ein oder mehrere Medienobjekte.
| Feld | Typ | Beschreibung |
|---|---|---|
| id | integer | Numerische ID. Verwende slug für URLs. |
| slug | string | Eindeutiger 7-Zeichen-Identifier. Wird in URLs verwendet. |
| title | string|null | Titel des Posts. |
| description | string|null | Beschreibung des Posts. |
| score | integer | Netto-Wertung (Upvotes minus Downvotes). |
| view_count | integer | Gesamtzahl der Seitenaufrufe. |
| media_count | integer | Anzahl der Medienobjekte in diesem Post. |
| moderation_status | enum | Eines von approved, pending, nsfw, oder rejected. Sieh Inhaltsfilterung. |
| isUpvotedByUser | boolean | Ob der authentifizierte Benutzer diesen Post upgevotet hat. |
| isDownvotedByUser | boolean | Ob der authentifizierte Benutzer diesen Post downgevotet hat. |
| created_at | timestamp | ISO-8601-Zeitstempel. |
| user | object|null | Der Autor (Benutzername, Avatar). Null bei Gast-Posts. |
| media | array | Array von Medienobjekte. Nur enthalten bei Einzel-Post-Anfragen. |
| first_media | object|null | Das erste Medium (Vorschau). Nur enthalten in Feed-Antworten. |
| Nur für den Besitzer bestimmte Felder (werden nur an den Besitzer des Beitrags zurückgegeben): | ||
| visibility | enum | public, hidden, oder private. |
| access_key | string|null | Erforderlich, um einen privaten Post zu sehen. Anhängen als ?key=xxx. |
Media-Endpunkte
Einzelne Dateien (Bilder oder Videos). Jedes Medium hat eine direkte CDN-URL, die du überall verlinken oder einbetten kannst.
Uploads senden an https://cdn.imgpile.com/api/v1/media — nicht imgpile.com. Dateien werden auf einer dedizierten Origin gespeichert; ein POST an den Haupt-Host wird fehlschlagen.
Alle anderen Endpoints verwenden imgpile.com/api/v1 wie gewohnt.
Lade ein Bild oder Video hoch. Sende als multipart/form-data.
| Parameter | Beschreibung |
|---|---|
| fileerforderlich | Die hochzuladende Datei. Max. 100 MB. Akzeptiert image/* und video/*. |
| post_idoptional | An einen bestehenden Post anhängen. |
curl -X POST https://cdn.imgpile.com/api/v1/media \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "[email protected]"{
"message": "Media created successfully",
"media": {
"slug": "abc1234",
"filename": "abc1234",
"type": "image/jpeg",
"width": 1920,
"height": 1080,
"moderation_status": "approved",
"urls": {
"original": "https://cdn.imgpile.com/f/abc1234.jpg",
...
}
}
}Medienobjekte mit Filterung und Pagination auflisten.
| Parameter | Beschreibung |
|---|---|
| tag | Nach Tag-Namen filtern |
| sort | latest (Standard) oder random |
| period | day, week, month, year, all |
| limit | Ergebnisse pro Seite (max. 250, Standard 10) |
| username | Nach Benutzernamen filtern |
| nsfw | Setze auf 1 um NSFW-Inhalte einzuschließen. Standard: nur SFW. |
curl https://imgpile.com/api/v1/media?limit=20{
"data": [
{
"slug": "abc1234",
"type": "image/jpeg",
"width": 1920,
"height": 1080,
"moderation_status": "approved",
"urls": { ... }
},
...
],
"links": { ... },
"meta": { "current_page": 1, "total": 421 }
}Ein einzelnes Medienobjekt anhand seines Slugs abrufen.
curl https://imgpile.com/api/v1/media/abc1234{
"data": {
"slug": "abc1234",
"type": "image/jpeg",
"width": 1920,
"height": 1080,
"moderation_status": "approved",
"urls": { ... }
}
}Medien aktualisieren, die du besitzt.
| Parameter | Beschreibung |
|---|---|
| title | Medientitel |
| description | Medienbeschreibung |
curl -X PATCH https://imgpile.com/api/v1/media/abc1234 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "New title"}'{
"message": "Media updated successfully"
}Medien löschen, die du besitzt.
curl -X DELETE https://imgpile.com/api/v1/media/abc1234 \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "Media deleted successfully."
}Post-Endpunkte
Teilbare Seiten, die ein oder mehrere Medienobjekte enthalten. Mit Titel, Beschreibung, Voting, Kommentaren und Tags.
Öffentliche Posts mit Filterung und Pagination auflisten.
| Parameter | Beschreibung |
|---|---|
| tag | Nach Tag-Namen filtern |
| sort | latest (Standard) oder random |
| period | day, week, month, year, all |
| limit | Ergebnisse pro Seite (max. 250, Standard 10) |
| username | Nach Benutzernamen filtern |
| nsfw | Setze auf 1 um NSFW-Inhalte einzuschließen. Standard: nur SFW. |
curl https://imgpile.com/api/v1/posts?sort=latest{
"data": [
{
"id": 30713,
"slug": "MSGhYqy",
"title": "Sunset photos",
"score": 12,
"view_count": 245,
"media_count": 3,
"moderation_status": "approved",
"user": { "username": "alice", ... },
"first_media": { ... }
},
...
]
}Rufe einen einzelnen Beitrag mit paginierten Medien ab.
| Parameter | Beschreibung |
|---|---|
| mediaPage | Seitennummer für Medien (Standard 1) |
| perPage | Medien pro Seite (Standard 10) |
| key | Erforderlich für private Beiträge. Der Besitzer kann das im Freigabelink finden. |
curl https://imgpile.com/api/v1/posts/MSGhYqy
# Private post with key:
curl "https://imgpile.com/api/v1/posts/xyz789?key=ab12cd34ef"{
"data": {
"id": 30713,
"slug": "MSGhYqy",
"title": "Sunset photos",
"description": "...",
"score": 12,
"view_count": 245,
"moderation_status": "approved",
"user": { "username": "alice", ... },
"media": [ ... ]
}
}Erstelle einen neuen Beitrag aus hochgeladenen Medien.
| Parameter | Beschreibung |
|---|---|
| media_idserforderlich | Array mit Medien-IDs, die im Beitrag enthalten sein sollen |
curl -X POST https://imgpile.com/api/v1/posts \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"media_ids": [12345, 12346]}'{
"message": "Post created successfully",
"post": {
"id": 30720,
"slug": "rtWJdHr"
}
}Aktualisiere einen Beitrag, der dir gehört.
| Parameter | Beschreibung |
|---|---|
| title | Beitragstitel (max. 255) |
| description | Beitragsbeschreibung |
| visibility | public, hidden, oder private. Einstellung für private generiert automatisch ein access_key. |
| is_nsfw | Boolesch. Markiere den Beitrag als Erwachseneninhalt, damit er hinter dem NSFW-Umschalter des Betrachters verborgen ist. Sobald gesetzt, wird der Beitrag nicht automatisch unter nsfw. |
| media_order | Array von Medien-Slugs in der gewünschten Reihenfolge |
curl -X PATCH https://imgpile.com/api/v1/posts/rtWJdHr \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Updated title", "visibility": "private"}'{
"message": "Post updated successfully",
"visibility": "private",
"access_key": "ab12cd34ef"
}Lösche einen Beitrag, der dir gehört.
curl -X DELETE https://imgpile.com/api/v1/posts/rtWJdHr \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "Post deleted successfully"
}Benutzer
Rufe die Beiträge eines Benutzers ab.
curl https://imgpile.com/api/v1/users/alice/posts{
"data": [
{
"id": 30713,
"slug": "MSGhYqy",
"title": "Sunset photos",
"score": 12,
"moderation_status": "approved",
"first_media": { ... }
},
...
]
}Rufe die Medien eines Benutzers ab.
curl https://imgpile.com/api/v1/users/alice/media{
"data": [
{
"slug": "abc1234",
"type": "image/jpeg",
"moderation_status": "approved",
"urls": { ... }
},
...
]
}Rufe die Kommentare eines Benutzers ab (paginierte Ausgabe).
curl https://imgpile.com/api/v1/users/alice/commentsRufe die Follower eines Benutzers ab (paginierte Ausgabe).
curl https://imgpile.com/api/v1/users/alice/followersRufe die Benutzer ab, denen dieser Benutzer folgt (paginierte Ausgabe).
curl https://imgpile.com/api/v1/users/alice/followingFolge einem Benutzer.
curl -X POST https://imgpile.com/api/v1/users/alice/follow \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "User followed."
}Entfolge einem Benutzer.
curl -X DELETE https://imgpile.com/api/v1/users/alice/follow \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "User unfollowed."
}Abstimmungen
Vote für einen Beitrag hoch. Ein erneuter Aufruf entfernt den Upvote.
curl -X POST https://imgpile.com/api/v1/posts/123/upvote \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "Post upvoted successfully",
"score": 13
}Vote für einen Beitrag runter. Ein erneuter Aufruf entfernt den Downvote.
curl -X POST https://imgpile.com/api/v1/posts/123/downvote \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "Post downvoted successfully",
"score": 11
}Vote für einen Kommentar hoch. Ein erneuter Aufruf entfernt den Upvote.
curl -X POST https://imgpile.com/api/v1/comments/456/upvote \
-H "Authorization: Bearer YOUR_TOKEN"Vote für einen Kommentar runter. Ein erneuter Aufruf entfernt den Downvote.
curl -X POST https://imgpile.com/api/v1/comments/456/downvote \
-H "Authorization: Bearer YOUR_TOKEN"Direkte Bild-URLs
Jede hochgeladene Datei wird über das CDN ausgeliefert. Die Medienantwort enthält ein urls Objekt mit allen verfügbaren Größen:
https://cdn.imgpile.com/f/{filename}.{ext} — Original
https://cdn.imgpile.com/f/{filename}_xs.{ext} — Extra small
https://cdn.imgpile.com/f/{filename}_sm.{ext} — Small
https://cdn.imgpile.com/f/{filename}_md.{ext} — Medium
https://cdn.imgpile.com/f/{filename}_lg.{ext} — Large
https://cdn.imgpile.com/f/{filename}_xl.{ext} — Extra large
https://cdn.imgpile.com/f/{filename}_thumb.jpg — Thumbnail (videos)
Kommentare
Füge einen Kommentar zu einem Beitrag hinzu.
curl -X POST https://imgpile.com/api/v1/posts/MSGhYqy/comments \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"content": "Nice shot!"}'{ "success": true, "comment": { "id": 456, "content": "Nice shot!", "user_id": 1, "post_id": 12345 } }Lösche einen Kommentar, der dir gehört.
curl -X DELETE https://imgpile.com/api/v1/comments/123 \ -H "Authorization: Bearer YOUR_TOKEN"{ "success": true, "message": "Comment deleted successfully" }