openapi: 3.2.0
info:
title: Bitculator Data Editorial API
description: 'Programmatic access to Bitculator market data: coins, prices, history, exchanges, trust scores, tickers, pairs, wallets, sentiment, technical indicators, liquidations, editorial content, and calculators.'
version: 1.0.0
servers:
- url: https://bitculator.com
security:
- default: []
tags:
- name: Editorial
description: 'Editorial articles — published (ACTIVE) only. `locale` picks the content language
with per-field English fallback (the payload reports which `locale` actually won).
Articles can be filtered by tag or by a related coin/exchange/wallet slug. API
reads deliberately do NOT increment view counts.'
paths:
/api/v1/coins/{slug}/videos:
parameters:
- in: path
name: slug
description: The coin's slug identifier.
example: bitcoin
required: true
schema:
type: string
get:
summary: Coin videos
operationId: coinVideos
description: Curated videos attached to a coin (the coin page's Videos tab), paginated.
parameters:
- in: query
name: page
description: Page number (1-based).
example: 1
required: false
schema:
type: integer
description: Page number (1-based).
example: 1
- in: query
name: per_page
description: Rows per page (1–50, default 10).
example: 10
required: false
schema:
type: integer
description: Rows per page (1–50, default 10).
example: 10
- in: query
name: type
description: Filter by video type (e.g. `overview`, `tutorial`, `explainer`, `review`, `analysis`, `news`).
example: review
required: false
schema:
type: string
description: Filter by video type (e.g. `overview`, `tutorial`, `explainer`, `review`, `analysis`, `news`).
example: review
- in: query
name: search
description: Free-text match on the title.
example: halving
required: false
schema:
type: string
description: Free-text match on the title.
example: halving
responses: []
tags:
- Editorial
/api/v1/coins/{slug}/insights:
parameters:
- in: path
name: slug
description: The coin's slug identifier.
example: bitcoin
required: true
schema:
type: string
get:
summary: Coin insight timeline
operationId: coinInsightTimeline
description: 'The coin''s insight timeline — the same payload the asset page''s insights panel
uses, windowed by `offset`/`limit`.'
parameters:
- in: query
name: locale
description: Content language (falls back to English).
example: en
required: false
schema:
type:
- string
- 'null'
description: Content language (falls back to English).
example: en
- in: query
name: offset
description: Rows to skip (0–500, default 0).
example: 0
required: false
schema:
type:
- integer
- 'null'
description: Rows to skip (0–500, default 0).
example: 0
- in: query
name: limit
description: Rows to return (1–50, default 5).
example: 5
required: false
schema:
type:
- integer
- 'null'
description: Rows to return (1–50, default 5).
example: 5
responses: []
tags:
- Editorial
/api/v1/articles:
get:
summary: List articles
operationId: listArticles
description: 'Published articles, newest first, paginated. Filter by `tag` or by a related
`coin` / `exchange` / `wallet` slug, or free-text `search`. Each row is a summary
(title, subtitle, tags, reading time, hero image, related entities, dates).'
parameters:
- in: query
name: page
description: Page number (1-based).
example: 1
required: false
schema:
type:
- integer
- 'null'
description: Page number (1-based).
example: 1
- in: query
name: per_page
description: Rows per page (1–50, default 20).
example: 20
required: false
schema:
type:
- integer
- 'null'
description: Rows per page (1–50, default 20).
example: 20
- in: query
name: locale
description: Content language (falls back to English).
example: en
required: false
schema:
type:
- string
- 'null'
description: Content language (falls back to English).
example: en
- in: query
name: tag
description: 'Filter by tag: news, guide, tutorial, explainer, analysis, review, trading, overview or information.'
example: guide
required: false
schema:
type:
- string
- 'null'
description: 'Filter by tag: news, guide, tutorial, explainer, analysis, review, trading, overview or information.'
example: guide
- in: query
name: coin
description: Filter to articles related to this coin slug.
example: bitcoin
required: false
schema:
type:
- string
- 'null'
description: Filter to articles related to this coin slug.
example: bitcoin
- in: query
name: exchange
description: Filter to articles related to this exchange slug.
example: binance-exchange
required: false
schema:
type:
- string
- 'null'
description: Filter to articles related to this exchange slug.
example: binance-exchange
- in: query
name: wallet
description: Filter to articles related to this wallet slug.
example: frostsnap
required: false
schema:
type:
- string
- 'null'
description: Filter to articles related to this wallet slug.
example: frostsnap
- in: query
name: search
description: Free-text match on heading/subheading.
example: halving
required: false
schema:
type:
- string
- 'null'
description: Free-text match on heading/subheading.
example: halving
responses:
'200':
description: ''
content:
application/json:
schema:
type: object
example:
data:
- id: 14
slug: what-is-bitcoin
title: What Is Bitcoin?
subtitle: A plain-language introduction to the first cryptocurrency.
locale: en
tags:
- guide
- analysis
reading_time_minutes: 7
hero_image: https://bitculator.com/storage/media/articles/what-is-bitcoin.png
entities: []
published_at: '2026-06-21'
updated_at: '2026-06-21'
meta:
current_page: 1
per_page: 20
total: 10
last_page: 1
properties:
data:
type: array
example:
- id: 14
slug: what-is-bitcoin
title: What Is Bitcoin?
subtitle: A plain-language introduction to the first cryptocurrency.
locale: en
tags:
- guide
- analysis
reading_time_minutes: 7
hero_image: https://bitculator.com/storage/media/articles/what-is-bitcoin.png
entities: []
published_at: '2026-06-21'
updated_at: '2026-06-21'
items:
type: object
properties:
id:
type: integer
example: 14
slug:
type: string
example: what-is-bitcoin
title:
type: string
example: What Is Bitcoin?
subtitle:
type: string
example: A plain-language introduction to the first cryptocurrency.
locale:
type: string
example: en
tags:
type: array
example:
- guide
- analysis
items:
type: string
reading_time_minutes:
type: integer
example: 7
hero_image:
type: string
example: https://bitculator.com/storage/media/articles/what-is-bitcoin.png
entities:
type: array
example: []
published_at:
type: string
example: '2026-06-21'
updated_at:
type: string
example: '2026-06-21'
meta:
type: object
properties:
current_page:
type: integer
example: 1
per_page:
type: integer
example: 20
total:
type: integer
example: 10
last_page:
type: integer
example: 1
tags:
- Editorial
/api/v1/articles/{slug}:
parameters:
- in: path
name: slug
description: The article's slug.
example: what-is-bitcoin
required: true
schema:
type: string
get:
summary: Get an article
operationId: getAnArticle
description: 'One published article with its full body, tags, hero image, helpful counters and
related entities. `locale` picks the content language with per-field English
fallback (the payload reports which locale actually won).'
parameters:
- in: query
name: locale
description: Content language (falls back to English).
example: en
required: false
schema:
type:
- string
- 'null'
description: Content language (falls back to English).
example: en
responses: []
tags:
- Editorial
/api/v1/articles/{slug}/feedback:
parameters:
- in: path
name: slug
description: The article's slug.
example: what-is-bitcoin
required: true
schema:
type: string
post:
summary: Submit article feedback
operationId: submitArticleFeedback
description: 'Registers a thumbs-up/down on an article — the same counters the web''s helpful
buttons use. Per-key throttling applies upstream.'
parameters: []
responses:
'200':
description: ''
content:
application/json:
schema:
type: object
example:
data:
article: what-is-bitcoin
helpful_yes: 13
helpful_no: 2
properties:
data:
type: object
properties:
article:
type: string
example: what-is-bitcoin
helpful_yes:
type: integer
example: 13
helpful_no:
type: integer
example: 2
tags:
- Editorial
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
helpful:
type: boolean
description: '`true` for helpful, `false` for not helpful.'
example: true
required:
- helpful
/api/v1/videos/{id}:
parameters:
- in: path
name: id
description: The video id.
example: 87
required: true
schema:
type: integer
get:
summary: Get a video
operationId: getAVideo
description: 'One curated video with its YouTube id, title, type, duration and the
coins/exchanges/wallets it is attached to.'
parameters: []
responses: []
tags:
- Editorial
/api/v1/insights:
get:
summary: List insights
operationId: listInsights
description: 'AI-generated market insights, paginated. Filter by `type`, a related `coin` slug
or free-text `search`; `locale` picks the headline/summary language with English
fallback.'
parameters:
- in: query
name: page
description: Page number (1-based).
example: 1
required: false
schema:
type:
- integer
- 'null'
description: Page number (1-based).
example: 1
- in: query
name: per_page
description: Rows per page (1–50, default 20).
example: 20
required: false
schema:
type:
- integer
- 'null'
description: Rows per page (1–50, default 20).
example: 20
- in: query
name: locale
description: Content language (falls back to English).
example: en
required: false
schema:
type:
- string
- 'null'
description: Content language (falls back to English).
example: en
- in: query
name: type
description: 'Filter by insight type: `per_asset`, `market_overview` or `narrative`.'
example: per_asset
required: false
schema:
type:
- string
- 'null'
description: 'Filter by insight type: `per_asset`, `market_overview` or `narrative`.'
example: per_asset
- in: query
name: coin
description: Filter to insights about this coin slug.
example: bitcoin
required: false
schema:
type:
- string
- 'null'
description: Filter to insights about this coin slug.
example: bitcoin
- in: query
name: search
description: Free-text match on the headline.
example: etf
required: false
schema:
type:
- string
- 'null'
description: Free-text match on the headline.
example: etf
- in: query
name: sort
description: 'Sort order: `first_reported` (default) or `last_updated`.'
example: first_reported
required: false
schema:
type:
- string
- 'null'
description: 'Sort order: `first_reported` (default) or `last_updated`.'
example: first_reported
responses: []
tags:
- Editorial
/api/v1/insights/{id}:
parameters:
- in: path
name: id
description: The insight id.
example: 101
required: true
schema:
type: integer
get:
summary: Get an insight
operationId: getAnInsight
description: 'One insight with its full payload — headline, summary, source-article timeline
and related coins.'
parameters:
- in: query
name: locale
description: Content language (falls back to English).
example: en
required: false
schema:
type:
- string
- 'null'
description: Content language (falls back to English).
example: en
responses: []
tags:
- Editorial
components:
securitySchemes:
default:
type: http
scheme: bearer
description: Create a Data API key in your developer console — keys are Bearer-only and carry the data-api ability. Keep them server-side; they are never meant for client-side embedding.