S
Syntalic — Data Analytics for Agentic Commerce
OtherAbout Syntalic — Data Analytics for Agentic Commerce
Review the Service identity, supported languages, protocol versions, and source metadata discovered by the directory.Service details
Service Id
7d29592f-f43c-4c09-bc6e-eb1991f3014b
Service origin
https://api.syntalic.com
ListedSeptember 24, 2026, 6:58 PM
Last checkedSeptember 24, 2026, 8:12 PM
Protocol details
SourceOpenAPI
Endpoints
Endpoint details are saved from the OpenAPI document. Authentication requirements and prices are advertised information, not a verified payment or access guarantee. The document may contain additional endpoints.GET/v1/analyst/category-concentration
Measure how concentrated a category is
How concentrated or fragmented a category is: HHI on the standard 0-10,000 scale, CR4 (the combined share of the four largest brands), the effective number of brands, and a plain-language label. Answers 'is this category competitive or dominated', 'how many real players are there', and 'what is the market structure'. Computed over the same brand vector share-of-shelf returns, so the two answers can never disagree about who is on the shelf. The HHI bands follow the US DOJ/FTC Horizontal Merger Guidelines (under 1,500 competitive; 1,500-2,500 moderately concentrated; above 2,500 highly concentrated). Effective brands is 1/HHI expressed as a count and is fractional by nature - fifty brands where one holds 90% is not a fifty-brand market, and this reports roughly 1.2. Every metric is withheld together (all null) below five brands, because a concentration figure over three brands describes who happens to be in the catalog rather than who competes.0.020000 USDGET/v1/analyst/category-summary
High-level summary statistics for a category or department
High-level category statistics - product/brand/retailer counts, pricing (avg/min/max/median), promo rate, in-stock rate, and top brands. Headline stats are representativeness-filtered (no refurb/used, no accessory/parts subtrees, category-aware price floor) with exclusion counts disclosed in `excluded`; brand_count and top_brands merge brand variants on the canonical key and exclude placeholders.0.020000 USDGET/v1/analyst/inflation
Track price inflation trends in a category or department
Track category-level price inflation with configurable daily, weekly, or monthly granularity. PREFER lfl_change_pct: the like-for-like change over the whole window, computed per product between the first and last period and summarised as a trimmed mean, with lfl_matched / lfl_rising / lfl_stable / lfl_falling beside it. It is the SAME definition the Syntalic dashboards report, so an API answer and a dashboard answer agree, and it is withheld (null, with lfl_note) rather than estimated when fewer than 10 products match. The legacy chained fields remain for compatibility and are DEPRECATED: overall_change_pct chains per-period Jevons matched-pairs changes, and naive_overall_change_pct is an average-vs-average fallback that moves when the basket composition changes even if no price moved — do not treat it as inflation. The catalog refresh cadence is monthly, so granularity=monthly gives the most stable matched baskets.0.020000 USDGET/v1/analyst/price-bands
Price band and tiers for a category node
The price architecture of one shelf: the comparability window that defines 'similarly priced' there, and the shelf's price tiers. Scoped by ladder NODE (a Shopify taxonomy path like 'electronics/computers'), because a band is a property of one shelf. The window is derived in log space from the shelf's own robust spread over a 90-day window, so it is relative rather than a fixed dollar range - tight where a shelf clusters (video-game accessories run ±10%), wide where it spreads (car-care tools run ±60%). Tiers are equal-population, so 'premium' means the same thing on a $5-$40 shelf and a $400-$4,000 one. A shelf with too few products to define a distribution inherits its parent's window (disclosed in band.inherited_from) with the tier ladder re-centred on its own median; a shelf where a fifth of products share one price reports fewer than five tiers rather than an empty one.0.020000 USDGET/v1/analyst/price-change-leaders
Rank the biggest price movers in a category or brand
Per-product price-change leaderboard: the biggest droppers and gainers in a category or for a brand. Each product's change is LIKE-FOR-LIKE between two matched bands - the best price now versus the best price a window ago - over win = 7, 30 (default) or 90 days, which is the same comparison the Syntalic dashboards show. Only the two bands are scanned, never the dead middle of the window, so a product observed twice in one day cannot masquerade as a 90-day move. Changes beyond 50% in either direction are dropped as data errors rather than reported as news: a product does not fall 97% in a month, a mis-keyed price does, and it would otherwise top a list sorted by absolute change. The rising/stable/falling counts describe the WHOLE matched set the movers were drawn from, so a leaderboard can never imply more churn than the shelf actually had. DISTINCT from /v1/analyst/inflation, which is the category-level read over a quarter or longer; this is which individual SKUs moved. At least one of category or brand is r…0.020000 USDGET/v1/analyst/price-dispersion
Analyze price spread across retailers for a category or department
Analyze the spread of current prices within a category - mean, stddev, coefficient of variation, and percentiles (p10..p90) with IQR outlier exclusion. The population is representativeness-filtered: refurbished/used listings, accessory/parts subtrees, and rows under a category-aware price floor are excluded from headline stats, with the counts disclosed in `excluded`.0.020000 USDGET/v1/analyst/retailer-index
Price index for a specific retailer over time
Compute a normalized price index (retailer avg / category avg) for a specific retailer day-by-day versus its category baseline. Points report insufficient_sample below sample_threshold products plus stable_avg_price over the products priced every day — read trends from the stable series.0.020000 USDGET/v1/marketing/availability-index
Measure out-of-stock rates by retailer or category
Out-of-stock rate by retail chain or by category root - an on-shelf availability read rather than a pricing one. Answers 'which retailers are running out of stock', 'what is the stockout rate in this category', and 'is my brand actually on shelf'. Pivot with aggregate_by: 'seller' (default) ranks chains, 'category_root' ranks categories. The denominator is rows where availability was actually OBSERVED, never all rows: roughly 40% of listings carry no availability signal, and counting those as in-stock would report a healthy shelf whenever coverage is poor. availability_coverage reports what share of the scoped shelf carried a signal, so you can tell a genuine 5% stockout rate from one computed over a tenth of the listings. Groups with fewer than five observed rows are dropped rather than shown with a caveat - a rate from two rows is noise wearing a percentage sign. Unlike the pricing endpoints this one does NOT exclude price-flagged rows: the flag marks an untrustworthy price, not an untrustworthy listing, a…0.010000 USDGET/v1/marketing/brand-breakdown
Break a brand's assortment down by category
What a brand actually sells: a count of its distinct priced products under each category root, ranked. Answers 'what is this brand's product mix' and 'which categories does it really compete in' - useful before a positioning or shelf question, so the comparison targets the category the brand is densest in rather than whichever one was guessed. Brand input matches case-insensitively and across normalization variants (jbl == JBL, tplink == TP-Link); placeholder brands are excluded. Counts only products carrying a current price in the requested country, so a brand present in the catalog but unpriced reads as empty coverage rather than as absent. Carries the coverage and freshness envelope: coverage.products is the total counted, and coverage.note explains an empty result rather than leaving an empty list to imply the brand sells nothing.0.010000 USDGET/v1/marketing/brand-tracker
Track a brand's pricing and presence over time
Track a brand's average/min/max price, product count, in-stock count, and promo count day-by-day across a date range. Brand input matches case-insensitively and across normalization variants (jbl == JBL, tplink == TP-Link). Each point reports insufficient_sample when its basket is under sample_threshold products, plus stable_avg_price computed over only the products priced on every day of the series — use stable_avg_price for trend reads; the all-products average moves with basket composition.0.010000 USDGET/v1/marketing/competitive-landscape
View all products and pricing in a category
View every product and its current pricing within a category across retailers. Sortable by price (rating/review sorts are accepted for compatibility and fall back to price ordering). Each item carries a condition label (new/refurbished/used) so refurb listings are distinguishable, plus a nullable gpc block (fail-soft). Offset-cursor paginated.0.010000 USDGET/v1/marketing/price-positioning
Analyze a brand's price positioning vs competitors
Compare a brand's average current price to the category average/median and classify positioning as premium, mid-range, or value.0.010000 USDGET/v1/marketing/promo-intelligence
Analyze promotional activity in a category
Analyze promotional activity within a category - promo frequency, average and max discount depth - over a date range. Pivot the breakdown with `aggregate_by`: default `brand` ranks brands within the category; `retailer` ranks retailers (use together with `brand=<name>` to answer 'which retailers run the deepest promos on Brand X in Category Y'). The response key mirrors the dimension: `brands: [...]` or `retailers: [...]`.0.010000 USDGET/v1/marketing/retailer-assortment
Find which retail chains carry a brand or category
Which retail CHAINS carry a brand or a category, ranked by how many distinct priced products each lists, with that chain's average and median price. Answers 'who stocks this brand', 'where can I find it', and 'which retailers carry the most of this category'. Grouped on the retailer chain, never on the scrape lane - a lane like 'shopify' spans hundreds of storefronts, so grouping by it would answer 'which retailer' with 'shopify'. At least one of brand or category is required. Price statistics exclude rows the pipeline flagged as incoherent while the COUNTS keep them: a chain that genuinely carries the brand should not disappear because one of its prices is wrong. DISTINCT from share-of-shelf, which answers which BRANDS hold a category's shelf.0.010000 USDGET/v1/marketing/share-of-shelf
See brand market share within a category
Measure each brand's market share within a category by product count. Shows digital shelf dominance. Brand rows are merged across source variants ('JBL'/'jbl', 'TP-Link'/'tplink') with one canonical display label; placeholder brands (null, 'no', 'Generic') are excluded.0.010000 USDGET/v1/public/brands
List brands in the catalog
Zero-cost aggregate discovery endpoint. One row per normalized brand with a display label and served product count; optional q prefix-matches the normalized key (JBL == jbl).Price unavailableGET/v1/public/categories
Browse public category taxonomy
Zero-cost aggregate category discovery endpoint. Returns category path nodes and rolled-up product counts; row-level product data remains on paid endpoints.Price unavailableGET/v1/public/coverage
Catalog coverage map (depth/quality per cell)
Zero-cost aggregate discovery endpoint. Coverage + freshness per (platform, country, category_root): priced/recent/known-brand product counts and quality_status (serving/thin/stale — computed from shelf volume and 90-day freshness, never from how the data is acquired), so an agent can gauge whether a paid query will hit deep data. Row-level product data remains on paid endpoints.Price unavailableGET/v1/public/retailers
List retailers (platforms) in the catalog
Zero-cost aggregate discovery endpoint. One row per platform with served product count, countries seen, and freshest observation; row-level product data remains on paid endpoints.Price unavailableGET/v1/public/stats
Catalog coverage and freshness stats
Zero-cost aggregate discovery endpoint with catalog coverage, category tree counts, retailer count, and latest priced-data timestamp.Price unavailableGET/v1/reference/brick-attributes
GS1 GPC attribute schema for one or more bricks
Return the GPC attribute schema for one or more bricks - attribute names and their allowed value sets. Accepts up to 100 comma-separated gpc_code values. Use this to discover which attributes GS1 defines for a product category (for example Formation, If Organic) and the controlled vocabulary each one permits. Bricks that define no attributes return an empty attributes array.0.010000 USDGET/v1/reference/classify
Map Amazon browse node ids to GS1 GPC codes
Map Amazon browse node ids or product-type phrases to GS1 GPC codes. Accepts up to 100 comma-separated browse_id values or q phrases per request (not both). Each browse result carries GPC ancestry, match_precision (SKOS-style), match_source (self | inherited), assurance_state, and browse_node { name, path, in_serving_catalog }. Unmapped ids come back with gpc: null so the response lines up 1:1 with the request. Phrase results are certain-or-blank: a hit is always curated. A class-level hit (e.g. coffee → 50202600) includes forms[] — the child bricks; ask the user which form if they need a leaf, or pass the class code as category= (it matches every brick beneath). An empty gpc list always includes miss { reason, detail, hint, try, candidates }. reason is unmatched_phrase, or ambiguous when several GPC types share the head (fish → prepared vs raw). hint is built from this query; try is nearby lexicon phrases; candidates are competing type identities (code + title), not keyword hits like fish oil. Do not treat …0.010000 USDGET/v1/reference/reverse
Map GS1 GPC codes back to Amazon browse nodes
Reverse the crosswalk: given GS1 GPC codes, return the Amazon browse nodes mapped onto them. Accepts up to 100 comma-separated gpc_code values. browse_node_count is the true total per code; browse_ids is capped per code (see ids_per_code_cap in the response) because a coarse segment can carry thousands of nodes and an uncapped batch would be enormous. browse_nodes is the same list with name, path, and in_serving_catalog when taxonomy_nodes is published (null name/path until the next serving swap). Codes with no mapped nodes return an empty list rather than being omitted.0.010000 USDGET/v1/shopper/best-price
Find the best price for a product across retailers
Returns a nullable `gpc` block identifying the resolved product's GS1 GPC product type (code, title, full ancestry, and how exact the mapping is) — null when the product's category has no GPC mapping. Find the lowest current price for a product across retailers in US and Canada. Cross-retailer comparison is entity-matched (barcode-anchored resolution links the same physical product across platforms). Returns the cheapest option plus other retailer prices for comparison. Every price row is labeled match_type: 'entity' (verified same product) or 'title' (text match — may be a variant on broad queries); pass strict=true to restrict the comparison to entity-verified rows only. Comparison rows carry observed_at so mixed-vintage prices are distinguishable.0.010000 USDGET/v1/shopper/deal-finder
Find discounted products in a category
Discover discounted in-stock products in a category above a minimum discount threshold (discount = current price below the retailer's list price). Quality-gated: unbranded listings, sub-$5 items, and discounts above 70% (the inflated-list-price spam signature) are excluded. Ranked by discount depth weighted by log(price), so meaningful discounts on real products outrank deep cuts on trinkets. Each deal carries observed_at (when its price was seen) and a nullable gpc block (fail-soft).0.010000 USDGET/v1/shopper/price-drop-alert
Check for recent price drops on a product
Check whether a product's current price is below its rolling average within a configurable lookback window. Returns current price vs. the average across the window plus the lowest-seen price and date. Response field `avg_price_last_30d` is a fixed name for backwards compatibility; the value is always computed across the configured `lookback_days` window. Includes a nullable gpc block for the resolved product (fail-soft).0.010000 USDGET/v1/shopper/price-history
Get price history for a product over time
Get historical price observations for a product within a date range. Returns current price, period low/high/avg, trend (rising/falling/stable), good-deal flag, and an observation time-series for charting. Includes a nullable gpc block for the resolved product (fail-soft).0.010000 USDGET/v1/social/attention-vs-shelf
Rank brands by share-of-conversation vs share-of-shelf gap
Brands ranked by the GAP between share of social conversation and share of shelf inside one category. Over-indexed attention with under-distribution is the ranging signal a retail buyer wants and the deck slide a challenger brand wants - one endpoint, two customer types. Requires BOTH corpora bound to the same category axis and the same brand key, which is why nobody holding one of them can reproduce it. The join is on brand KEY, never on name: a row whose key is absent from the other side is dropped and COUNTED in `unmatched`, because matching by name mislabels a real brand as under-distributed. Carries TWO coverage blocks and TWO freshness values - social counts mention subjects on a weekly refresh, shelf counts products on a daily one, and merging either pair would be a lie with a familiar shape. `shelf_brands_not_in_conversation` is the mirror finding: stocked and unspoken of.0.050000 USDGET/v1/social/brand-momentum
Rank brands by conversation momentum in a category
Brands ranked by MOVEMENT in a category's conversation — new entrants first, then the biggest risers and fallers by mention growth. This is the trend view over the same rows brand-share ranks by volume: one dataset, two questions, deliberately not two copies. Each row carries its prior-window base and a `thin_base` flag; `thin_base_rows` on the response counts them, because a 900% rise from two mentions is arithmetic, not a trend. Pass `status=new` for emerging-brand detection (brands appearing in the conversation with no prior-window presence), `rising` or `falling` to filter direction.0.030000 USDGET/v1/social/brand-share
Share of social conversation by brand
Share of social conversation by brand inside a category, with movement. `mentions` is the event count and is the comparison currency; `views` is view-weighted reach and is reported SEPARATELY. share_pct is computed on mentions, never on views - Instagram stills report no plays, so view-weighting renders active subcategories as 0%. `category` is required: there is no default aisle, because inheriting one would sell a department-wide number under an aisle-shaped label. Each row carries `rank`, its position in the category by mentions - emitted ONLY on an unfiltered request, because with `brand` set the page is one row and any ordinal on it would be meaningless. A row may also carry `tied_with`, the 1-based positions of other rows within 5% of its mention count: that is PAIRWISE proximity, not an equivalence class, so A near B and B near C does not make A near C. `organic_only` filters to posts the provider did not mark as an ad (`isAd` on TikTok, `paidPartnership` on Instagram); each slice is its own denominat…0.030000 USDGET/v1/social/category-structure
Show which subcategories own a category's conversation
Which subcategories own a category's conversation, and how concentrated it is: mentions, share, growth, the leading brand, top-2 concentration, and the share of mentions carried by a single creator. A creator_top_pct at or above 60 means one voice carries the subcategory, which is a different fact from a brand leading it. `thin_base` marks rows whose prior-period base was too small for the growth figure to mean anything - a 900% rise from two mentions is arithmetic, not a trend, and the flag says so rather than letting the number stand alone.0.030000 USDGET/v1/social/creator-index
Rank creators by mention volume in a category
Creators ranked by mention volume within a CPG category, with follower tier, reach, organic share, engagement rate and momentum. Answers 'who is talking about this category', 'which creators drive the conversation', and 'who is new this window'. Handles are public identifiers; no contact details, no post links, no captions or transcripts are ever returned. Covers TikTok and Instagram only - this is not a general social-listening feed, and nothing in the pipeline reads X, YouTube or Reddit. The corpus is a tracked set, not the market universe, so shares describe conversation we observed rather than all conversation that happened. The rollup publishes category-level rows only. `organic_only` works, and `organic_pct` reports each creator's organic share of their own mentions. `followers` and `tier` are derived at publish from the corpus's own pull payloads (TikTok author metadata; an Instagram profile sidecar), banded Nano <10K / Micro 10-50K / Small 50-100K / Mid 100-500K / Macro 500K-1M / Mega 1M+. A null on …0.030000 USDGET/v1/social/launch-buzz
New shelf arrivals vs the conversation around their brand
New shelf arrivals in the window set against the conversation around their brand: which launches landed with traction and which landed in silence. SILENT LAUNCHES ARE RETURNED, FLAGGED - most launches are silent, so filtering them out answers a different and much less useful question. Mentions are BRAND-level in the window, not per SKU: the corpus resolves conversation to brands, and the field is named so the number cannot be read as proof anyone discussed that specific product. First-seen is the earliest observation of the product in the requested country - so rows flagged `new_store` are first observations of a STORE that entered observation inside the window (stores onboard in waves, and a new store's whole catalog gets a first observation at once). Those are catalog backfill wearing the shape of a launch: flagged rather than filtered, counted in `new_store_launches`, and not to be reported as product launches.0.050000 USDGET/v1/social/product-type-trends
Attention by product type within a category
Attention by product type within a category: which types own the conversation and how that mix is shifting. `share_pct` is the type's share of MENTION COUNTS in scope — the same mention-not-view rule every social endpoint holds, because Instagram stills report no plays. Movement fields (growth, is_new, thin_base) follow the same conventions as brand-momentum.0.030000 USDGET/v1/social/series
Weekly mentions/views time series for one subject
Weekly mentions and views time series for one subject — a brand or a category — for charting and modelling. Weeks, not days: the corpus refresh is weekly, and a daily grain would imply precision the pipeline does not have. Coverage counts the WEEKS the series actually has and says so; a 4-week series answering a 26-week request is disclosed, never padded.0.030000 USDGET/v1/social/topic-trends