TOMO Manifest Reference — Every Field Documented
Audience: every TOMO partner. The manifest is your declaration of intent coverage. It tells TOMO which intents you serve, where, at what price, and at what self-rated quality on TTBS.
The manifest is also TOMO's source of truth for routing decisions. A manifest entry is the contract that gets you traffic.
Source code (TOMO server side): server/routes/businessTier1.ts POST /manifest/:uid + server/services/businessFirestore.ts writeServiceManifest().
Authoring UI: https://www.automobnxt.com/?dev=tier1-manifest → guided form with live YAML preview.
1. Manifest top-level structure
manifest_version: "v0.1.0"
business:
name: "Booking.com"
legal_name: "Booking.com B.V."
tier: tier1 # tier1 (API) or tier2 (phone — generated automatically by Tier 2 wrapper)
partner_id: <issued by TOMO at signup>
intents:
- intent: travel.book_hotel
intent_version: v1.0.0
domain: travel
description: "Hotels, homestays, resorts, service apartments worldwide"
pricing:
min: 500
max: 50000
currency: INR
service_area: ["Bangalore", "Hyderabad", "Mumbai", "Delhi", "Chennai", "Goa", "Pune"]
ttbs_signals:
time: 0.6
taste: 0.8
budget: 0.5
safety: 0.7
availability: "24x7"
completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/booking_com_partner"
widget_type: travel_listing_results
- intent: food.order_delivery
# ... another entry
2. manifest_version
Type: string, semver. REQUIRED.
The version of THIS manifest schema, not the spec. Currently v0.1.0. TOMO will inform you of schema upgrades 30 days in advance with migration instructions.
3. business block
business:
name: string, REQUIRED # display name shown in chat: "Booking.com"
legal_name: string, REQUIRED # registered legal entity: "Booking.com B.V."
tier: STRICT ENUM, REQUIRED # tier1 | tier2
partner_id: string, REQUIRED # issued by TOMO at signup; do not change
tier1 = API path (engineering team integration).
tier2 = phone signup (small business — manifest auto-generated by TOMO's Tier 2 wrapper from the storefront fields).
Most partners reading this doc are tier1. tier2 partners typically don't write manifests by hand — TOMO generates one for them from their storefront/menu/listings.
4. intents[] — the heart of the manifest
Each entry declares one intent you serve. Multiple entries allowed (you can serve travel.book_hotel AND travel.book_flight). Limit: 50 entries per manifest.
Required fields per entry
| Field | Type | Constraint | Notes |
|---|---|---|---|
intent |
string | REQUIRED, full ID | exact match from _INTENT_CATALOG.md |
intent_version |
semver | REQUIRED | spec version your tools implement |
domain |
enum | REQUIRED | derived from intent's namespace |
description |
string | REQUIRED, ≤200 chars | partner-facing description shown in admin review |
pricing |
object | REQUIRED | floor + ceiling per closed intent |
service_area |
array |
REQUIRED, ≥1 | cities or pincodes |
ttbs_signals |
object | REQUIRED | self-rated quality across 4 axes |
availability |
string | REQUIRED | hours of operation in human-readable format |
completion_callback |
URL | REQUIRED | TOMO's CPC webhook URL |
widget_type |
string | REQUIRED | matches the intent's §9 widget_type |
5. pricing block
pricing:
min: 500 # INR_INTEGER, REQUIRED — typical floor for a single closed intent
max: 50000 # INR_INTEGER, REQUIRED — typical ceiling
currency: INR # REQUIRED, always INR for v1
This drives TTBS budget scoring. If the user has budget_band: ok and your min is too high, you may not appear. If they have budget_band: great and your max is too low, you may appear with the "ok" cohort but not the "great" cohort.
Be honest. Setting min: 1 to game the budget filter gets you flagged in TOMO's 1% audit, then suspended. Set ranges that reflect your real distribution.
6. service_area
service_area: ["Bangalore", "Hyderabad", "Mumbai"]
# or with pincodes:
service_area: ["560001", "500081", "400001"]
# or mixed:
service_area: ["Bangalore", "560001", "Hyderabad", "500081"]
REQUIRED, ≥1 entry. Strings are city names (canonical Indian English) or 6-digit pincodes.
For pan-India partners (e.g., DHL, Razorpay), use ["IN_ALL"] — but you'll be asked to verify nation-wide coverage during sandbox-to-prod review.
For hyper-local partners (single restaurant, single salon), pincode-only is fine and you'll only get traffic from that pincode.
7. ttbs_signals — your self-rating
ttbs_signals:
time: 0.6
taste: 0.8
budget: 0.5
safety: 0.7
Four floats, each 0.0-1.0. They tell TOMO how YOU position yourself on each axis. The orchestrator uses this as a signal alongside live performance (latency, ratings, etc.).
| Axis | Meaning | High value (0.8-1.0) | Low value (0.0-0.3) |
|---|---|---|---|
time |
how fast you fulfill | <30 min average | >2 hours average |
taste |
quality / curation | premium curation | broad, no curation |
budget |
value-for-money positioning | budget-friendly | premium-priced |
safety |
trust + verification depth | full KYC + audits | minimal verification |
Self-rating is verifiable. TOMO compares your declared signals against actual delivery metrics. Inflate any signal materially → suspension.
Example honest declarations:
# Booking.com (broad, premium-positioned, slow-confirm)
ttbs_signals: { time: 0.4, taste: 0.85, budget: 0.5, safety: 0.8 }
# OYO (volume, budget-positioned, fast-confirm)
ttbs_signals: { time: 0.7, taste: 0.4, budget: 0.85, safety: 0.5 }
# Boutique homestay platform (slow, premium, expensive, very safe)
ttbs_signals: { time: 0.3, taste: 0.95, budget: 0.2, safety: 0.95 }
8. availability
availability: "24x7"
# or:
availability: "Mon-Sat 08:00-22:00 IST"
# or:
availability: "Mon-Fri 09:00-18:00 IST; Sat 10:00-14:00 IST; Sun closed"
REQUIRED. Free-text accepted but partner-side audit checks it against actual response patterns. If you say 24x7 but never respond between 02:00-06:00, TOMO will flag and downgrade you to your declared real hours.
9. completion_callback
completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/booking_com_partner"
REQUIRED. Always points to TOMO's CPC webhook, not your endpoint. You don't receive callbacks here — you POST to here when an intent closes.
The pattern is fixed: /api/v1/cpc/mcp_provider/<your_partner_id>. Your <partner_id> is shown in your Tier 1 dashboard at signup.
10. widget_type
widget_type: travel_listing_results
REQUIRED. Must match exactly the widget_type declared in your intent's §9. If you serve travel.book_hotel, your widget_type is travel_listing_results.
You don't get to choose. The widget is locked per intent so users see consistent rendering across providers.
11. Optional fields (per-intent, declared in TOMO's spec but not in the manifest)
These are NOT in the manifest — they're declared in your tool's MCP _meta.tomo block instead, OR fixed by the intent spec:
tool_role— declared in MCP_meta.tomopricing_band— declared in MCP_meta.tomo- TTBS signal weighting — locked by domain in
domain-agent-map.ts - Caching policy — fixed by intent §9
- Anti-fabrication rules — fixed by intent §12
Don't try to override these. They're spec-level constants.
12. Validation rules at submit
When you click "Submit for review" on the manifest editor, TOMO runs:
[ ] manifest_version is current
[ ] business.tier matches your account tier (tier1 partner submits tier1 manifest)
[ ] business.partner_id matches your account
[ ] business.legal_name format reasonable (not "test" or "asdf")
[ ] At least 1 intent declared, max 50
[ ] Every intent.intent exists in _INTENT_CATALOG.md
[ ] Every intent_version matches a live spec version
[ ] Every domain matches the intent's namespace
[ ] Every pricing.min ≥ 0, pricing.max ≥ pricing.min
[ ] Every service_area entry is a known city or valid 6-digit pincode
[ ] Every ttbs_signal is 0.0-1.0
[ ] Every availability parses (or is "24x7")
[ ] Every completion_callback follows the exact pattern
[ ] Every widget_type matches the intent's §9 widget_type
Failure → editor shows inline error. Pass → status flips to pending_review. Admin reviews within 24-72h.
13. After approval
Status flips pending_review → live. TOMO's orchestrator now includes your tools in the candidate pool for matching intents. You start receiving traffic.
You can update your manifest at any time. Updates flow:
1. You edit + submit → status: pending_review
2. Admin reviews → status: live (approved) | rejected (with notes)
3. While pending: → old approved version stays live (no traffic disruption)
Material changes (adding new intents, expanding service_area beyond a state, dropping intents) require admin re-review. Cosmetic changes (description text, ttbs signal tweaks within ±0.1) auto-approve.
14. The complete YAML for one common case
A boutique hotel chain serving travel.book_hotel only, in 5 cities:
manifest_version: "v0.1.0"
business:
name: "Mahima Resorts"
legal_name: "Mahima Hospitality Pvt. Ltd."
tier: tier1
partner_id: tomo_sandbox_a1b2c3d4e5f6
intents:
- intent: travel.book_hotel
intent_version: v1.0.0
domain: travel
description: "Boutique resorts in South India tourist destinations"
pricing:
min: 3500
max: 18000
currency: INR
service_area: ["Coorg", "Munnar", "Ooty", "Chikmagalur", "Wayanad"]
ttbs_signals:
time: 0.4
taste: 0.9
budget: 0.3
safety: 0.85
availability: "24x7"
completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/tomo_sandbox_a1b2c3d4e5f6"
widget_type: travel_listing_results
15. The complete YAML for a multi-intent partner
A delivery aggregator serving food and groceries:
manifest_version: "v0.1.0"
business:
name: "Swiggy"
legal_name: "Bundl Technologies Pvt. Ltd."
tier: tier1
partner_id: swiggy_partner
intents:
- intent: food.order_delivery
intent_version: v1.0.0
domain: food
description: "Restaurant-to-doorstep food delivery, 30-50 min"
pricing:
min: 120
max: 4000
currency: INR
service_area: ["IN_ALL"]
ttbs_signals:
time: 0.85
taste: 0.65
budget: 0.55
safety: 0.7
availability: "24x7"
completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/swiggy_partner"
widget_type: food_menu_results
- intent: food.book_dine_in
intent_version: v1.0.0
domain: food
description: "Dine-in reservations via Swiggy Dineout (former Dineout)"
pricing:
min: 400
max: 8000
currency: INR
service_area: ["Bangalore", "Hyderabad", "Mumbai", "Delhi", "Chennai", "Pune", "Kolkata"]
ttbs_signals:
time: 0.5
taste: 0.7
budget: 0.55
safety: 0.7
availability: "24x7"
completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/swiggy_partner"
widget_type: food_dine_in_results
- intent: grocery.order_delivery
intent_version: v1.0.0
domain: grocery
description: "Instamart grocery — 10-30 min delivery"
pricing:
min: 80
max: 3000
currency: INR
service_area: ["Bangalore", "Hyderabad", "Mumbai", "Delhi", "Pune", "Chennai", "Kolkata"]
ttbs_signals:
time: 0.95
taste: 0.5
budget: 0.65
safety: 0.65
availability: "24x7"
completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/swiggy_partner"
widget_type: grocery_results
16. Common mistakes
intent ID typo
e.g., travel.book_hotels (plural) doesn't exist; only travel.book_hotel (singular). TOMO returns INVALID_INTENT.
intent_version higher than live spec
You can't serve a future spec version. Pin to the latest live version (currently v1.0.0 for all intents).
domain mismatch
If your intent is food.order_delivery, domain is food, not restaurant or delivery.
service_area with "Bengaluru" vs "Bangalore"
TOMO uses canonical English city names. Bangalore, Mumbai, Calcutta (still accepted alongside Kolkata), etc. Run your manifest through the editor's autocomplete to get the canonical form.
TTBS signals at 1.0 across all axes
Self-inflation. TOMO's audit will detect that you don't actually deliver in <30 min, your reviews aren't 4.9, your prices aren't always lowest, etc. Be honest — being 0.6 on time and 0.9 on taste is more useful than being 1.0 on everything.
widget_type not matching intent
You declared travel_listing_results for food.order_delivery. The intent spec mandates food_menu_results. Editor catches this; don't fight it.
17. Programmatic manifest submission
If you want to script manifest updates (CI/CD, multi-environment), use the API directly:
curl -X POST https://www.automobnxt.com/api/v1/business/tier1/manifest/<your_uid> \
-H "Authorization: Bearer <your_jwt>" \
-H "Content-Type: application/json" \
-d '{
"businessName": "Booking.com",
"intents": [
{
"intent": "travel.book_hotel",
"domain": "travel",
"description": "Hotels worldwide",
"pricing": { "min": 500, "max": 50000, "currency": "INR" },
"service_area": ["Bangalore", "Hyderabad", "Mumbai"],
"ttbs_signals": { "time": 0.6, "taste": 0.8, "budget": 0.5, "safety": 0.7 },
"availability": "24x7",
"completion_callback": "https://www.automobnxt.com/api/v1/cpc/mcp_provider/booking_com_partner",
"widget_type": "travel_listing_results"
}
],
"submitForReview": true
}'
18. References
- TOMO intent catalog:
docs/intents/_INTENT_CATALOG.md - TOMO intent spec template:
docs/intents/_TEMPLATE.md - Server-side ingest:
server/routes/businessTier1.ts - Server-side storage:
server/services/businessFirestore.tswriteServiceManifest()
Built by AUTOMOBNXT · DPIIT Recognised Startup · 2026.