Skip to main content

Catalog item schemas

Each vertical catalog type maps to a single AdCP schema that works across platforms — Google, Meta, LinkedIn, and others. Provide items in this format once, and every platform gets what it needs. All vertical items share a common pattern: a unique ID field, core display fields, an optional assets array for typed creative asset pools, an optional tags array for filtering, and an ext object for vendor-specific extensions. Conversion events listed for each vertical are the standard event names used for attribution when an ad drives action on a catalog item.

Common fields

In addition to the domain-specific fields listed in each vertical’s table, all vertical items support:
FieldTypeDescription
image_urluriPrimary image URL (most verticals — see note)
urluriLanding page URL (most verticals — see note)
assetsOfferingAssetGroup[]Typed creative asset pools (landscape, vertical, square, logo, video)
tagsstring[]Tags for filtering and targeting
extobjectVendor-specific extensions
Exceptions: Job items use apply_url instead of url and have no image_url. App items use icon_url and store_url instead of image_url and url. See each vertical’s field table for the exact fields.

Job catalog

Job postings for recruitment campaigns. Maps to LinkedIn Jobs XML, Google DynamicJobsAsset, and schema.org JobPosting. Schema: /schemas/core/job-item.json Required: job_id, title, company_name, description Conversion events: submit_application, complete_registration
FieldTypeDescription
job_idstringUnique identifier for this posting
titlestringJob title
company_namestringHiring company name
descriptionstringFull job description
locationstringDisplay string — “Amsterdam, NL” or “Remote”
employment_typeenumfull_time, part_time, contract, temporary, internship, freelance
experience_levelenumentry_level, mid_level, senior, director, executive
salaryobject{ min, max, currency, period } — period is hour, month, or year
date_posteddateISO 8601 date
valid_throughdateApplication deadline
apply_urluriDirect application URL
job_functionsstring[]e.g., ["engineering", "marketing"]
industriesstring[]e.g., ["technology", "healthcare"]
tagsstring[]For filtering — e.g., ["remote", "visa-sponsorship"]
Plus common fields (assets, tags, ext) shared by all verticals. Job items use apply_url instead of url and have no image_url. Minimal — just required fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/job-item.json",
  "job_id": "eng-sr-2025-042",
  "title": "Senior Software Engineer",
  "company_name": "Acme Corp",
  "description": "Senior engineer to lead our platform team, designing distributed systems serving millions of daily requests."
}
Full example with optional fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/job-item.json",
  "job_id": "eng-sr-2025-042",
  "title": "Senior Software Engineer",
  "company_name": "Acme Corp",
  "description": "We're looking for a senior engineer to lead our platform team. You'll design and build distributed systems serving millions of daily requests.",
  "location": "Amsterdam, NL",
  "employment_type": "full_time",
  "experience_level": "senior",
  "salary": { "min": 80000, "max": 110000, "currency": "EUR", "period": "year" },
  "date_posted": "2025-06-01",
  "valid_through": "2025-08-01",
  "apply_url": "https://acmecorp.com/careers/eng-sr-2025-042",
  "job_functions": ["engineering"],
  "industries": ["technology"],
  "tags": ["visa-sponsorship", "equity"]
}

Hotel catalog

