ACE (Agentic Commerce Engine)

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:

SectionWhat it captures
Consumer criteriaWhat a shopper in this category actually compares on
Product contextWhere these products sit in the market and against each other
Use casesThe jobs the products get bought to do
Purchase occasionsWhen and why someone buys, including seasonality and gifting
Key entitiesBrands, materials, standards, and terms worth naming
Target questionsThe questions shoppers and AI assistants ask about this category
DifferentiatorsWhat genuinely distinguishes these products
ObjectionsThe 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 typeAPI value
Product descriptionproduct-description
Meta tags and SEOmeta-tags
Enhanced JSON-LD schemajsonld-schema
IRL scenario cardsirl-scenarios
Internal linking recommendationsinternal-links
Google Shopping feed fieldsgoogle-shopping
Agentic Commerce feed fieldsagentic-commerce
Microsoft Shopping feed fieldsmicrosoft-shopping
Shopify feed fieldsshopify

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_rules
  • enrich_content
  • run_enrichment_pipeline
  • get_enrichment_job, list_jobs, get_job_results, cancel_job

See MCP Server for setup.

Next steps

On this page