AMANDA.API
API REFERENCE

Endpoint Docs

All endpoints are serverless Edge functions on Vercel. Base URL: https://amandaland.vercel.app

Edge RuntimeCORS: *JSON responsesUpstash KVVercel Blob
GET/api/assets

Returns all public assets with metadata and platform defaults.

Parameters
NameTypeDefaultDescription
visibilitystringpublicFilter by visibility: public · private · partner · all (auth required for non-public)
categorystringnullFilter by category name e.g. Lifestyle, Sports, MapOfPi
partnerstringnullFilter by partner key e.g. mapofpi, wedding
Response
{
  "platform": {
    "name": "Amanda Photography",
    "baseUrl": "https://amandaland.vercel.app",
    "publicSite": "https://antcpu.com/manda"
  },
  "defaults": {
    "profile":   "https://...blob.../Portrait/profile.png",
    "banner":    "https://...blob.../Lifestyle/fall-banner.png",
    "thumbnail": "https://...blob.../Portrait/profile.png"
  },
  "count": 7,
  "assets": [
    {
      "id":           "e414d80c-...",
      "filename":     "shop.jpg",
      "category":     "MapOfPi",
      "visibility":   "public",
      "partner":      null,
      "status":       "draft",
      "cloudinaryId": "amandaland/MapOfPi/shop",
      "thumbnailUrl": "https://res.cloudinary.com/.../amandaland/MapOfPi/shop",
      "priceUsd":     null,
      "antcoin":      null,
      "meta":         "0.1 MB · image/jpeg",
      "uploadedAt":   "2026-07-22T02:08:25.736Z",
      "updatedAt":    "2026-07-22T17:48:16.122Z"
    }
  ],
  "_meta": { "filter": "public", "category": null }
}
GET/api/search

Search all assets by filename, title, category, or EXIF data.

Parameters
NameTypeDefaultDescription
qstring""Search query. Empty string returns all assets.
Response
{
  "query":   "",
  "count":   20,
  "results": [
    {
      "id":           "44c75ab1-...",
      "filename":     "fall-banner.png",
      "title":        "fall-banner",
      "category":     "Lifestyle",
      "status":       "draft",
      "blobUrl":      "https://...blob.../Lifestyle/fall-banner.png",
      "thumbnailUrl": "https://res.cloudinary.com/.../amandaland/Lifestyle/fall-banner",
      "meta":         "1.1 MB · image/png",
      "uploadedAt":   "2026-08-05T03:47:19.397Z"
    }
  ],
  "defaults": {
    "banner": "https://...blob.../Lifestyle/fall-banner.png"
  }
}
GET/api/stats

Returns platform health — Discord status, event count, last upload, top category.

Response
{
  "status": {
    "discordConnected": true,
    "totalEvents":      26,
    "topCategory":      "Food",
    "lastEvent": {
      "id":        "cdd5364a-...",
      "type":      "upload_complete",
      "label":     "upload complete",
      "meta": {
        "filename":   "fall-banner.png",
        "category":   "Lifestyle",
        "visibility": "private",
        "size":       "1.1 MB"
      },
      "timestamp": "2026-08-05T03:47:19.796Z"
    }
  },
  "recentEvents": [ ... ]
}
POST/api/chat

Amanda booking agent. Scripted conversation engine — no OpenAI dependency. Returns a warm reply based on intent matching.

Parameters
NameTypeDefaultDescription
messagestringrequiredUser message text
systemstringnullOptional system prompt override
Response
// Request:
{
  "message": "I want to book a portrait session"
}

// Response:
{
  "reply": "I'd love that! What type of session are you thinking — portrait, lifestyle, sports, events, or something else? 📸"
}
POST/api/upload🔐 auth required

Upload an image to Vercel Blob + Cloudinary. Stores metadata in Upstash KV. Fires Discord notification.

Parameters
NameTypeDefaultDescription
fileFilerequiredImage file — multipart/form-data
categorystringrequiredCategory name e.g. Lifestyle, Sports
visibilitystringprivatepublic · private · partner
partnerstringnullPartner key if visibility is partner
Response
{
  "success":  true,
  "asset": {
    "id":           "uuid-...",
    "filename":     "photo.jpg",
    "blobUrl":      "https://...blob.../photo.jpg",
    "cloudinaryId": "amandaland/Lifestyle/photo",
    "thumbnailUrl": "https://res.cloudinary.com/.../amandaland/Lifestyle/photo",
    "category":     "Lifestyle",
    "visibility":   "private",
    "uploadedAt":   "2026-08-05T..."
  }
}
PATCH/api/assets/:id🔐 auth required

Update asset visibility or partner assignment. Auth required.

Parameters
NameTypeDefaultDescription
visibilitystringrequiredpublic · private · partner
partnerstringnullPartner key — required when visibility is partner
Response
{
  "success": true,
  "updated": {
    "id":         "uuid-...",
    "visibility": "public",
    "releasedAt": "2026-08-05T..."
  }
}
DELETE/api/assets/:id🔐 auth required

Remove asset from KV store. Does not delete from Blob or Cloudinary.

Response
{
  "success": true,
  "removed": {
    "id":       "uuid-...",
    "filename": "photo.jpg"
  }
}
POST/api/notify🔐 auth required

Fire a Discord webhook notification. Used internally by upload and agent flows.

Parameters
NameTypeDefaultDescription
typestringrequiredEvent type e.g. upload_complete, booking_intent
messagestringrequiredNotification message body
metaobjectnullOptional metadata object
Response
{ "success": true, "eventId": "uuid-..." }