Store
Product catalog with its Store price.
Privacy and analytics
We use necessary technical cookies and, only with your consent, analytics and marketing pixels to improve the website and measure campaigns.
Product catalog with its Store price.
Read-only in every door.
Finds Store products by the person's own words (any word counts: «cartel feria» finds signage) or by category key, ranked by where the words match, in the caller language: the price this brand would pay (price, flagged from for a base price: «from 999 €»; null when included or on request), includedInPlan, available and categoryName. When nothing matches, try once with another word or a broader category before saying the Store has nothing, and never tell the person about the search itself. Pass show_card: true only on the read whose result you present: one product draws its product card. Never returns payment ids.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/store.products.search |
| MCP tool | store_products_search |
| Scope | store.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | carousel |
Input
{
query?: string // ≤ 200
category?: string // ≤ 60
cursor?: string // ≤ 512 · Opaque cursor from a previous `nextCursor`.
limit?: integer // 1–50 · default 20
}Output
{
items: Array<{
slug: string
name: string
summary: string | null
category: string | null // Category key, for filtering (store_products_search `category`).
categoryName?: string | null // The category as people read it («Impresión y espacios»).
includedInPlan: boolean
price: {
amount: integer // -9007199254740991–9007199254740991 · Minor currency units (cents): 99900 is 999 €.
currency: string
from: boolean // A base price: say «from» (Desde 999 €); the final price depends on what the brand adds.
interval: "day" | "week" | "month" | "year" | null // Null for a one-time price.
intervalCount: integer | null
}
| null // The price the Store shows, before tax. Null when the product is free, included or priced on request.
paidPlanOnly: boolean // Only brands with a paid plan can buy it.
available: boolean // False when this brand cannot buy it yet (a paid-plan product on the Free plan): suggest upgrading the plan, never buying it.
url: string // uri · Store page inside the app.
productId?: string // Product id: what favourites, visits and starting a work name.
icon?: string | null // Tabler icon name or image URL of the product.
featuredImage?: string | null // The product's 16:9 editorial cover (public URL).
appSaleChannel?: "checkout" | "not_sold" // How the iPhone, iPad and Android apps sell it: `checkout` = our own checkout (Stripe, Apple Pay / Google Pay), never an in-app purchase, because people deliver it; `not_sold` = nothing to pay (free, included or on request).
}>
nextCursor: string | null
}One product in full: what it includes (steps), typicalDays, its Store price (flagged from for a base price), whether the plan includes it (includedInPlan: it can start now) and whether this brand can buy it (available). Use it to present the product the person is considering, with show_card: true: its card carries the price, timing and one button (Empezar when included, Comprar otherwise) that opens the product page over this conversation, where the person pays. Never take payment details or say it is bought. Optional extras are not steps of the base product.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/store.products.get |
| MCP tool | store_products_get |
| Scope | store.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | record |
Input
{
slug: string // ≤ 120
}Output
{
slug: string
name: string
summary: string | null
category: string | null // Category key, for filtering (store_products_search `category`).
categoryName?: string | null // The category as people read it («Impresión y espacios»).
includedInPlan: boolean
price: {
amount: integer // -9007199254740991–9007199254740991 · Minor currency units (cents): 99900 is 999 €.
currency: string
from: boolean // A base price: say «from» (Desde 999 €); the final price depends on what the brand adds.
interval: "day" | "week" | "month" | "year" | null // Null for a one-time price.
intervalCount: integer | null
}
| null // The price the Store shows, before tax. Null when the product is free, included or priced on request.
paidPlanOnly: boolean // Only brands with a paid plan can buy it.
available: boolean // False when this brand cannot buy it yet (a paid-plan product on the Free plan): suggest upgrading the plan, never buying it.
url: string // uri · Store page inside the app.
productId?: string // Product id: what favourites, visits and starting a work name.
icon?: string | null // Tabler icon name or image URL of the product.
featuredImage?: string | null // The product's 16:9 editorial cover (public URL).
appSaleChannel?: "checkout" | "not_sold" // How the iPhone, iPad and Android apps sell it: `checkout` = our own checkout (Stripe, Apple Pay / Google Pay), never an in-app purchase, because people deliver it; `not_sold` = nothing to pay (free, included or on request).
description: string | null
steps: string[]
typicalDays: integer | null
}What this brand needs next from the Store, in order and with the reason: it starts from the brand facts (no name yet, no website, no logo, no social presence…) and its Genome, and leaves out what it already has or dismissed. Use it when the person asks what the brand needs next or which service fits; quote the reason, never push.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/store.recommendations.list |
| MCP tool | store_recommendations_list |
| Scope | store.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | Nödo, Voice, MCP, API, Chat, Screens, Apps |
| Status | Available |
| Widget | carousel |
Input
{
limit?: integer // 1–8 · default 3
need?: "naming" | "visual_identity" | "strategy" | "website" | "domain" | "ecommerce" | "app" | "social_content" | "video" | "design" | "seo_content" | "advertising" | "web_maintenance" // Only products for this need (e.g. naming for a brand without a name).
}Output
{
items: Array<{
slug: string
name: string
summary: string | null
category: string | null // Category key, for filtering (store_products_search `category`).
categoryName?: string | null // The category as people read it («Impresión y espacios»).
includedInPlan: boolean
price: {
amount: integer // -9007199254740991–9007199254740991 · Minor currency units (cents): 99900 is 999 €.
currency: string
from: boolean // A base price: say «from» (Desde 999 €); the final price depends on what the brand adds.
interval: "day" | "week" | "month" | "year" | null // Null for a one-time price.
intervalCount: integer | null
}
| null // The price the Store shows, before tax. Null when the product is free, included or priced on request.
paidPlanOnly: boolean // Only brands with a paid plan can buy it.
available: boolean // False when this brand cannot buy it yet (a paid-plan product on the Free plan): suggest upgrading the plan, never buying it.
url: string // uri · Store page inside the app.
productId?: string // Product id: what favourites, visits and starting a work name.
icon?: string | null // Tabler icon name or image URL of the product.
featuredImage?: string | null // The product's 16:9 editorial cover (public URL).
appSaleChannel?: "checkout" | "not_sold" // How the iPhone, iPad and Android apps sell it: `checkout` = our own checkout (Stripe, Apple Pay / Google Pay), never an in-app purchase, because people deliver it; `not_sold` = nothing to pay (free, included or on request).
need: "naming" | "visual_identity" | "strategy" | "website" | "domain" | "ecommerce" | "app" | "social_content" | "video" | "design" | "seo_content" | "advertising" | "web_maintenance" // The brand need this product answers.
reason: string // Why it is recommended to this brand, in the caller language.
}>
}What sorts the Store launcher: the products the brand started the most works from (test runs aside) and the ones the caller opened lately (brand.product_visits.record), newest first. Product ids only; read each product with store.products.*.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/store.launcher.signals |
| MCP tool | store_launcher_signals |
| Scope | store.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
limit?: integer // 1–20 · default 12
}Output
{
mostUsedProductIds: string[]
recentlyVisitedProductIds: string[]
}The plans that can be subscribed, with their price and description in the caller's language.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/store.plans.list |
| MCP tool | store_plans_list |
| Scope | store.read |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
translated?: boolean // Descriptions in the caller language (default: as stored).
}Output
{
plans: Array<{
id: string
name: string
description: string | null
monthly_price: integer // -9007199254740991–9007199254740991
annual_price: integer // -9007199254740991–9007199254740991
currency: string
localized_prices: Record<string, {
monthly: number
annual: number
}>
is_featured: boolean
plan_mark: string | null
}>
}What the brand needs next from the Store with everything its home card draws (images, prices, plan inclusion). For the list with the reason in words use store.recommendations.list.
| Field | Value |
|---|---|
| Kind | Read |
| HTTP method | POST /api/v1/store.recommendations.cards |
| MCP tool | store_recommendations_cards |
| Scope | store.read |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | API, MCP, Screens, Apps, Nödo |
| Status | Available |
Input
{
limit?: integer // 1–8 · default 3
}Output
{
items: Array<{
slug: string
name: string
summary: string | null
category: string | null // Category key, for filtering (store_products_search `category`).
categoryName?: string | null // The category as people read it («Impresión y espacios»).
includedInPlan: boolean
price: {
amount: integer // -9007199254740991–9007199254740991 · Minor currency units (cents): 99900 is 999 €.
currency: string
from: boolean // A base price: say «from» (Desde 999 €); the final price depends on what the brand adds.
interval: "day" | "week" | "month" | "year" | null // Null for a one-time price.
intervalCount: integer | null
}
| null // The price the Store shows, before tax. Null when the product is free, included or priced on request.
paidPlanOnly: boolean // Only brands with a paid plan can buy it.
available: boolean // False when this brand cannot buy it yet (a paid-plan product on the Free plan): suggest upgrading the plan, never buying it.
url: string // uri · Store page inside the app.
productId: string
icon: string | null
featuredImage: string | null
appSaleChannel?: "checkout" | "not_sold" // How the iPhone, iPad and Android apps sell it: `checkout` = our own checkout (Stripe, Apple Pay / Google Pay), never an in-app purchase, because people deliver it; `not_sold` = nothing to pay (free, included or on request).
need: "naming" | "visual_identity" | "strategy" | "website" | "domain" | "ecommerce" | "app" | "social_content" | "video" | "design" | "seo_content" | "advertising" | "web_maintenance"
score: number
reasonKey: string
reason: string | null
}>
}Updated on January 1, 1970