imgpile API
Upload, deel en beheer afbeeldingen en video's programmatisch.
https://imgpile.com/api/v1 — alle endpoints
https://cdn.imgpile.com/api/v1/media — alleen bestandsuploads (zie hieronder)
Haal een API-token op
Inloggen of registreren om een API-token te genereren.
Concepten
imgpile heeft twee kernobjecten. Als je het verschil begrijpt, bespaar je tijd.
Media
Eén bestand (afbeelding of video). Heeft een directe CDN-URL — ideaal voor hotlinking, inbedden of delen.
Bericht
Een deelbare pagina met één of meer media-items. Heeft een titel, beschrijving, stemmen, reacties en tags.
/media. Gebruik urls.original uit de response. Klaar.
/posts met de media-ID's.
Snel starten
Upload een enkel bestand en krijg een directe CDN-URL. Perfect voor ShareX, Discord-bots, of elke script die gewoon een afbeelding moet hosten.
Let op: uploads gaan naar cdn.imgpile.com, niet imgpile.com.
curl -X POST https://cdn.imgpile.com/api/v1/media \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "[email protected]"Reactie:
{
"message": "Media created successfully",
"media": {
"slug": "abc1234",
"type": "image/jpeg",
"urls": {
"original": "https://cdn.imgpile.com/f/abc1234.jpg",
...
}
}
}Upload meerdere bestanden en groepeer ze vervolgens in een post met metadata, stemmen en reacties.
1. Upload elk bestand naar cdn.imgpile.com en bewaar de teruggegeven 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. Maak een post met die ID's:
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. (Optioneel) Voeg een titel en beschrijving toe:
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"}'Je post is nu live op https://imgpile.com/p/xyz789
Upload een afbeelding vanuit een browser of Node.js:
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.jpgAuthenticatie
Lees-endpoints (GET) zijn publiek en vereisen geen authenticatie. Alle andere endpoints vereisen een bearer token.
curl https://imgpile.com/api/v1/postsVoor geauthenticeerde requests geef je je token door in de Authorization header:
curl -H "Authorization: Bearer YOUR_TOKEN" https://cdn.imgpile.com/api/v1/media -F "[email protected]"Bestandsuploads target cdn.imgpile.com; zie Media → Upload voor details.
Genereer een token in de Introductie sectie hierboven.
Fouten
De API geeft standaard HTTP-statuscodes terug. Foutmeldingen bevatten een JSON-body met een message (of error) veld dat beschrijft wat er misging.
Statuscodes
| Code | Betekenis |
|---|---|
200 | OK — request geslaagd |
201 | Gemaakt — resource is aangemaakt |
400 | Bad Request — onjuist gevormde request |
401 | Niet-geauthenticeerd — ontbrekend of ongeldig token |
403 | Verboden — je hebt geen toestemming voor deze actie |
404 | Niet gevonden — de resource bestaat niet |
422 | Validatie mislukt — request body heeft ongeldige velden |
429 | Rate limited — te veel requests, rustig aan |
451 | Niet beschikbaar om juridische redenen — bestand kwam overeen met een geblokkeerde hash |
500 | Serverfout — er ging iets mis aan onze kant |
Voorbeeld van foutreacties
401 Niet-geauthenticeerd
{ "message": "Unauthenticated." }403 Verboden
{ "message": "This action is unauthorized." }422 Validatie mislukt
{
"message": "The file field is required.",
"errors": {
"file": ["The file field is required."]
}
}429 Rate limited
{ "message": "Too Many Attempts." }Bekijk de Retry-After response-header voor het aantal seconden tot de limiet opnieuw wordt ingesteld.
451 Geblokkeerde content
{ "error": "This file is not allowed." }API-paginering
Endpoints weergeven (GET /posts, GET /media) geeft gepagineerde resultaten terug. De standaard paginagrootte is 10; je kunt tot 250 aanvragen met ?limit=N.
Gebruik ?page=N om door pagina's te navigeren. De response bevat pagineringmetadata:
{
"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
}
}Bij het doorlopen, volg links.next totdat het null, of controleer meta.current_page tegen meta.last_page.
Contentfiltering
Standaard worden endpoints weergegeven (GET /posts, GET /media) wordt alleen veilige content teruggegeven (moderatiestatus approved). Om ook volwassen content mee te nemen (nsfw), doorgeven ?nsfw=1:
curl https://imgpile.com/api/v1/posts?nsfw=1Geblokkeerde content (rejected, oftewel spam of misbruik) wordt nooit teruggegeven aan openbare feed-endpoints, ongeacht de ?nsfw flag.
Elke post- en mediaresponse bevat een moderation_status veld zodat je gemarkeerde items in je client kunt waarschuwen, vervagen of verbergen:
{
"moderation_status": "approved" | "pending" | "nsfw" | "rejected",
...
}approved— veilig voor alle doelgroepen.pending— in afwachting van geautomatiseerde moderatie.nsfw— volwassen content; alleen teruggegeven via openbare endpoints wanneer?nsfw=1.rejected— spam/misbruik; nooit teruggegeven aan openbare endpoints.
Verborgen posts zijn toegankelijk via hun slug, maar verschijnen nooit in feeds. Privéposts vereisen een ?key=xxx queryparameter (de eigenaar kan dit vinden in de deel-link van de post).
Snelheidslimieten
- Openbare requests (geen token): 30 requests/minuut per IP
- Geverifieerde requests: 120 requests/minuut per gebruiker
- Bestanduploads: 1.000 bestanden/dag per gebruiker/IP
- Maximale bestandsgrootte: 100 MB
- Geaccepteerde types: image/* en video/*
Rate-limit headers zijn opgenomen in elke response (X-RateLimit-Limit, X-RateLimit-Remaining).
Het Media-object
Wordt teruggegeven door media-endpoints en ingesloten in post-responses.
| Veld | Type | Beschrijving |
|---|---|---|
| slug | string | Unieke identificatie van 7 tekens. Gebruikt in URL's. |
| filename | string | Opslagbestandsnaam (zelfde als slug). |
| title | string|null | Door de gebruiker opgegeven titel. |
| description | string|null | Door de gebruiker opgegeven beschrijving. |
| type | string | MIME-type — bijv. image/jpeg, video/mp4. |
| width | integer | Pixelbreedte. |
| height | integer | Pixelhoogte. |
| moderation_status | enum | Een van approved, pending, nsfw, of rejected. Zie Contentfiltering. |
| processed | boolean | false terwijl er varianten met verschillende afmetingen worden gegenereerd; true wanneer het klaar is. |
| created_at | timestamp | ISO 8601-tijdstempel. |
| urls | object | CDN-URL's op elke beschikbare grootte — zie Directe afbeeldings-URL's. |
| user | object|null | De uploader (gebruikersnaam, avatar). Null voor uploads van gasten. |
Het Post-object
Een deelbare container voor één of meer media-items.
| Veld | Type | Beschrijving |
|---|---|---|
| id | integer | Numeriek ID. Gebruik slug voor URL's. |
| slug | string | Unieke identificatie van 7 tekens. Gebruikt in URL's. |
| title | string|null | Titel van de post. |
| description | string|null | Beschrijving van de post. |
| score | integer | Netto stemscore (upvotes min downvotes). |
| view_count | integer | Totaal aantal paginaviews. |
| media_count | integer | Aantal media-items in deze post. |
| moderation_status | enum | Een van approved, pending, nsfw, of rejected. Zie Contentfiltering. |
| isUpvotedByUser | boolean | Of de ingelogde gebruiker deze post heeft upgevoted. |
| isDownvotedByUser | boolean | Of de ingelogde gebruiker deze post heeft downgevoted. |
| created_at | timestamp | ISO 8601-tijdstempel. |
| user | object|null | De auteur (gebruikersnaam, avatar). Null voor posts van gasten. |
| media | array | Array van Media-objecten. Alleen inbegrepen bij requests voor één post. |
| first_media | object|null | Het eerste media-item (preview). Alleen inbegrepen in feed-responses. |
| Velden alleen voor de eigenaar (alleen teruggegeven aan de eigenaar van de post): | ||
| visibility | enum | public, hidden, of private. |
| access_key | string|null | Vereist om een private post te bekijken. Voeg toe als ?key=xxx. |
Media-endpoints
Afzonderlijke bestanden (afbeeldingen of video's). Elk media-item heeft een directe CDN-URL die je overal kunt hotlinken of inbedden.
Verstuur uploads naar https://cdn.imgpile.com/api/v1/media — niet imgpile.com. Bestanden worden opgeslagen op een speciale origin; POST'en naar de hoofdhost zal mislukken.
Alle andere endpoints gebruiken imgpile.com/api/v1 zoals gebruikelijk.
Upload een afbeelding of video. Verstuur als multipart/form-data.
| Parameter | Beschrijving |
|---|---|
| filevereist | Het te uploaden bestand. Maximaal 100 MB. Accepteert image/* en video/*. |
| post_idoptioneel | Koppel aan een bestaande post. |
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",
...
}
}
}Toon media-items met filtering en paginering.
| Parameter | Beschrijving |
|---|---|
| tag | Filter op tagnaam |
| sort | latest (standaard) of random |
| period | day, week, month, year, all |
| limit | Resultaten per pagina (max 250, standaard 10) |
| username | Filter op gebruikersnaam |
| nsfw | Zet op 1 om NSFW-content mee te nemen. Standaard: alleen 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 }
}Haal één media-item op op basis van de slug.
curl https://imgpile.com/api/v1/media/abc1234{
"data": {
"slug": "abc1234",
"type": "image/jpeg",
"width": 1920,
"height": 1080,
"moderation_status": "approved",
"urls": { ... }
}
}Werk media bij die je zelf bezit.
| Parameter | Beschrijving |
|---|---|
| title | Mediatitel |
| description | Media-beschrijving |
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"
}Verwijder media die je zelf bezit.
curl -X DELETE https://imgpile.com/api/v1/media/abc1234 \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "Media deleted successfully."
}Post-endpoints
Deelbare pagina's die één of meer media-items bevatten. Met een titel, beschrijving, stemmen, reacties en tags.
Toon openbare posts met filtering en paginering.
| Parameter | Beschrijving |
|---|---|
| tag | Filter op tagnaam |
| sort | latest (standaard) of random |
| period | day, week, month, year, all |
| limit | Resultaten per pagina (max 250, standaard 10) |
| username | Filter op gebruikersnaam |
| nsfw | Zet op 1 om NSFW-content mee te nemen. Standaard: alleen 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": { ... }
},
...
]
}Haal één post op met gepagineerde media.
| Parameter | Beschrijving |
|---|---|
| mediaPage | Paginanummer voor media (standaard 1) |
| perPage | Aantal media-items per pagina (standaard 10) |
| key | Verplicht voor privéposts. De eigenaar kan dit vinden in de deel-link. |
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": [ ... ]
}
}Maak een nieuwe post van geüploade media.
| Parameter | Beschrijving |
|---|---|
| media_idsvereist | Array van media-ID's om in de post op te nemen |
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"
}
}Werk een post bij die je zelf bezit.
| Parameter | Beschrijving |
|---|---|
| title | Posttitel (max 255) |
| description | Postbeschrijving |
| visibility | public, hidden, of private. Instelling voor private genereert automatisch een access_key. |
| is_nsfw | Boolean. Markeer de post als adult content zodat deze achter de NSFW-schakelaar van de kijker valt. Zodra dit is ingesteld, wordt de post niet automatisch opgelost onder nsfw. |
| media_order | Array van media-slugs in de gewenste volgorde |
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"
}Verwijder een post die je zelf bezit.
curl -X DELETE https://imgpile.com/api/v1/posts/rtWJdHr \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "Post deleted successfully"
}Gebruikers
Haal de posts van een gebruiker op.
curl https://imgpile.com/api/v1/users/alice/posts{
"data": [
{
"id": 30713,
"slug": "MSGhYqy",
"title": "Sunset photos",
"score": 12,
"moderation_status": "approved",
"first_media": { ... }
},
...
]
}Haal de media van een gebruiker op.
curl https://imgpile.com/api/v1/users/alice/media{
"data": [
{
"slug": "abc1234",
"type": "image/jpeg",
"moderation_status": "approved",
"urls": { ... }
},
...
]
}Haal de reacties van een gebruiker op (gepaginateerd).
curl https://imgpile.com/api/v1/users/alice/commentsHaal de volgers van een gebruiker op (gepaginateerd).
curl https://imgpile.com/api/v1/users/alice/followersHaal op welke gebruikers deze gebruiker volgt (gepaginateerd).
curl https://imgpile.com/api/v1/users/alice/followingVolg een gebruiker.
curl -X POST https://imgpile.com/api/v1/users/alice/follow \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "User followed."
}Stop met het volgen van een gebruiker.
curl -X DELETE https://imgpile.com/api/v1/users/alice/follow \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "User unfollowed."
}Stemmen
Geef een post een upvote. Nogmaals aanroepen verwijdert de upvote.
curl -X POST https://imgpile.com/api/v1/posts/123/upvote \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "Post upvoted successfully",
"score": 13
}Geef een post een downvote. Nogmaals aanroepen verwijdert de downvote.
curl -X POST https://imgpile.com/api/v1/posts/123/downvote \
-H "Authorization: Bearer YOUR_TOKEN"{
"message": "Post downvoted successfully",
"score": 11
}Geef een reactie een upvote. Nogmaals aanroepen verwijdert de upvote.
curl -X POST https://imgpile.com/api/v1/comments/456/upvote \
-H "Authorization: Bearer YOUR_TOKEN"Geef een reactie een downvote. Nogmaals aanroepen verwijdert de downvote.
curl -X POST https://imgpile.com/api/v1/comments/456/downvote \
-H "Authorization: Bearer YOUR_TOKEN"Directe afbeeldings-URL's
Elke geüploade bestands wordt via de CDN geleverd. De media-respons bevat een urls object met alle beschikbare formaten:
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)
Reacties
Voeg een reactie toe aan een post.
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 } }Verwijder een reactie die je zelf bezit.
curl -X DELETE https://imgpile.com/api/v1/comments/123 \ -H "Authorization: Bearer YOUR_TOKEN"{ "success": true, "message": "Comment deleted successfully" }