Agents lean on structured data to extract task-relevant facts without parsing prose. Product schema with offers tells an agent "yes, buyable, this price, in stock". Event schema gives date/location/booking URL. LocalBusiness gives hours and address. Without these, agents either guess from page content (often wrongly) or skip your site entirely. This guide covers the schema types and properties agents actually consume.
| Agent task | Schema type | Key properties |
|---|---|---|
| Buy product | Product | offers (price, availability, url) |
| Book event | Event | startDate, location, offers |
| Find/visit shop | LocalBusiness | address, openingHours, telephone |
| Cook recipe | Recipe | recipeIngredient, recipeInstructions, totalTime |
| Apply for job | JobPosting | title, hiringOrganization, jobLocation, baseSalary |
| Book table | FoodEstablishment + reservation | acceptsReservations, hasMenu, servesCuisine |
| Read review | Review / Product | reviewRating, author, itemReviewed |
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Blue Ceramic Widget",
"image": [
"https://example.com/widget-1.jpg",
"https://example.com/widget-2.jpg"
],
"description": "Hand-thrown ceramic widget, 12cm diameter, food-safe glaze.",
"sku": "WID-BLU-12",
"gtin": "0123456789012",
"brand": {
"@type": "Brand",
"name": "Acme Ceramics"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/widget-blue",
"priceCurrency": "GBP",
"price": "29.00",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2026-12-31",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": { "@type": "MonetaryAmount", "value": "4.99", "currency": "GBP" },
"deliveryTime": { "@type": "ShippingDeliveryTime", "transitTime": { "@type": "QuantitativeValue", "minValue": 2, "maxValue": 5, "unitCode": "DAY" } }
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "142"
}
}
</script>
Agent extracts: name, price, currency, availability, shipping cost and time, rating. Everything it needs to recommend or buy.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Annual Pottery Workshop",
"startDate": "2026-09-15T10:00:00+01:00",
"endDate": "2026-09-15T16:00:00+01:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"name": "Acme Studio",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 High Street",
"addressLocality": "Brighton",
"postalCode": "BN1 1AA",
"addressCountry": "GB"
}
},
"organizer": {
"@type": "Organization",
"name": "Acme Ceramics",
"url": "https://example.com"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/events/pottery-2026/book",
"price": "75.00",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"validFrom": "2026-06-01T00:00:00+01:00"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Acme Ceramics Studio",
"image": "https://example.com/studio.jpg",
"telephone": "+44-1273-555-0123",
"email": "hello@example.com",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 High Street",
"addressLocality": "Brighton",
"postalCode": "BN1 1AA",
"addressCountry": "GB"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 50.8225,
"longitude": -0.1372
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "09:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday"],
"opens": "10:00",
"closes": "16:00"
}
],
"url": "https://example.com"
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Recipe",
"name": "Simple Sourdough Bread",
"author": { "@type": "Person", "name": "Jane Baker" },
"datePublished": "2026-01-15",
"prepTime": "PT30M",
"cookTime": "PT45M",
"totalTime": "PT24H15M",
"recipeYield": "1 loaf",
"recipeCategory": "Bread",
"recipeCuisine": "European",
"recipeIngredient": [
"500g strong white bread flour",
"10g fine salt",
"350g water at 20°C",
"100g active sourdough starter"
],
"recipeInstructions": [
{ "@type": "HowToStep", "name": "Mix", "text": "Combine flour and water, rest 1 hour." },
{ "@type": "HowToStep", "name": "Add starter", "text": "Mix in starter and salt." },
{ "@type": "HowToStep", "name": "Bulk ferment", "text": "Rest 4 hours with folds every 30 minutes." }
],
"nutrition": {
"@type": "NutritionInformation",
"calories": "180 calories per slice"
}
}
</script>
JSON-LD in <head> reaches all agents:
<!DOCTYPE html>
<html>
<head>
<title>...</title>
<meta name="description" content="..." />
<script type="application/ld+json">
{ ... }
</script>
</head>
Avoid: schema injected via JS after page load — agents fetching raw HTML miss it. Schema must be server-rendered.
Verify schema coverage matches the tasks agents do on your site.
Run Agent Compat →