Save and organize web finds in persistent, user-controlled collections for AI assistants.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Save an item to the user's Grabblist. Creates a static snapshot — Grabblist does not monitor prices or auto-update data. Only include fields with values available from the source. Price is optional: omit it for videos and other things without a price. If no image is provided, the server attempts to fetch og:image automatically.
Direct public HTTP(S) page URL.
Exact title from the page
Site domain name without TLD: amazon.com→"amazon", ebay.co.nz→"ebay", kiwiquads.co.nz→"kiwiquads"
Tags for categorization
Main image URL. Server auto-fetches og:image if not provided.
Price as a number (e.g. 99.99), taken from the page. Omit when the item has no price (videos, free content).
All image URLs found on the page
Why this change was made (shown to user in change history)
Category — pick the best match
Currency code of the price: USD, NZD, AUD, EUR, GBP, etc. Omit when there is no price.
Seller location or pickup location
How many of this item
Condition if applicable: New, Used, Refurbished, Used - Like New, Used - Good, Used - Fair
What kind of item: product (buy), rental (Airbnb), service (cleaning), course (Udemy), listing (classified), event (ticket), video (YouTube, Twitch, TikTok, Vimeo…). If omitted, the server infers it from the platform (video sites → video, otherwise product).
When the listing was originally posted (ISO 8601)
Specs/details as key-value pairs
Description from the page (max 2000 chars)
Seller or store name
Seller rating 0-5
Original price before discount (if on sale)
Number of seller reviews
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Save an item to the user's Grabblist. Creates a static snapshot — Grabblist does not monitor prices or auto-update data. Only include fields with values available from the source. Price is optional: omit it for videos and other things without a price. If no image is provided, the server attempts to fetch og:image automatically.
| Argument | Type | Description |
|---|---|---|
| url* | string | Direct public HTTP(S) page URL. |
| tags | array | Tags for categorization |
| image | string | Main image URL. Server auto-fetches og:image if not provided. |
| price | number | Price as a number (e.g. 99.99), taken from the page. Omit when the item has no price (videos, free content). |
| title* | string | Exact title from the page |
| images | array | All image URLs found on the page |
| reason | string | Why this change was made (shown to user in change history) |
| category | string | Category — pick the best match |
| currency | string | Currency code of the price: USD, NZD, AUD, EUR, GBP, etc. Omit when there is no price. |
| location | string | Seller location or pickup location |
| platform* | string | Site domain name without TLD: amazon.com→"amazon", ebay.co.nz→"ebay", kiwiquads.co.nz→"kiwiquads" |
| quantity | integer | How many of this item |
| condition | string | Condition if applicable: New, Used, Refurbished, Used - Like New, Used - Good, Used - Fair |
| item_type | string | What kind of item: product (buy), rental (Airbnb), service (cleaning), course (Udemy), listing (classified), event (ticket), video (YouTube, Twitch, TikTok, Vimeo…). If omitted, the server infers it from the platform (video sites → video, otherwise product). |
| posted_at | string | When the listing was originally posted (ISO 8601) |
| attributes | object | Specs/details as key-value pairs |
| description | string | Description from the page (max 2000 chars) |
| seller_name | string | Seller or store name |
| seller_rating | number | Seller rating 0-5 |
| original_price | number | Original price before discount (if on sale) |
| seller_reviews | integer | Number of seller reviews |
{
"type": "object",
"required": [
"url",
"title",
"platform"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2000,
"description": "Direct public HTTP(S) page URL."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"description": "Tags for categorization"
},
"image": {
"type": "string",
"format": "uri",
"maxLength": 2000,
"description": "Main image URL. Server auto-fetches og:image if not provided."
},
"price": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "Price as a number (e.g. 99.99), taken from the page. Omit when the item has no price (videos, free content)."
},
"title": {
"type": "string",
"maxLength": 500,
"description": "Exact title from the page"
},
"images": {
"type": "array",
"items": {
"type": "string",
"format": "uri",
"maxLength": 2000
},
"description": "All image URLs found on the page"
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why this change was made (shown to user in change history)"
},
"category": {
"enum": [
"electronics",
"furniture",
"home",
"clothing",
"vehicles",
"kids",
"sports",
"collectibles",
"tools",
"other"
],
"type": "string",
"description": "Category — pick the best match"
},
"currency": {
"type": "string",
"maxLength": 10,
"description": "Currency code of the price: USD, NZD, AUD, EUR, GBP, etc. Omit when there is no price."
},
"location": {
"type": "string",
"maxLength": 500,
"description": "Seller location or pickup location"
},
"platform": {
"type": "string",
"maxLength": 100,
"description": "Site domain name without TLD: amazon.com→\"amazon\", ebay.co.nz→\"ebay\", kiwiquads.co.nz→\"kiwiquads\""
},
"quantity": {
"type": "integer",
"maximum": 1000000,
"minimum": 1,
"description": "How many of this item"
},
"condition": {
"type": "string",
"maxLength": 100,
"description": "Condition if applicable: New, Used, Refurbished, Used - Like New, Used - Good, Used - Fair"
},
"item_type": {
"enum": [
"product",
"rental",
"service",
"course",
"listing",
"event",
"video",
"other"
],
"type": "string",
"description": "What kind of item: product (buy), rental (Airbnb), service (cleaning), course (Udemy), listing (classified), event (ticket), video (YouTube, Twitch, TikTok, Vimeo…). If omitted, the server infers it from the platform (video sites → video, otherwise product)."
},
"posted_at": {
"type": "string",
"maxLength": 64,
"description": "When the listing was originally posted (ISO 8601)"
},
"attributes": {
"type": "object",
"description": "Specs/details as key-value pairs",
"additionalProperties": {
"oneOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "Description from the page (max 2000 chars)"
},
"seller_name": {
"type": "string",
"maxLength": 200,
"description": "Seller or store name"
},
"seller_rating": {
"type": "number",
"maximum": 5,
"minimum": 0,
"description": "Seller rating 0-5"
},
"original_price": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "Original price before discount (if on sale)"
},
"seller_reviews": {
"type": "integer",
"maximum": 1000000000,
"minimum": 0,
"description": "Number of seller reviews"
}
}
}Add a saved item to a collection. Both the item and collection must already exist.
| Argument | Type | Description |
|---|---|---|
| reason | string | Why this change was made (shown to user in change history) |
| item_id* | string | The item ID to add |
| collection_id* | string | The collection ID |
{
"type": "object",
"required": [
"collection_id",
"item_id"
],
"properties": {
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
},
"item_id": {
"type": "string",
"description": "The item ID to add"
},
"collection_id": {
"type": "string",
"description": "The collection ID"
}
}
}Create a new collection (folder) in the user's Grabblist to organize saved items.
| Argument | Type | Description |
|---|---|---|
| icon | string | Material Symbols icon name (e.g. "devices", "home", "shopping_bag", "checkroom", "directions_car", "favorite"). Default: inventory_2 |
| name* | string | Collection name, e.g. "Gaming Setup" or "Gift Ideas" |
| color | string | Hex color for the collection (e.g. "#3B82F6", "#22C55E", "#A855F7", "#EC4899", "#F59E0B", "#EF4444"). Default: #3B82F6 |
| budget | number | Total spending target for this collection (e.g. 1500 for "Build PC under $1500") |
| reason | string | Why this change was made (shown to user in change history) |
| description | string | Short description of what this collection is for |
| budget_currency | string | Currency for the budget (default: NZD) |
{
"type": "object",
"required": [
"name"
],
"properties": {
"icon": {
"type": "string",
"description": "Material Symbols icon name (e.g. \"devices\", \"home\", \"shopping_bag\", \"checkroom\", \"directions_car\", \"favorite\"). Default: inventory_2"
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Collection name, e.g. \"Gaming Setup\" or \"Gift Ideas\""
},
"color": {
"type": "string",
"description": "Hex color for the collection (e.g. \"#3B82F6\", \"#22C55E\", \"#A855F7\", \"#EC4899\", \"#F59E0B\", \"#EF4444\"). Default: #3B82F6"
},
"budget": {
"type": "number",
"description": "Total spending target for this collection (e.g. 1500 for \"Build PC under $1500\")"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "Short description of what this collection is for"
},
"budget_currency": {
"type": "string",
"description": "Currency for the budget (default: NZD)"
}
}
}Permanently delete a collection. Items inside are not deleted — they stay in the Grabblist.
| Argument | Type | Description |
|---|---|---|
| id* | string | The collection ID to delete |
| reason | string | Why this change was made (shown to user in change history) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The collection ID to delete"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
}
}
}Remove one or more items from the user's Grabblist (soft-delete). Pass a single id or an array of ids for batch operations.
| Argument | Type | Description |
|---|---|---|
| id* | any | Item ID or array of item IDs to delete |
| reason | string | Why this change was made (shown to user in change history) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Item ID or array of item IDs to delete"
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why this change was made (shown to user in change history)"
}
}
}Get recent activity on a collection — additions, removals, edits.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max events to return (default: 20) |
| collection_id* | string | The collection ID |
{
"type": "object",
"required": [
"collection_id"
],
"properties": {
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Max events to return (default: 20)"
},
"collection_id": {
"type": "string",
"description": "The collection ID"
}
}
}Get full details of a saved item by ID. Returns a static snapshot from the user's Grabblist.
| Argument | Type | Description |
|---|---|---|
| id* | string | The item ID |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The item ID"
}
}
}Get all relations for an item — alternatives, complements, upgrades, duplicates. Returns the item and all connected items with their relation types.
| Argument | Type | Description |
|---|---|---|
| id* | string | The item ID to get relations for |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The item ID to get relations for"
}
}
}Get the change history for a saved item — who changed what and when.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max events to return (default: 20) |
| item_id* | string | The item ID |
{
"type": "object",
"required": [
"item_id"
],
"properties": {
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Max events to return (default: 20)"
},
"item_id": {
"type": "string",
"description": "The item ID"
}
}
}Get all saved items from the user's Grabblist. Each item is a static snapshot — data reflects the moment it was saved, not current prices.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max items to return (default: 50) |
| platform | string | Filter by platform (domain name, e.g. "amazon", "ebay", "trademe") |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"maximum": 100,
"minimum": 1,
"description": "Max items to return (default: 50)"
},
"platform": {
"type": "string",
"description": "Filter by platform (domain name, e.g. \"amazon\", \"ebay\", \"trademe\")"
}
}
}Create typed relations between items: alternative (A or B), complement (A and B together), upgrade (B replaces A), duplicate (same item different site), same_seller. Supports single pair (from_id, to_id, relation) or bulk (pairs array).
| Argument | Type | Description |
|---|---|---|
| pairs | array | Array of pairs to link (for bulk mode) |
| to_id | string | Second item ID (for single pair mode) |
| reason | string | Why this change was made (shown to user in change history) |
| from_id | string | First item ID (for single pair mode) |
| relation | string | Type of relationship (for single pair mode) |
{
"type": "object",
"properties": {
"pairs": {
"type": "array",
"items": {
"type": "object",
"required": [
"from_id",
"to_id",
"relation"
],
"properties": {
"to_id": {
"type": "string",
"description": "Second item ID"
},
"from_id": {
"type": "string",
"description": "First item ID"
},
"relation": {
"enum": [
"alternative",
"complement",
"upgrade",
"duplicate",
"same_seller"
],
"type": "string",
"description": "Type of relationship"
}
}
},
"description": "Array of pairs to link (for bulk mode)"
},
"to_id": {
"type": "string",
"description": "Second item ID (for single pair mode)"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
},
"from_id": {
"type": "string",
"description": "First item ID (for single pair mode)"
},
"relation": {
"enum": [
"alternative",
"complement",
"upgrade",
"duplicate",
"same_seller"
],
"type": "string",
"description": "Type of relationship (for single pair mode)"
}
}
}List all collections OR get a specific collection with its items. Without id: returns all collections with counts/values. With id: returns that collection's metadata and all items inside (with optional filters).
| Argument | Type | Description |
|---|---|---|
| id | string | Collection ID — if provided, returns that collection with all its items. If omitted, lists all collections. |
| sort | string | Sort order (only when id is provided, default: newest) |
| tags | array | Filter items that have ALL these tags (only when id is provided) |
| status | string | Filter by decision status (only when id is provided) |
| platform | string | Filter by platform domain name, e.g. "amazon", "ebay" (only when id is provided) |
| max_price | number | Maximum price filter (only when id is provided) |
| min_price | number | Minimum price filter (only when id is provided) |
| created_by | string | Filter by who added: "ai" for AI-added items (only when id is provided) |
Test connectivity to Grabblist and return service version.
No arguments.
{
"type": "object",
"properties": {}
}Remove one or more items from a collection. Pass a single item_id or an array of item_ids for batch removal. Items are NOT deleted — they stay in the Grabblist.
| Argument | Type | Description |
|---|---|---|
| reason | string | Why this change was made (shown to user in change history) |
| item_ids* | any | Item ID or array of item IDs to remove |
| collection_id* | string | The collection ID |
{
"type": "object",
"required": [
"collection_id",
"item_ids"
],
"properties": {
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
},
"item_ids": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Item ID or array of item IDs to remove"
},
"collection_id": {
"type": "string",
"description": "The collection ID"
}
}
}Restore one or more deleted (archived) items back to the Grabblist. Pass a single id or an array of ids for batch restore.
| Argument | Type | Description |
|---|---|---|
| id* | any | Item ID or array of item IDs to restore |
| reason | string | Why this change was made (shown to user in change history) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Item ID or array of item IDs to restore"
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why this change was made (shown to user in change history)"
}
}
}Search within the user's saved items by keyword
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results (default: 20) |
| query* | string | Search query |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Max results (default: 20)"
},
"query": {
"type": "string",
"maxLength": 500,
"description": "Search query"
}
}
}Send feedback, a bug report or a feature request to the Grabblist team. Only call this when the user asks to report something, or agrees after you offer to report a problem (parsing failure, broken URL, missing feature); show them the message first. Be specific about what went wrong and where.
| Argument | Type | Description |
|---|---|---|
| url | string | The URL where the issue occurred |
| tool | string | The tool you were using when the issue occurred (e.g. add_item, search_saved) |
| type* | string | Type: bug (something broken), parsing_failure (price/title/image not extracted), feature_request (wishlist), feedback (general feedback) |
| error | string | Error message you received, if any |
| message* | string | What happened or what you propose. Be specific — the team reads this. |
{
"type": "object",
"required": [
"type",
"message"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The URL where the issue occurred"
},
"tool": {
"type": "string",
"description": "The tool you were using when the issue occurred (e.g. add_item, search_saved)"
},
"type": {
"enum": [
"bug",
"parsing_failure",
"feature_request",
"feedback"
],
"type": "string",
"description": "Type: bug (something broken), parsing_failure (price/title/image not extracted), feature_request (wishlist), feedback (general feedback)"
},
"error": {
"type": "string",
"description": "Error message you received, if any"
},
"message": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "What happened or what you propose. Be specific — the team reads this."
}
}
}Set the pinned "Top Picks" items for a collection (max 3). Pinned items are highlighted on the share page.
| Argument | Type | Description |
|---|---|---|
| reason | string | Why this change was made (shown to user in change history) |
| item_ids* | array | Items to pin, in display order (1st = top) |
| collection_id* | string | The collection ID |
{
"type": "object",
"required": [
"collection_id",
"item_ids"
],
"properties": {
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
},
"item_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Items to pin, in display order (1st = top)"
},
"collection_id": {
"type": "string",
"description": "The collection ID"
}
}
}Remove a relation between two items.
| Argument | Type | Description |
|---|---|---|
| to_id* | string | Second item ID |
| reason | string | Why this change was made (shown to user in change history) |
| from_id* | string | First item ID |
| relation* | string | The relation type to remove |
{
"type": "object",
"required": [
"from_id",
"to_id",
"relation"
],
"properties": {
"to_id": {
"type": "string",
"description": "Second item ID"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
},
"from_id": {
"type": "string",
"description": "First item ID"
},
"relation": {
"enum": [
"alternative",
"complement",
"upgrade",
"duplicate",
"same_seller"
],
"type": "string",
"description": "The relation type to remove"
}
}
}Update a collection's name, icon, description, budget, or sharing status. Only provide the fields you want to change — omitted fields stay unchanged. Set is_public=true to share (returns public URL), is_public=false to unshare.
| Argument | Type | Description |
|---|---|---|
| id* | string | The collection ID to update |
| icon | string | Material Symbols icon name (e.g. "devices", "home", "shopping_bag") |
| name | string | New collection name |
| color | string | Hex color (e.g. "#3B82F6", "#22C55E", "#EF4444") |
| budget | number | New budget amount |
| reason | string | Why this change was made (shown to user in change history) |
| is_public | boolean | Set true to share (generates public URL), false to unshare |
| description | string | New description |
| budget_currency | string | New budget currency |
Edit fields on one or more saved items. Pass a single id or an array of ids for batch updates (same fields applied to all). For batch: attributes are REPLACED not merged, og:image fallback is skipped.
| Argument | Type | Description |
|---|---|---|
| id* | any | Item ID or array of item IDs to update |
| tags | array | Replace all tags with this list |
| notes | string | User or AI notes — personal comments, thoughts, comparisons |
| title | string | Item title |
| images | array | All image URLs — replaces the entire images array |
| reason | string | Why this change was made (shown to user in change history) |
| status | string | Decision status: considering, shortlisted, decided, bought, rejected |
| category | string | Item category |
| quantity | integer | How many of this item |
Manually update the price on a saved item. Records old and new price for comparison. This is a manual correction, not automatic price tracking.
| Argument | Type | Description |
|---|---|---|
| id* | string | The item ID |
| price* | number | New current price |
| reason | string | Why this change was made (shown to user in change history) |
| source | string | Price update source |
{
"type": "object",
"required": [
"id",
"price"
],
"properties": {
"id": {
"type": "string",
"description": "The item ID"
},
"price": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "New current price"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
},
"source": {
"enum": [
"ai_check",
"manual"
],
"type": "string",
"description": "Price update source"
}
}
}{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Collection ID — if provided, returns that collection with all its items. If omitted, lists all collections."
},
"sort": {
"enum": [
"newest",
"oldest",
"price_asc",
"price_desc",
"title"
],
"type": "string",
"description": "Sort order (only when id is provided, default: newest)"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter items that have ALL these tags (only when id is provided)"
},
"status": {
"enum": [
"considering",
"shortlisted",
"decided",
"bought",
"rejected"
],
"type": "string",
"description": "Filter by decision status (only when id is provided)"
},
"platform": {
"type": "string",
"description": "Filter by platform domain name, e.g. \"amazon\", \"ebay\" (only when id is provided)"
},
"max_price": {
"type": "number",
"description": "Maximum price filter (only when id is provided)"
},
"min_price": {
"type": "number",
"description": "Minimum price filter (only when id is provided)"
},
"created_by": {
"enum": [
"user",
"ai",
"extension"
],
"type": "string",
"description": "Filter by who added: \"ai\" for AI-added items (only when id is provided)"
}
}
}{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The collection ID to update"
},
"icon": {
"type": "string",
"description": "Material Symbols icon name (e.g. \"devices\", \"home\", \"shopping_bag\")"
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "New collection name"
},
"color": {
"type": "string",
"description": "Hex color (e.g. \"#3B82F6\", \"#22C55E\", \"#EF4444\")"
},
"budget": {
"type": "number",
"description": "New budget amount"
},
"reason": {
"type": "string",
"description": "Why this change was made (shown to user in change history)"
},
"is_public": {
"type": "boolean",
"description": "Set true to share (generates public URL), false to unshare"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "New description"
},
"budget_currency": {
"type": "string",
"description": "New budget currency"
}
}
}| image_url |
| string |
| Main image URL |
| item_type | string | What kind of item this is |
| attributes | object | Merge into existing attributes |
| description | string | Item description (max 2000 chars) |
| is_favorite | boolean | Set true to favorite, false to unfavorite |
| target_price | number | What the user wants to pay — not the actual price, but the goal price |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Item ID or array of item IDs to update"
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100
},
"description": "Replace all tags with this list"
},
"notes": {
"type": "string",
"maxLength": 2000,
"description": "User or AI notes — personal comments, thoughts, comparisons"
},
"title": {
"type": "string",
"maxLength": 500,
"description": "Item title"
},
"images": {
"type": "array",
"items": {
"type": "string",
"format": "uri",
"maxLength": 2000
},
"description": "All image URLs — replaces the entire images array"
},
"reason": {
"type": "string",
"maxLength": 1000,
"description": "Why this change was made (shown to user in change history)"
},
"status": {
"enum": [
"considering",
"shortlisted",
"decided",
"bought",
"rejected"
],
"type": "string",
"description": "Decision status: considering, shortlisted, decided, bought, rejected"
},
"category": {
"enum": [
"electronics",
"furniture",
"home",
"clothing",
"vehicles",
"kids",
"sports",
"collectibles",
"tools",
"other"
],
"type": "string",
"description": "Item category"
},
"quantity": {
"type": "integer",
"maximum": 1000000,
"minimum": 1,
"description": "How many of this item"
},
"image_url": {
"type": "string",
"format": "uri",
"maxLength": 2000,
"description": "Main image URL"
},
"item_type": {
"enum": [
"product",
"rental",
"service",
"course",
"listing",
"event",
"other"
],
"type": "string",
"description": "What kind of item this is"
},
"attributes": {
"type": "object",
"description": "Merge into existing attributes",
"additionalProperties": {
"oneOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "Item description (max 2000 chars)"
},
"is_favorite": {
"type": "boolean",
"description": "Set true to favorite, false to unfavorite"
},
"target_price": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "What the user wants to pay — not the actual price, but the goal price"
}
}
}