Hotel and lodging properties for travel ads and dynamic remarketing. Maps to Google Hotel Center feeds and Meta hotel catalogs. Schema: /schemas/core/hotel-item.json Required: hotel_id, name, location Conversion events: purchase (booking)
FieldTypeDescription
hotel_idstringUnique identifier
namestringProperty name
descriptionstringProperty description
locationobject{ lat, lng } — WGS 84 coordinates
addressobject{ street, city, region, postal_code, country }
star_ratinginteger1–5
priceobject{ amount, currency, period } — use period "night"
image_urluriPrimary property image
urluriProperty landing page
amenitiesstring[]e.g., ["spa", "pool", "wifi"]
check_in_timestringHH:MM format (e.g., "15:00")
check_out_timestringHH:MM format (e.g., "11:00")
phonestringProperty phone number in E.164 format
valid_fromdateStart of seasonal availability window
valid_todateEnd of seasonal availability window
tagsstring[]e.g., ["luxury", "city-center"]
Plus common fields (image_url, url, assets, tags, ext) shared by all verticals. Minimal — just required fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/hotel-item.json",
  "hotel_id": "grand-amsterdam",
  "name": "Grand Hotel Amsterdam",
  "location": { "lat": 52.3676, "lng": 4.9041 }
}
Full example with optional fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/hotel-item.json",
  "hotel_id": "grand-amsterdam",
  "name": "Grand Hotel Amsterdam",
  "description": "Five-star canal-side hotel in the heart of Amsterdam with rooftop bar and spa.",
  "location": { "lat": 52.3676, "lng": 4.9041 },
  "address": {
    "street": "Herengracht 100",
    "city": "Amsterdam",
    "region": "NL-NH",
    "postal_code": "1015 BS",
    "country": "NL"
  },
  "star_rating": 5,
  "price": { "amount": 289, "currency": "EUR", "period": "night" },
  "image_url": "https://images.acmehotels.com/grand-amsterdam/hero.jpg",
  "url": "https://acmehotels.com/amsterdam/grand",
  "amenities": ["spa", "pool", "restaurant", "wifi", "parking"],
  "check_in_time": "15:00",
  "check_out_time": "11:00",
  "tags": ["luxury", "city-center", "business"]
}

Vehicle catalog

Vehicle listings for automotive inventory ads. Maps to Meta Automotive Inventory Ads, Microsoft Auto Inventory feeds, and Google vehicle ads. Schema: /schemas/core/vehicle-item.json Required: vehicle_id, title, make, model, year Conversion events: lead, schedule (test drive)
FieldTypeDescription
vehicle_idstringUnique identifier
titlestringListing title (e.g., “2024 Apex Horizon EX Sedan”)
makestringManufacturer
modelstringModel name
yearintegerModel year
priceobject{ amount, currency }
conditionenumnew, used, certified_pre_owned
vinstring17-character VIN
trimstringTrim level (e.g., “EX”, “Limited”)
mileageobject{ value, unit } — unit is km or mi
body_styleenumsedan, suv, truck, coupe, convertible, wagon, van, hatchback
transmissionenumautomatic, manual, cvt
fuel_typeenumgasoline, diesel, electric, hybrid, plug_in_hybrid
exterior_colorstringExterior color
interior_colorstringInterior color
locationobject{ lat, lng } — dealer or vehicle location
tagsstring[]e.g., ["low-mileage", "one-owner"]
Plus common fields (image_url, url, assets, tags, ext) shared by all verticals. Minimal — just required fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/vehicle-item.json",
  "vehicle_id": "dlr-2024-horizon-001",
  "title": "2024 Apex Horizon EX Sedan",
  "make": "Apex",
  "model": "Horizon",
  "year": 2024
}
Full example with optional fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/vehicle-item.json",
  "vehicle_id": "dlr-2024-horizon-001",
  "title": "2024 Apex Horizon EX Sedan",
  "make": "Apex",
  "model": "Horizon",
  "year": 2024,
  "trim": "EX",
  "price": { "amount": 28500, "currency": "USD" },
  "condition": "new",
  "body_style": "sedan",
  "transmission": "cvt",
  "fuel_type": "gasoline",
  "exterior_color": "Lunar Silver Metallic",
  "image_url": "https://images.apexmotors.com/horizon-ex-2024.jpg",
  "url": "https://apexmotors.com/inventory/horizon-001",
  "tags": ["new-arrival"]
}

Flight catalog

Flight routes for travel ads and dynamic remarketing. Maps to Google DynamicFlightsAsset and Meta flight catalogs. Schema: /schemas/core/flight-item.json Required: flight_id, origin, destination Conversion events: purchase (booking)
FieldTypeDescription
flight_idstringUnique identifier for this route
originobject{ airport_code, city } — IATA 3-letter code required
destinationobject{ airport_code, city } — IATA 3-letter code required
airlinestringAirline name or IATA code
priceobject{ amount, currency }
descriptionstringRoute description or promotional text
departure_timedatetimeISO 8601
arrival_timedatetimeISO 8601
image_urluriDestination photo
urluriBooking page
tagsstring[]e.g., ["direct", "red-eye"]
Plus common fields (image_url, url, assets, tags, ext) shared by all verticals. Minimal — just required fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/flight-item.json",
  "flight_id": "ams-jfk-summer",
  "origin": { "airport_code": "AMS" },
  "destination": { "airport_code": "JFK" }
}
Full example with optional fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/flight-item.json",
  "flight_id": "ams-jfk-summer",
  "origin": { "airport_code": "AMS", "city": "Amsterdam" },
  "destination": { "airport_code": "JFK", "city": "New York" },
  "airline": "Acme Air",
  "price": { "amount": 449, "currency": "EUR" },
  "description": "Direct flights from Amsterdam to New York, daily departures.",
  "image_url": "https://images.acmeair.com/routes/ams-jfk.jpg",
  "url": "https://acmeair.com/flights/ams-jfk",
  "tags": ["direct", "transatlantic"]
}

