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 optionalassets 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:| Field | Type | Description |
|---|---|---|
image_url | uri | Primary image URL (most verticals — see note) |
url | uri | Landing page URL (most verticals — see note) |
assets | OfferingAssetGroup[] | Typed creative asset pools (landscape, vertical, square, logo, video) |
tags | string[] | Tags for filtering and targeting |
ext | object | Vendor-specific extensions |
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
| Field | Type | Description |
|---|---|---|
job_id | string | Unique identifier for this posting |
title | string | Job title |
company_name | string | Hiring company name |
description | string | Full job description |
location | string | Display string — “Amsterdam, NL” or “Remote” |
employment_type | enum | full_time, part_time, contract, temporary, internship, freelance |
experience_level | enum | entry_level, mid_level, senior, director, executive |
salary | object | { min, max, currency, period } — period is hour, month, or year |
date_posted | date | ISO 8601 date |
valid_through | date | Application deadline |
apply_url | uri | Direct application URL |
job_functions | string[] | e.g., ["engineering", "marketing"] |
industries | string[] | e.g., ["technology", "healthcare"] |
tags | string[] | For filtering — e.g., ["remote", "visa-sponsorship"] |
assets, tags, ext) shared by all verticals. Job items use apply_url instead of url and have no image_url.
Minimal — just required fields:
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)
| Field | Type | Description |
|---|---|---|
hotel_id | string | Unique identifier |
name | string | Property name |
description | string | Property description |
location | object | { lat, lng } — WGS 84 coordinates |
address | object | { street, city, region, postal_code, country } |
star_rating | integer | 1–5 |
price | object | { amount, currency, period } — use period "night" |
image_url | uri | Primary property image |
url | uri | Property landing page |
amenities | string[] | e.g., ["spa", "pool", "wifi"] |
check_in_time | string | HH:MM format (e.g., "15:00") |
check_out_time | string | HH:MM format (e.g., "11:00") |
phone | string | Property phone number in E.164 format |
valid_from | date | Start of seasonal availability window |
valid_to | date | End of seasonal availability window |
tags | string[] | e.g., ["luxury", "city-center"] |
image_url, url, assets, tags, ext) shared by all verticals.
Minimal — just required fields:
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)
| Field | Type | Description |
|---|---|---|
vehicle_id | string | Unique identifier |
title | string | Listing title (e.g., “2024 Apex Horizon EX Sedan”) |
make | string | Manufacturer |
model | string | Model name |
year | integer | Model year |
price | object | { amount, currency } |
condition | enum | new, used, certified_pre_owned |
vin | string | 17-character VIN |
trim | string | Trim level (e.g., “EX”, “Limited”) |
mileage | object | { value, unit } — unit is km or mi |
body_style | enum | sedan, suv, truck, coupe, convertible, wagon, van, hatchback |
transmission | enum | automatic, manual, cvt |
fuel_type | enum | gasoline, diesel, electric, hybrid, plug_in_hybrid |
exterior_color | string | Exterior color |
interior_color | string | Interior color |
location | object | { lat, lng } — dealer or vehicle location |
tags | string[] | e.g., ["low-mileage", "one-owner"] |
image_url, url, assets, tags, ext) shared by all verticals.
Minimal — just required fields:
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)
| Field | Type | Description |
|---|---|---|
flight_id | string | Unique identifier for this route |
origin | object | { airport_code, city } — IATA 3-letter code required |
destination | object | { airport_code, city } — IATA 3-letter code required |
airline | string | Airline name or IATA code |
price | object | { amount, currency } |
description | string | Route description or promotional text |
departure_time | datetime | ISO 8601 |
arrival_time | datetime | ISO 8601 |
image_url | uri | Destination photo |
url | uri | Booking page |
tags | string[] | e.g., ["direct", "red-eye"] |
image_url, url, assets, tags, ext) shared by all verticals.
Minimal — just required fields:
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)
| Field | Type | Description |
|---|---|---|
listing_id | string | Unique identifier |
title | string | Listing title |
description | string | Property description |
address | object | { street, city, region, postal_code, country } |
price | object | { amount, currency, period } — use "month" for rentals |
property_type | enum | house, apartment, condo, townhouse, land, commercial |
listing_type | enum | for_sale, for_rent |
bedrooms | integer | Number of bedrooms |
bathrooms | number | Number of bathrooms (e.g., 2.5) |
area | object | { value, unit } — unit is sqft or sqm |
location | object | { lat, lng } |
neighborhood | string | Area name |
year_built | integer | Year built |
tags | string[] | e.g., ["garden", "renovated"] |
image_url, url, assets, tags, ext) shared by all verticals.
Minimal — just required fields:
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
| Field | Type | Description |
|---|---|---|
program_id | string | Unique identifier |
name | string | Program name |
school | string | Institution name |
description | string | Program description |
subject | string | Field of study |
degree_type | enum | certificate, associate, bachelor, master, doctorate, professional, bootcamp |
level | enum | beginner, intermediate, advanced |
price | object | { amount, currency, period } |
duration | string | e.g., “4 weeks”, “2 years” |
start_date | date | Next available start date |
language | string | Language code (e.g., “en”) |
modality | enum | online, in_person, hybrid |
location | string | Campus location (e.g., “Amsterdam, NL”). Omit for fully online. |
tags | string[] | e.g., ["stem", "research"] |
image_url, url, assets, tags, ext) shared by all verticals.
Minimal — just required fields:
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)
| Field | Type | Description |
|---|---|---|
destination_id | string | Unique identifier |
name | string | Destination name |
description | string | Highlights and appeal |
city | string | City name |
region | string | State/province |
country | string | ISO 3166-1 alpha-2 |
location | object | { lat, lng } |
destination_type | enum | beach, mountain, urban, cultural, adventure, wellness, cruise |
price | object | Starting trip price |
rating | number | 1–5 |
tags | string[] | e.g., ["family", "romantic"] |
image_url, url, assets, tags, ext) shared by all verticals.
Minimal — just required fields:
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
| Field | Type | Description |
|---|---|---|
app_id | string | Buyer-assigned unique identifier |
name | string | App display name |
platform | enum | ios, android |
bundle_id | string | Reverse-domain identifier (e.g., com.acme.app) |
apple_id | string | Numeric Apple App Store ID (iOS only) |
description | string | App description (overrides store listing) |
category | string | Store category (e.g., “games”, “finance”) |
genre | string | Sub-genre (e.g., “puzzle”, “strategy”) |
icon_url | uri | App icon (1024x1024 px) |
screenshots | uri[] | App store screenshots |
preview_video_url | uri | Gameplay or demo video for video ad creatives |
store_url | uri | App store listing URL |
deep_link_url | uri | For re-engagement campaigns |
price | object | { amount, currency } — set amount to 0 for free |
rating | number | 0–5 store rating |
rating_count | integer | Total number of store ratings |
content_rating | string | Age rating (e.g., “4+”, “Everyone”) |
tags | string[] | e.g., ["casual", "offline"] |
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: