Virto Commerce · OpenAPI Overlay 1.0.0
API Evangelist conversational phrasing for VirtoCommerce. Marketing API
36 actions
36 updates
phrasing
extends
openapi/virto-commerce-marketing-api-openapi.yml
Generated by API Evangelist
Written by API Evangelist tooling for Virto Commerce's API. It is a proposal applied on top of the contract, not a document Virto Commerce publishes.
What the actions change
x-apievangelist-phrasing
Targets 36 · first 16 shown; the file carries all of them
$.info
$.paths['/api/marketing/contentplaces/listentries/search'].post
$.paths['/api/marketing/contentplaces/search'].post
$.paths['/api/marketing/contentitems/listentries/search'].post
$.paths['/api/marketing/contentitems/search'].post
$.paths['/api/marketing/contentpublications/search'].post
$.paths['/api/marketing/contentitems/evaluate'].post
$.paths['/api/marketing/contentitems/{id}'].get
$.paths['/api/marketing/contentitems'].put
$.paths['/api/marketing/contentitems'].post
$.paths['/api/marketing/contentitems'].delete
$.paths['/api/marketing/contentplaces/{id}'].get
$.paths['/api/marketing/contentplaces'].put
$.paths['/api/marketing/contentplaces'].post
$.paths['/api/marketing/contentplaces'].delete
$.paths['/api/marketing/contentpublications/new'].get
OpenAPI Overlay
# Generated by API Evangelist (build-phrasing.py). Our phrasing, not observed demand.
overlay: 1.0.0
info:
title: API Evangelist conversational phrasing for VirtoCommerce. Marketing API
version: 1.0.0
extends: openapi/virto-commerce-marketing-api-openapi.yml
actions:
- target: $.info
update:
x-apievangelist-phrasing:
method: generated
generated: '2026-09-26'
generator: build-phrasing.py
label: Generated by API Evangelist
operations: 35
- target: $.paths['/api/marketing/contentplaces/listentries/search'].post
update:
x-apievangelist-phrasing:
intent: Browse content place folders and entries
effect: read
questions:
- Can I browse content placeholders together with the folders they sit in?
- What is inside a given folder of dynamic content places?
instructions:
- text: List the folders and content places inside folder {folderId}.
slots:
folderId: requestBody.folderId
- text: Browse the content place tree for entries matching {keyword}.
slots:
keyword: requestBody.keyword
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentplaces/search'].post
update:
x-apievangelist-phrasing:
intent: Search dynamic content places
effect: read
questions:
- How do I find the placeholders on my storefront where dynamic content can show?
- Can I search content places by keyword without the folders mixed in?
instructions:
- text: Search content places for {keyword}.
slots:
keyword: requestBody.keyword
- text: Find only the content places, not folders, in folder {folderId}.
slots:
folderId: requestBody.folderId
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentitems/listentries/search'].post
update:
x-apievangelist-phrasing:
intent: Browse content item folders and entries
effect: read
questions:
- Can I browse dynamic content items along with the folders that organize them?
- What content items and subfolders live in a given content folder?
instructions:
- text: List the folders and content items inside folder {folderId}.
slots:
folderId: requestBody.folderId
- text: Browse the content item tree for entries matching {keyword}.
slots:
keyword: requestBody.keyword
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentitems/search'].post
update:
x-apievangelist-phrasing:
intent: Search dynamic content items
effect: read
questions:
- How do I find banners or other dynamic content items by keyword?
- Can I search only content items, leaving folders out of the results?
instructions:
- text: Search dynamic content items for {keyword}.
slots:
keyword: requestBody.keyword
- text: Find only the content items, not folders, in folder {folderId}.
slots:
folderId: requestBody.folderId
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentpublications/search'].post
update:
x-apievangelist-phrasing:
intent: Search content publications
effect: read
questions:
- Which content publications are currently active for my store?
- Can I find the publications targeting a specific placeholder name?
instructions:
- text: List active content publications for store {store}.
slots:
store: requestBody.store
- text: Find publications that target the content place named {placeName}.
slots:
placeName: requestBody.placeName
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentitems/evaluate'].post
update:
x-apievangelist-phrasing:
intent: Resolve which content to show in a placeholder
effect: read
questions:
- What content should display in a storefront placeholder for this shopper right now?
- Can dynamic content be targeted by the visitor's country or city?
- Can I evaluate placeholder content for a specific product page?
instructions:
- text: Get the dynamic content to show in place {placeName} for store {storeId}.
slots:
placeName: requestBody.placeName
storeId: requestBody.storeId
- text: Evaluate content for place {placeName} on product {productId}.
slots:
placeName: requestBody.placeName
productId: requestBody.productId
- text: Resolve placeholder {placeName} content for a visitor in {geoCountry}.
slots:
placeName: requestBody.placeName
geoCountry: requestBody.geoCountry
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentitems/{id}'].get
update:
x-apievangelist-phrasing:
intent: Get a dynamic content item
effect: read
questions:
- What does a single dynamic content item, like a banner, contain?
- Where do I read one content item by its ID?
instructions:
- text: Get dynamic content item {id}.
slots:
id: path.id
- text: Show the banner content item {id}.
slots:
id: path.id
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentitems'].put
update:
x-apievangelist-phrasing:
intent: Update a dynamic content item
effect: write
questions:
- How do I change the image or name of an existing content item?
- Can I move an existing content item into another folder?
instructions:
- text: Update content item {name} with image {imageUrl}.
slots:
name: requestBody.name
imageUrl: requestBody.imageUrl
- text: Move existing content item {name} to folder {folderId}.
slots:
name: requestBody.name
folderId: requestBody.folderId
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentitems'].post
update:
x-apievangelist-phrasing:
intent: Create a dynamic content item
effect: write
questions:
- How do I add a new banner or content block for the storefront?
- Which content type do I pick when creating a new content item?
instructions:
- text: Create a content item {name} of type {contentType}.
slots:
name: requestBody.name
contentType: requestBody.contentType
- text: Add a new content item {name} in folder {folderId}.
slots:
name: requestBody.name
folderId: requestBody.folderId
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentitems'].delete
update:
x-apievangelist-phrasing:
intent: Delete dynamic content items
effect: destructive
questions:
- How do I remove banners or content items I no longer use?
- Can I delete several content items at once?
instructions:
- text: Delete content items {ids}.
slots:
ids: query.ids
- text: Remove the dynamic content items with IDs {ids}.
slots:
ids: query.ids
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentplaces/{id}'].get
update:
x-apievangelist-phrasing:
intent: Get a dynamic content place
effect: read
questions:
- What is defined for one storefront placeholder?
- Where do I read a single content place by ID?
instructions:
- text: Get content place {id}.
slots:
id: path.id
- text: Show the placeholder definition {id}.
slots:
id: path.id
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentplaces'].put
update:
x-apievangelist-phrasing:
intent: Update a dynamic content place
effect: write
questions:
- How do I rename an existing storefront placeholder?
- Can I change the description of a content place I already set up?
instructions:
- text: Rename content place {id} to {name}.
slots:
id: requestBody.id
name: requestBody.name
- text: Update the description of content place {id} to {description}.
slots:
id: requestBody.id
description: requestBody.description
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentplaces'].post
update:
x-apievangelist-phrasing:
intent: Create a dynamic content place
effect: write
questions:
- How do I define a new placeholder slot where content can appear?
- Can I put a new content place inside a folder?
instructions:
- text: Create a content place named {name}.
slots:
name: requestBody.name
- text: Add a new content place {name} in folder {folderId}.
slots:
name: requestBody.name
folderId: requestBody.folderId
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentplaces'].delete
update:
x-apievangelist-phrasing:
intent: Delete dynamic content places
effect: destructive
questions:
- How do I remove placeholders that are no longer on the storefront?
- Can I delete several content places together?
instructions:
- text: Delete content places {ids}.
slots:
ids: query.ids
- text: Remove the placeholder definitions {ids}.
slots:
ids: query.ids
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentpublications/new'].get
update:
x-apievangelist-phrasing:
intent: Get a blank content publication template
effect: read
questions:
- Is there a pre-populated template to start a new content publication from?
- What does an empty content publication with its default condition tree look like?
instructions:
- text: Get a new blank content publication template.
- text: Give me the default skeleton for a content publication.
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentpublications/{id}'].get
update:
x-apievangelist-phrasing:
intent: Get a content publication
effect: read
questions:
- What items, places and dates are set on a given content publication?
- Where do I read one publication by ID?
instructions:
- text: Get content publication {id}.
slots:
id: path.id
- text: Show the schedule and targeting of publication {id}.
slots:
id: path.id
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentpublications'].put
update:
x-apievangelist-phrasing:
intent: Update a content publication
effect: write
questions:
- How do I change when an existing publication starts or ends?
- Can I deactivate a content publication without deleting it?
instructions:
- text: Change publication {name} to run from {startDate} to {endDate}.
slots:
name: requestBody.name
startDate: requestBody.startDate
endDate: requestBody.endDate
- text: Set existing publication {name} active flag to {isActive}.
slots:
name: requestBody.name
isActive: requestBody.isActive
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentpublications'].post
update:
x-apievangelist-phrasing:
intent: Create a content publication
effect: write
questions:
- How do I schedule content items to appear in placeholders for a store?
- Can a new publication be limited to a date range?
instructions:
- text: Create a publication {name} for store {storeId}.
slots:
name: requestBody.name
storeId: requestBody.storeId
- text: Publish content items {contentItems} to places {contentPlaces} starting {startDate}.
slots:
contentItems: requestBody.contentItems
contentPlaces: requestBody.contentPlaces
startDate: requestBody.startDate
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentpublications'].delete
update:
x-apievangelist-phrasing:
intent: Delete content publications
effect: destructive
questions:
- How do I remove content publications I no longer need?
- Can I delete several publications in one go?
instructions:
- text: Delete content publications {ids}.
slots:
ids: query.ids
- text: Remove the publications with IDs {ids}.
slots:
ids: query.ids
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentfolders/{id}'].get
update:
x-apievangelist-phrasing:
intent: Get a dynamic content folder
effect: read
questions:
- What does a content folder record hold?
- Where do I read a single content folder by ID?
instructions:
- text: Get content folder {id}.
slots:
id: path.id
- text: Show the dynamic content folder {id}.
slots:
id: path.id
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentfolders'].put
update:
x-apievangelist-phrasing:
intent: Update a dynamic content folder
effect: write
questions:
- How do I rename an existing content folder?
- Can I move a content folder under a different parent?
instructions:
- text: Rename content folder {id} to {name}.
slots:
id: requestBody.id
name: requestBody.name
- text: Move existing content folder {id} under folder {parentFolderId}.
slots:
id: requestBody.id
parentFolderId: requestBody.parentFolderId
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentfolders'].post
update:
x-apievangelist-phrasing:
intent: Create a dynamic content folder
effect: write
questions:
- How do I create a folder to organize content items and places?
- Can I nest a new content folder inside another?
instructions:
- text: Create a content folder named {name}.
slots:
name: requestBody.name
- text: Add a new content folder {name} inside {parentFolderId}.
slots:
name: requestBody.name
parentFolderId: requestBody.parentFolderId
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/contentfolders'].delete
update:
x-apievangelist-phrasing:
intent: Delete dynamic content folders
effect: destructive
questions:
- How do I remove content folders I no longer use?
- Can I delete several content folders at once?
instructions:
- text: Delete content folders {ids}.
slots:
ids: query.ids
- text: Remove the dynamic content folders {ids}.
slots:
ids: query.ids
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions/search'].post
update:
x-apievangelist-phrasing:
intent: Search promotions
effect: read
questions:
- Which promotions are active in my store right now?
- Can I list only the public promotions or those in a given status?
instructions:
- text: Search promotions for {keyword}.
slots:
keyword: requestBody.keyword
- text: List active promotions in store {store}.
slots:
store: requestBody.store
- text: Find promotions with status {status}.
slots:
status: requestBody.status
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions/evaluate'].post
update:
x-apievangelist-phrasing:
intent: Calculate which promotions apply to a cart
effect: read
questions:
- Which discounts would a shopper get for this cart total?
- Can I check whether first-time-buyer promotions apply to a customer?
- What rewards does the promotion engine return for a given store and currency?
instructions:
- text: Evaluate promotions for customer {customerId} in store {storeId}.
slots:
customerId: requestBody.customerId
storeId: requestBody.storeId
- text: Work out the promotion rewards for a cart total of {cartTotal} {currency}.
slots:
cartTotal: requestBody.cartTotal
currency: requestBody.currency
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions/{id}'].get
update:
x-apievangelist-phrasing:
intent: Get a promotion
effect: read
questions:
- What conditions and rewards are set on one promotion?
- Where do I read a single promotion by ID?
instructions:
- text: Get promotion {id}.
slots:
id: path.id
- text: Show the rules of promotion {id}.
slots:
id: path.id
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions/new'].get
update:
x-apievangelist-phrasing:
intent: Get a blank promotion template
effect: read
questions:
- Is there a starter promotion with the expression tree already filled in?
- What does an empty dynamic promotion look like before I configure it?
instructions:
- text: Get a new blank promotion template.
- text: Give me the default skeleton for a dynamic promotion.
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions'].put
update:
x-apievangelist-phrasing:
intent: Update a promotion
effect: write
questions:
- How do I change the usage limit on an existing promotion?
- Can I switch an existing promotion off without deleting it?
instructions:
- text: Change existing promotion {name} to allow at most {maxUsageCount} uses.
slots:
name: requestBody.name
maxUsageCount: requestBody.maxUsageCount
- text: Set existing promotion {name} active flag to {isActive}.
slots:
name: requestBody.name
isActive: requestBody.isActive
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions'].post
update:
x-apievangelist-phrasing:
intent: Create a promotion
effect: write
questions:
- How do I set up a new discount campaign for my stores?
- Can a new promotion be exclusive so it doesn't stack with others?
- Can I limit how many times each customer uses a new promotion?
instructions:
- text: Create a promotion {name} for stores {storeIds}.
slots:
name: requestBody.name
storeIds: requestBody.storeIds
- text: Create an exclusive promotion {name} starting {startDate}.
slots:
name: requestBody.name
startDate: requestBody.startDate
- text: Add promotion {name} limited to {maxPersonalUsageCount} uses per customer.
slots:
name: requestBody.name
maxPersonalUsageCount: requestBody.maxPersonalUsageCount
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions'].delete
update:
x-apievangelist-phrasing:
intent: Delete promotions
effect: destructive
questions:
- How do I permanently remove old promotions?
- Can I delete several promotions at once?
instructions:
- text: Delete promotions {ids}.
slots:
ids: query.ids
- text: Remove the promotions with IDs {ids}.
slots:
ids: query.ids
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions/coupons/search'].post
update:
x-apievangelist-phrasing:
intent: Search coupon codes
effect: read
questions:
- Which coupon codes belong to a given promotion?
- Can I look up whether a specific coupon code exists?
instructions:
- text: List coupons for promotion {promotionId}.
slots:
promotionId: requestBody.promotionId
- text: Find the coupon with code {code}.
slots:
code: requestBody.code
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions/coupons/{id}'].get
update:
x-apievangelist-phrasing:
intent: Get a coupon by ID
effect: read
questions:
- What details are stored for one coupon record?
- Where do I read a single coupon by its ID?
instructions:
- text: Get coupon {id}.
slots:
id: path.id
- text: Show the coupon record {id}.
slots:
id: path.id
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions/coupons/add'].post
update:
x-apievangelist-phrasing:
intent: Add coupons to promotions
effect: write
questions:
- How do I attach a set of new coupon codes to a promotion?
- Can I add many coupons in one request?
instructions:
- text: Add these coupon codes.
- text: Save this list of new coupons for my promotion.
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions/coupons/delete'].delete
update:
x-apievangelist-phrasing:
intent: Delete coupons
effect: destructive
questions:
- How do I remove coupon codes I issued by mistake?
- Can several coupons be deleted together?
instructions:
- text: Delete coupons {ids}.
slots:
ids: query.ids
- text: Remove the coupon records {ids}.
slots:
ids: query.ids
method: generated
generated: '2026-09-26'
- target: $.paths['/api/marketing/promotions/coupons/import'].post
update:
x-apievangelist-phrasing:
intent: Import coupons from a file
effect: write
questions:
- Can I bulk load coupon codes from a CSV file?
- Is it possible to set an expiration date on coupons during an import?
instructions:
- text: Import coupons from {fileUrl} into promotion {promotionId}.
slots:
fileUrl: requestBody.fileUrl
promotionId: requestBody.promotionId
- text: Import coupons from {fileUrl} using delimiter {delimiter}, expiring on {expirationDate}.
slots:
fileUrl: requestBody.fileUrl
delimiter: requestBody.delimiter
expirationDate: requestBody.expirationDate
method: generated
generated: '2026-09-26'