Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.snipp.gg/llms.txt

Use this file to discover all available pages before exploring further.

Upload between 1 and 9 files in a single request. Every upload automatically creates a post. When sending multiple files, they are grouped into an album by default.

Headers

HeaderRequiredDescription
relay-keyYesYour Relay key
post-privacyNopublic, unlisted, or private (default)
post-titleNoPost title, max 30 characters
post-descriptionNoPost description, max 200 characters
post-typeNoalbum (default) or individual. Only applies to two or more files.

Behavior

  • One file: creates a single post. post-type is ignored.
  • Two or more files, no header or album: creates one album post containing all files.
  • Two or more files, individual: creates a separate post for each file.
  • post-privacy: private: the returned url (and any urls in albums) is a signed URL with a 24-hour expiry. After it expires, call GET /posts/{code} or GET /uploads to get a fresh signed URL.
  • Video uploads: .mp4, .mov, and .mkv files are remuxed to MP4 with +faststart so the browser can begin playback before the full file has downloaded. .mov and .mkv uploads are stored (and returned) with an .mp4 extension. If remuxing fails, the original file is stored unchanged. See File Types for details.

Examples

Upload a single file:
curl -X POST "https://relay.snipp.gg/upload" \
  -H "relay-key: YOUR_RELAY_KEY" \
  -H "post-privacy: unlisted" \
  -H "post-title: my gaming POV" \
  -F "file=@screenshot.png"
Upload an album (two or more files default to album):
curl -X POST "https://relay.snipp.gg/upload" \
  -H "relay-key: YOUR_RELAY_KEY" \
  -H "post-privacy: public" \
  -H "post-title: Game Moderation Evidence" \
  -F "file=@photo1.png" \
  -F "file=@photo2.png" \
  -F "file=@photo3.png"
Upload multiple files as individual posts:
curl -X POST "https://relay.snipp.gg/upload" \
  -H "relay-key: YOUR_RELAY_KEY" \
  -H "post-type: individual" \
  -F "file=@image1.png" \
  -F "file=@image2.png"

Responses

Single file:
{
  "message": "Upload successful!",
  "url": "https://i.snipp.gg/123456789012345678/a1b2c3d4e5f6789012345678abcdef01.png",
  "file": {
    "size": 2487312,
    "size_formatted": "2.37 MB",
    "mime_type": "image/png",
    "dimensions": { "width": 1920, "height": 1080 }
  },
  "processing_time": 412,
  "post": {
    "code": "AbCd1234",
    "url": "https://snipp.gg/p/AbCd1234",
    "postPrivacy": "unlisted"
  }
}
Album (two or more files, default): one post containing every file.
{
  "message": "Upload successful!",
  "files": [
    {
      "index": 0,
      "url": "https://i.snipp.gg/123456789012345678/a1b2c3d4e5f6789012345678abcdef01.png",
      "size": 2487312,
      "size_formatted": "2.37 MB",
      "mime_type": "image/png",
      "status": "success",
      "dimensions": { "width": 1920, "height": 1080 }
    },
    {
      "index": 1,
      "url": "https://i.snipp.gg/123456789012345678/b2c3d4e5f6789012345678abcdef0102.png",
      "size": 1840221,
      "size_formatted": "1.76 MB",
      "mime_type": "image/png",
      "status": "success",
      "dimensions": { "width": 1280, "height": 720 }
    }
  ],
  "processing_time": 938,
  "post": {
    "posts": [
      {
        "code": "AbCd1234",
        "url": "https://snipp.gg/p/AbCd1234",
        "postPrivacy": "public"
      }
    ]
  }
}
Individual (post-type: individual): one entry in post.posts per file. If a file fails, a failed array is included alongside files.
{
  "message": "Upload successful!",
  "files": [
    {
      "index": 0,
      "url": "https://i.snipp.gg/123456789012345678/a1b2c3d4e5f6789012345678abcdef01.png",
      "size": 2487312,
      "size_formatted": "2.37 MB",
      "mime_type": "image/png",
      "status": "success"
    }
  ],
  "failed": [
    {
      "index": 1,
      "error": "Weekly quota exceeded",
      "status": "failed"
    }
  ],
  "processing_time": 938,
  "post": {
    "posts": [
      {
        "code": "AbCd1234",
        "url": "https://snipp.gg/p/AbCd1234",
        "postPrivacy": "public"
      }
    ]
  }
}