Real estate catalog

Property listings for real estate ads. Maps to Google DynamicRealEstateAsset and Meta home listing catalogs. Schema: /schemas/core/real-estate-item.json Required: listing_id, title, address Conversion events: lead, schedule (viewing)
FieldTypeDescription
listing_idstringUnique identifier
titlestringListing title
descriptionstringProperty description
addressobject{ street, city, region, postal_code, country }
priceobject{ amount, currency, period } — use "month" for rentals
property_typeenumhouse, apartment, condo, townhouse, land, commercial
listing_typeenumfor_sale, for_rent
bedroomsintegerNumber of bedrooms
bathroomsnumberNumber of bathrooms (e.g., 2.5)
areaobject{ value, unit } — unit is sqft or sqm
locationobject{ lat, lng }
neighborhoodstringArea name
year_builtintegerYear built
tagsstring[]e.g., ["garden", "renovated"]
Plus common fields (image_url, url, assets, tags, ext) shared by all verticals. Minimal — just required fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/real-estate-item.json",
  "listing_id": "ams-jordaan-3br",
  "title": "Spacious 3BR Apartment in Jordaan",
  "address": { "city": "Amsterdam", "country": "NL" }
}
Full example with optional fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/real-estate-item.json",
  "listing_id": "ams-jordaan-3br",
  "title": "Spacious 3BR Apartment in Jordaan",
  "description": "Bright canal-view apartment with original features and modern kitchen, steps from Noordermarkt.",
  "address": {
    "street": "Prinsengracht 450",
    "city": "Amsterdam",
    "region": "NL-NH",
    "postal_code": "1017 KE",
    "country": "NL"
  },
  "price": { "amount": 650000, "currency": "EUR" },
  "property_type": "apartment",
  "listing_type": "for_sale",
  "bedrooms": 3,
  "bathrooms": 1,
  "area": { "value": 95, "unit": "sqm" },
  "location": { "lat": 52.3667, "lng": 4.8833 },
  "neighborhood": "Jordaan",
  "year_built": 1920,
  "tags": ["canal-view", "renovated"]
}

Education catalog

Educational programs and courses for student recruitment. Maps to Google DynamicEducationAsset and schema.org Course. Schema: /schemas/core/education-item.json Required: program_id, name, school Conversion events: submit_application, complete_registration
FieldTypeDescription
program_idstringUnique identifier
namestringProgram name
schoolstringInstitution name
descriptionstringProgram description
subjectstringField of study
degree_typeenumcertificate, associate, bachelor, master, doctorate, professional, bootcamp
levelenumbeginner, intermediate, advanced
priceobject{ amount, currency, period }
durationstringe.g., “4 weeks”, “2 years”
start_datedateNext available start date
languagestringLanguage code (e.g., “en”)
modalityenumonline, in_person, hybrid
locationstringCampus location (e.g., “Amsterdam, NL”). Omit for fully online.
tagsstring[]e.g., ["stem", "research"]
Plus common fields (image_url, url, assets, tags, ext) shared by all verticals. Minimal — just required fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/education-item.json",
  "program_id": "pinnacle-msc-cs-2025",
  "name": "MSc Computer Science",
  "school": "Pinnacle University"
}
Full example with optional fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/education-item.json",
  "program_id": "pinnacle-msc-cs-2025",
  "name": "MSc Computer Science",
  "school": "Pinnacle University",
  "description": "Two-year research master's covering AI, distributed systems, and software engineering.",
  "subject": "computer-science",
  "degree_type": "master",
  "level": "advanced",
  "price": { "amount": 2314, "currency": "EUR", "period": "year" },
  "duration": "2 years",
  "start_date": "2025-09-01",
  "language": "en",
  "modality": "in_person",
  "location": "Amsterdam, NL",
  "url": "https://pinnacle-university.com/programmes/masters/computer-science",
  "tags": ["stem", "research"]
}

