DTMFRAME Deals API
The Deals API from DTMFRAME — 1 operation(s) for deals.
The Deals API from DTMFRAME — 1 operation(s) for deals.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/dtmframe-com:dtmframe-com-deals-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: DTMFRAME public read Deals API
version: 0.1.0
description: 'Read-only product search and current offers (cheap_read) plus the bounded computations resolve_purchase_request and compare_products (bounded_compute, 10 per minute, shared with MCP). Same vocabulary, limits and channel policy as the MCP tools. No purchase execution; handoff_mode is always user_navigation. Personal conditions travel in POST bodies only and answers are no-store A foreign-currency amount may carry converted, a yen estimate with its rate source and reference date, never used for ordering or budget fit. list_deals (cheap_read) lists the recorded sales and campaigns. Every answer names canonical_page and site_entry_page: canonical_page is the page on this site with the complete price table (including listings the API does not return), the merchant purchase links and the affiliate disclosure; site_entry_page is the same page with the entry marker for this channel. Links are user_navigation handoffs and are not intended for prefetching or automatic clicking. Additive fields (schema_version unchanged): compare_products editions[].measurements carries the site''s own measurements (evidence_class=measured) in full — edition and product_version, environment, settings, measured_at, comparison conditions, procedure, results ({ value, decimals } per named field), failure cases, material rights and how the product was obtained; search_products products[].measurements carries a summary of the same records (evidence_id, edition_id, product_version, measured_at, results, runs, result_statistic, disclosure). Both are absent when there is none, carry no link and are not a sound-quality rating. The first page of a search_products call with no filter also carries a top-level measurements list: the site''s synthetic demonstrations (record_kind synthetic_demonstration; signal-processing facts shown with generated signals, no product) in full, with script_ref, signal_seed, libraries and artifact sha256 to run them again.'
servers:
- url: https://dtmframe.com
tags:
- name: Deals
paths:
/api/v1/deals/:
get:
operationId: list_deals
summary: Sales and campaigns (running first) with deadlines, check times, brands…
parameters:
- name: brand
in: query
required: false
schema:
description: Brand slug as on /brands/{slug}/ (the manufacturer_id from search_products is accepted too).
type: string
minLength: 1
maxLength: 160
pattern: ^[a-z0-9][a-z0-9_-]{0,159}$
- name: category
in: query
required: false
schema:
description: Category slug as on /categories/{slug}/, e.g. audio-interface (the search_products spelling audio_interface is accepted too).
type: string
minLength: 1
maxLength: 160
pattern: ^[a-z0-9][a-z0-9_-]{0,159}$
- name: kind
in: query
required: false
schema:
description: Campaign kind.
type: string
enum:
- sale
- giveaway
- purchase_bonus
- coupon
- bundle_change
- cashback
- upgrade_offer
- seasonal_feature
- name: source
in: query
required: false
schema:
description: official = manufacturer store, merchant = reseller or marketplace listings, announcement = manufacturer announcement without listings.
type: string
enum:
- official
- merchant
- announcement
- name: state
in: query
required: false
schema:
default: running
description: running (default) = active, ending_soon or stale; ending_soon; scheduled; all = every state including ended campaigns.
type: string
enum:
- running
- ending_soon
- scheduled
- all
- name: limit
in: query
required: false
schema:
default: 20
type: integer
minimum: 1
maximum: 50
- name: cursor
in: query
required: false
schema:
description: Opaque next_cursor of the previous page (bound to one published snapshot).
type: string
minLength: 1
maxLength: 256
responses:
'200':
description: Deals bound to one snapshot. An unknown brand or category yields 0 deals and unresolved_constraints=[brand_unresolved|category_unresolved]. Offers a source keeps off this channel never raise the discount; their omission is marked withheld_by_channel_policy. prices_from and largest_discount_percent use general-segment offers only; a sale with only restricted rows has prices_from [] and field_availability.prices_from unknown.
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
schema_version:
type: string
minLength: 1
request_id:
type: string
minLength: 1
maxLength: 160
catalog_snapshot_id:
type: string
minLength: 1
maxLength: 160
policy_snapshot_id:
type: string
minLength: 1
maxLength: 160
evaluation_scope_id:
type: string
pattern: ^es_[0-9a-f]{16}$
response_channel:
type: string
enum:
- api
- mcp
channel_class:
type: string
enum:
- web
- api
- mcp
- rss
- email
- social
- unknown
ruleset_version:
type: string
minLength: 1
computed_at:
type: string
pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$
unresolved_constraints:
type: array
items:
type: string
catalog_scope:
type: string
search_complete:
type: boolean
limits_hit:
type: array
items:
type: string
excluded_unknowns:
type: array
items:
type: string
purchase_execution_available:
type: boolean
const: false
affiliate_disclosure:
type: string
enum:
- none
- program_not_applied
- affiliate_link
data_mode_notice:
type: string
deals:
type: array
items:
type: object
properties:
campaign_id:
type: string
minLength: 1
maxLength: 160
slug:
type: string
minLength: 1
maxLength: 160
title:
type: string
minLength: 1
maxLength: 512
kind:
type: string
enum:
- sale
- giveaway
- purchase_bonus
- coupon
- bundle_change
- cashback
- upgrade_offer
- seasonal_feature
source:
type: string
enum:
- official
- merchant
- announcement
state:
type: string
enum:
- scheduled
- active
- ending_soon
- expired
- withdrawn
- unverified
- stale
starts_at:
type: string
pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$
ends_at:
type: string
pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$
deadline_status:
type: string
enum:
- known
- open_ended
- unknown
deadline_precision:
type: string
enum:
- datetime
- date
- unknown
deadline_date:
type: string
pattern: ^\d{4}-\d{2}-\d{2}$
checked_at:
type: string
pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$
fresh_until:
type: string
pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$
brands:
type: array
items:
type: object
properties:
slug:
type: string
minLength: 1
maxLength: 160
name:
type: string
minLength: 1
maxLength: 256
required:
- slug
- name
additionalProperties: false
categories:
type: array
items:
type: string
minLength: 1
maxLength: 160
target_edition_count:
type: integer
minimum: 0
maximum: 9007199254740991
products:
maxItems: 5
type: array
items:
type: object
properties:
product_id:
type: string
minLength: 1
maxLength: 160
slug:
type: string
minLength: 1
maxLength: 160
name:
type: string
minLength: 1
maxLength: 256
canonical_page:
type: string
maxLength: 2048
format: uri
required:
- product_id
- slug
- name
- canonical_page
additionalProperties: false
prices_from:
maxItems: 8
type: array
items:
type: object
properties:
amount_minor:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
currency:
type: string
enum:
- JPY
- USD
- EUR
- GBP
- KWD
currency_exponent:
type: integer
minimum: 0
maximum: 4
display:
type: string
minLength: 1
maxLength: 32
required:
- amount_minor
- currency
- currency_exponent
- display
additionalProperties: false
largest_discount_percent:
type: integer
minimum: 1
maximum: 99
has_free_item:
type: boolean
canonical_page:
type: string
maxLength: 2048
format: uri
site_entry_page:
type: string
maxLength: 2048
format: uri
field_availability:
type: object
propertyNames:
type: string
additionalProperties:
type: string
enum:
- available
- unknown
- withheld_by_channel_policy
- not_applicable
- not_recorded
withheld_fields:
type: array
items:
type: string
handoff_mode:
type: string
enum:
- user_navigation
required:
- campaign_id
- slug
- title
- kind
- source
- state
- deadline_status
- deadline_precision
- checked_at
- fresh_until
- brands
- categories
- target_edition_count
- products
- prices_from
- has_free_item
- canonical_page
- site_entry_page
- field_availability
- withheld_fields
- handoff_mode
additionalProperties: false
description: 'Order: running first (active and ending_soon, then stale), then scheduled, unverified, expired, withdrawn; within a group the nearest known end first (deals without a known end after those with one), then checked_at newest first, then campaign_id ascending.'
next_cursor:
type:
- string
- 'null'
required:
- schema_version
- request_id
- catalog_snapshot_id
- policy_snapshot_id
- evaluation_scope_id
- response_channel
- channel_class
- ruleset_version
- computed_at
- unresolved_constraints
- catalog_scope
- search_complete
- limits_hit
- excluded_unknowns
- purchase_execution_available
- affiliate_disclosure
- deals
- next_cursor
additionalProperties: false
'400':
description: Unknown query key, invalid value or invalid cursor. The body carries codes only.
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
error:
type: string
status:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
fields:
type: array
items:
type: string
retry_after_seconds:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
required:
- error
- status
additionalProperties: false
'429':
description: Rate limited (cheap_read class). Retry-After is set.
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
error:
type: string
status:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
fields:
type: array
items:
type: string
retry_after_seconds:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
required:
- error
- status
additionalProperties: false
'503':
description: Publication is not open. Retry-After is set.
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
error:
type: string
status:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
fields:
type: array
items:
type: string
retry_after_seconds:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
required:
- error
- status
additionalProperties: false
tags:
- Deals
x-mcp:
endpoint: /mcp/
transport: streamable-http (stateless; POST carries JSON-RPC with JSON responses, GET opens the server-to-client SSE stream of comment lines, OPTIONS answers the CORS preflight, DELETE is 405)
tools:
- search_products
- get_current_offers
- resolve_purchase_request
- compare_products
- list_deals
tool_classes:
search_products: cheap_read
get_current_offers: cheap_read
resolve_purchase_request: bounded_compute
compare_products: bounded_compute
list_deals: cheap_read
operation_classes:
protocol_control: 120
cheap_read: 60
bounded_compute: 10
page: 240