Contextual Enrichment Engine
How ACE derives contextual rules from your catalog and grounds every piece of generated content in them.
The Contextual Enrichment Engine (CEE) is what separates ACE from a prompt wrapper. Instead of generating each product description in isolation, it first reads a product set and derives contextual rules, then generates every piece of content against those rules. The result is output that stays consistent in tone, claims, and vocabulary across a whole catalog.
The eight sections
A rules generation pass produces eight sections:
| Section | What it captures |
|---|---|
| Consumer criteria | What a shopper in this category actually compares on |
| Product context | Where these products sit in the market and against each other |
| Use cases | The jobs the products get bought to do |
| Purchase occasions | When and why someone buys, including seasonality and gifting |
| Key entities | Brands, materials, standards, and terms worth naming |
| Target questions | The questions shoppers and AI assistants ask about this category |
| Differentiators | What genuinely distinguishes these products |
| Objections | The hesitations that stop a purchase, so content can answer them |
These rules are the grounding layer. Pass them into a content request and the generated copy will answer real objections and use your category's vocabulary rather than generic filler.
Three endpoints
The engine is exposed as three endpoints, and as MCP tools and SDK methods that call them.
1. Generate rules
POST /api/v1/enrichment/rules derives the eight sections from a product set and returns them synchronously.
curl -X POST https://ace.authoritas.com/api/v1/enrichment/rules \
-H "Authorization: Bearer $ACE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source": {
"type": "inline",
"products": [
{ "id": "sku-1", "title": "Merino base layer", "category": "Outdoor", "brand": "Fjell" },
{ "id": "sku-2", "title": "Merino hiking sock", "category": "Outdoor", "brand": "Fjell" }
]
},
"creativityLevel": 3
}'Give it a representative sample of a category rather than one product: the rules describe the category, so a broader sample produces sharper output. creativityLevel runs from 1 (conservative, sticks close to the source data) to 5 (bold).
2. Generate grounded content
POST /api/v1/enrichment/content generates the content types you ask for, per product, grounded in rules.
curl -X POST https://ace.authoritas.com/api/v1/enrichment/content \
-H "Authorization: Bearer $ACE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source": { "type": "inline", "products": [{ "id": "sku-1", "title": "Merino base layer" }] },
"contentTypes": ["product-description", "meta-tags", "jsonld-schema"],
"rules": { "...": "the object returned by /enrichment/rules" }
}'Omit rules and the engine generates them first, at the cost of an extra pass. Supply them when you are enriching many batches in the same category, so every batch is grounded identically.
3. Run the whole thing
POST /api/v1/enrichment/pipeline does both steps in one call: derive rules, then generate content for every product against them.
curl -X POST https://ace.authoritas.com/api/v1/enrichment/pipeline \
-H "Authorization: Bearer $ACE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source": { "type": "inline", "products": [ /* ... */ ] },
"contentTypes": ["product-description", "meta-tags"],
"targetLanguage": "de-DE"
}'This is the right entry point for a first run and for scheduled catalog refreshes.
Where products come from
Every endpoint takes the same source:
// Inline: you supply the products.
{ "type": "inline", "products": [{ "id": "sku-1", "title": "..." }] }
// Store: ACE reads them from a connected Shopify or WooCommerce store,
// and can write the results back.
{ "type": "store", "storeId": "...", "productIds": ["..."], "writeBack": true }A product needs only id and title. Everything else you pass through (brand, price, tags, images, attributes) becomes grounding signal, so send what you have.
Sync or async
rules always returns inline. content and pipeline decide from the size of the request: a small inline set runs immediately, anything larger returns 202 with a job envelope. Force it either way with "mode": "async" or "mode": "sync".
For a job, poll GET /api/v1/jobs/{id} and page the output from GET /api/v1/jobs/{id}/results, or subscribe to webhooks and skip polling. Send an Idempotency-Key header so a retry resumes the original job instead of starting a second one.
Content types
| Content type | API value |
|---|---|
| Product description | product-description |
| Meta tags and SEO | meta-tags |
| Enhanced JSON-LD schema | jsonld-schema |
| IRL scenario cards | irl-scenarios |
| Internal linking recommendations | internal-links |
| Google Shopping feed fields | google-shopping |
| Agentic Commerce feed fields | agentic-commerce |
| Microsoft Shopping feed fields | microsoft-shopping |
| Shopify feed fields | shopify |
Cost
Rules generation is charged per product in the sample. Content and pipeline runs are charged per product per content type, so ten products with three content types costs thirty units. Test keys draw on the free monthly quota instead of credits. See Credits and usage.
From an AI assistant
The same engine is available over MCP, so an assistant in Cursor, VS Code, or Claude can drive it directly:
generate_contextual_rulesenrich_contentrun_enrichment_pipelineget_enrichment_job,list_jobs,get_job_results,cancel_job
See MCP Server for setup.
Next steps
- Generating content at scale for batching and throughput
- Webhooks to react to finished jobs
- API Reference for the full request and response schemas