Destination catalog

Travel destinations for destination ads and travel remarketing. Maps to Meta destination catalogs and Google travel ads. Schema: /schemas/core/destination-item.json Required: destination_id, name Conversion events: purchase (booking)
FieldTypeDescription
destination_idstringUnique identifier
namestringDestination name
descriptionstringHighlights and appeal
citystringCity name
regionstringState/province
countrystringISO 3166-1 alpha-2
locationobject{ lat, lng }
destination_typeenumbeach, mountain, urban, cultural, adventure, wellness, cruise
priceobjectStarting trip price
ratingnumber1–5
tagsstring[]e.g., ["family", "romantic"]
Plus common fields (image_url, url, assets, tags, ext) shared by all verticals. Minimal — just required fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/destination-item.json",
  "destination_id": "barcelona",
  "name": "Barcelona"
}
Full example with optional fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/destination-item.json",
  "destination_id": "barcelona",
  "name": "Barcelona",
  "description": "Mediterranean city blending Gaudí architecture, beaches, and world-class dining.",
  "city": "Barcelona",
  "region": "Catalonia",
  "country": "ES",
  "location": { "lat": 41.3874, "lng": 2.1686 },
  "destination_type": "urban",
  "price": { "amount": 399, "currency": "EUR" },
  "image_url": "https://images.acmetravel.com/barcelona/hero.jpg",
  "url": "https://acmetravel.com/destinations/barcelona",
  "rating": 4.7,
  "tags": ["city-break", "beach", "culture"]
}

App catalog

Mobile applications for app install and re-engagement campaigns. Maps to Google App Campaigns, Apple Search Ads, Meta App Ads, TikTok App Campaigns, and Snapchat App Install Ads. iOS and Android variants are separate items. Schema: /schemas/core/app-item.json Required: app_id, name, platform Conversion events: app_install, app_launch
FieldTypeDescription
app_idstringBuyer-assigned unique identifier
namestringApp display name
platformenumios, android
bundle_idstringReverse-domain identifier (e.g., com.acme.app)
apple_idstringNumeric Apple App Store ID (iOS only)
descriptionstringApp description (overrides store listing)
categorystringStore category (e.g., “games”, “finance”)
genrestringSub-genre (e.g., “puzzle”, “strategy”)
icon_urluriApp icon (1024x1024 px)
screenshotsuri[]App store screenshots
preview_video_urluriGameplay or demo video for video ad creatives
store_urluriApp store listing URL
deep_link_urluriFor re-engagement campaigns
priceobject{ amount, currency } — set amount to 0 for free
ratingnumber0–5 store rating
rating_countintegerTotal number of store ratings
content_ratingstringAge rating (e.g., “4+”, “Everyone”)
tagsstring[]e.g., ["casual", "offline"]
Plus common fields (assets, tags, ext) shared by all verticals. App items use icon_url and store_url instead of image_url and url. Minimal — just required fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/app-item.json",
  "app_id": "puzzlequest-ios",
  "name": "Puzzle Quest: Match 3",
  "platform": "ios"
}
Full example with optional fields:
{
  "$schema": "https://adcontextprotocol.org/schemas/v3/core/app-item.json",
  "app_id": "puzzlequest-ios",
  "name": "Puzzle Quest: Match 3",
  "platform": "ios",
  "bundle_id": "com.acmegames.puzzlequest",
  "apple_id": "1234567890",
  "category": "games",
  "genre": "puzzle",
  "icon_url": "https://assets.acmegames.com/puzzlequest/icon-1024.png",
  "store_url": "https://apps.apple.com/app/puzzle-quest-match-3/id1234567890",
  "price": { "amount": 0, "currency": "USD" },
  "rating": 4.7,
  "rating_count": 82000,
  "content_rating": "4+",
  "tags": ["casual", "offline"]
}