All endpoints are serverless Edge functions on Vercel. Base URL: https://amandaland.vercel.app
/api/assetsReturns all public assets with metadata and platform defaults.
| Name | Type | Default | Description |
|---|---|---|---|
visibility | string | public | Filter by visibility: public · private · partner · all (auth required for non-public) |
category | string | null | Filter by category name e.g. Lifestyle, Sports, MapOfPi |
partner | string | null | Filter by partner key e.g. mapofpi, wedding |
{
"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 }
}/api/searchSearch all assets by filename, title, category, or EXIF data.
| Name | Type | Default | Description |
|---|---|---|---|
q | string | "" | Search query. Empty string returns all assets. |
{
"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"
}
}/api/statsReturns platform health — Discord status, event count, last upload, top category.
{
"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": [ ... ]
}/api/chatAmanda booking agent. Scripted conversation engine — no OpenAI dependency. Returns a warm reply based on intent matching.
| Name | Type | Default | Description |
|---|---|---|---|
message | string | required | User message text |
system | string | null | Optional system prompt override |
// 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? 📸"
}/api/upload🔐 auth requiredUpload an image to Vercel Blob + Cloudinary. Stores metadata in Upstash KV. Fires Discord notification.
| Name | Type | Default | Description |
|---|---|---|---|
file | File | required | Image file — multipart/form-data |
category | string | required | Category name e.g. Lifestyle, Sports |
visibility | string | private | public · private · partner |
partner | string | null | Partner key if visibility is partner |
{
"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..."
}
}/api/assets/:id🔐 auth requiredUpdate asset visibility or partner assignment. Auth required.
| Name | Type | Default | Description |
|---|---|---|---|
visibility | string | required | public · private · partner |
partner | string | null | Partner key — required when visibility is partner |
{
"success": true,
"updated": {
"id": "uuid-...",
"visibility": "public",
"releasedAt": "2026-08-05T..."
}
}/api/assets/:id🔐 auth requiredRemove asset from KV store. Does not delete from Blob or Cloudinary.
{
"success": true,
"removed": {
"id": "uuid-...",
"filename": "photo.jpg"
}
}/api/notify🔐 auth requiredFire a Discord webhook notification. Used internally by upload and agent flows.
| Name | Type | Default | Description |
|---|---|---|---|
type | string | required | Event type e.g. upload_complete, booking_intent |
message | string | required | Notification message body |
meta | object | null | Optional metadata object |
{ "success": true, "eventId": "uuid-..." }