Developers

Web assets your coding agent can manage.

Connect Cursor, Claude Code, Codex, or any MCP client to DropIMG. Upload and replace images, SVGs, favicons, and web fonts without changing the URL in your application.

Recommended

MCP

Best for AI coding agents

https://dropimg.io/mcp

Connect MCP

REST

Web Assets API

Best for scripts and backend workflows

/api/v1/media

View examples

Drops

Temporary Drops API

Best for screenshots and short-lived links

/api/v1/images

View Drops API

5-minute quickstart

Sign in, create a Web Assets project, connect MCP, upload the first file, and paste the returned URL into the app. Temporary screenshot URLs still use the Drop API below.

  1. 1

    Sign in

    Create your DropIMG account.

  2. 2

    Create a Web Assets project

    Use a slug like website.

  3. 3

    Connect MCP

    https://dropimg.io/mcp

  4. 4

    Upload an asset

    Upload this logo as branding/logo.

  5. 5

    Use the stable URL

    https://dropimg.io/m/acme/site/branding/logo

Replace the asset later and the URL stays unchanged.

JSON
{
  "mcpServers": {
    "dropimg": {
      "url": "https://dropimg.io/mcp"
    }
  }
}

MCP

Recommended

Cursor and compatible MCP clients can authenticate through OAuth.

Endpoint
https://dropimg.io/mcp

Canonical endpoint: https://dropimg.io/mcp. Streamable HTTP. One server for Drops and Web Assets — not a second MCP process.

Projects

  • list_media_projects
  • create_media_project

Assets

  • list_media_assets
  • get_media_asset

Upload

  • upload_media_asset
  • replace_media_asset

Temporary Drops

  • upload_image
  • get_image
  • list_images
  • delete_image

Application code does not change.

Workflow
You:
Replace the homepage hero.

Agent:
✓ Found homepage/hero
✓ Requested replacement upload
✓ Uploaded new image
✓ Stable URL unchanged

https://dropimg.io/m/acme/site/homepage/hero

Add to Cursor

REST API

Create organization

REST create is a signed-in session. Prefer the dashboard or MCP create_media_project. Project keys cannot create projects.

cURL
curl -X POST https://dropimg.io/api/v1/media/orgs

Create project

cURL
curl -X POST https://dropimg.io/api/v1/media/orgs/$ORG_ID/projects \
  -H "Content-Type: application/json" \
  -d '{
    "slug": "website",
    "name": "website"
  }'

Request upload intent

POST file bytes to the returned intent.uploadUrl with intent.headers. Do not put bytes in JSON.

cURL
curl -X POST https://dropimg.io/api/v1/media/projects/$PROJECT_ID/intents \
  -H "Authorization: Bearer $DROPIMG_PROJECT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "operation": "create",
    "path": "branding/logo"
  }'
cURL
curl -X POST "$UPLOAD_URL" \
  -H "Authorization: Bearer $INTENT_TOKEN" \
  --data-binary @logo.png

Replace asset

Replacement preserves the stable alias. MIME may change.

cURL
curl -X POST https://dropimg.io/api/v1/media/projects/$PROJECT_ID/intents \
  -H "Authorization: Bearer $DROPIMG_PROJECT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "operation": "replace",
    "asset_id": "$ASSET_ID"
  }'

JavaScript

JavaScript
const intentRes = await fetch(
  `https://dropimg.io/api/v1/media/projects/${process.env.DROPIMG_PROJECT_ID}/intents`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.DROPIMG_PROJECT_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ operation: "create", path: "branding/logo" }),
  },
);
const { intent } = await intentRes.json();

const uploadRes = await fetch(intent.uploadUrl, {
  method: "POST",
  headers: intent.headers,
  body: logoBytes,
});
const { asset } = await uploadRes.json();
console.log(asset.url);

Python

Python
import os
import requests

headers = {
    "Authorization": f"Bearer {os.environ['DROPIMG_PROJECT_KEY']}",
    "Content-Type": "application/json",
}

intent = requests.post(
    f"https://dropimg.io/api/v1/media/projects/{os.environ['DROPIMG_PROJECT_ID']}/intents",
    headers=headers,
    json={"operation": "create", "path": "branding/logo"},
).json()["intent"]

asset = requests.post(
    intent["uploadUrl"],
    headers=intent["headers"],
    data=open("logo.png", "rb"),
).json()["asset"]
print(asset["url"])

Authentication

OAuth

MCP session

Cursor, MCP clients, humans

Account API key

dropimg_api_

Scripts, backend automation, multiple projects

Project key

dropimg_pk_

CI/CD, one project, scoped automation

Formats

Web Assets

  • JPEG
  • PNG
  • WebP
  • GIF
  • AVIF
  • SVG
  • ICO
  • WOFF
  • WOFF2

Drops

  • PNG
  • JPEG
  • WebP
  • GIF

Unsupported

  • PDF
  • Video
  • Audio
  • ZIP
  • HTML
  • JavaScript
  • CSS
  • Executables
  • TTF
  • OTF
  • EOT

Limits

Web Assets limits

Plan Projects Storage Deliveries Keys File
Free 3 1 GB 100K / month 2 10 MB
Developer 20 10 GB 2M / month 20 10 MB
Pro 100 100 GB 10M / month 100 10 MB

Drops limits

Plan File Expiry API / MCP
Drops Free 25 MB 1h · 24h · 7d · 30d 20 uploads / 50 MB per day
Drops Pro 25 MB (50 MB when enabled) plus 90d · 180d 100 uploads / 500 MB per day

Errors

JSON
{
  "error": "Plan allows 3 projects",
  "code": "quota_exceeded"
}
Code When
unauthorized Missing or invalid Bearer token.
forbidden Key is missing the required scope, or a project key tried to create a project.
quota_exceeded Plan limit reached — projects, storage, keys, or Drop API/MCP daily bucket.
unsupported_type Bytes are not an accepted Web Asset or Drop type.
not_found Org, project, asset, Drop, or intent does not exist.

API questions

Is this a Web Assets API?

Yes. The primary product is permanent Web Assets with stable /m/… URLs. The same /mcp endpoint also uploads temporary Drops. Drops expire; Web Assets stay until you replace or delete them.

Do I need an account?

Yes for MCP OAuth, REST, and Web Assets projects. Create an account API key (dropimg_api_…) on Integrations, or a project key (dropimg_pk_…) for one project. Anonymous uploads stay on the website and ShareX — not on the public REST API.

What can a project key do?

A dropimg_pk_… key is scoped to one project. It can list, upload, and replace assets in that project. Project keys cannot create projects.

Where is the OpenAPI spec?

https://dropimg.io/openapi/v1.yaml — Drops images plus Web Assets (orgs, projects, keys, assets, intents). Public /m/… aliases are not confidential.

Do Web Assets and Drops share quotas?

No. Web Assets plans cap projects, storage, keys, and monthly deliveries. Drops API/MCP share a separate daily bucket: Free 20 uploads / 50 MB, Drops Pro 100 / 500 MB. Site Drop uploads are not the same meter.