API данных Nordic Crypto
Открытый JSON-фид сайта для приложений и других инструментов. Без аккаунта и без API-ключа. Он заново создаётся при каждой сборке сайта.
Узел Bitcoin Lightning#
Nordic Crypto поддерживает узел Bitcoin Lightning. Псевдоним — Nordic Crypto. Реализация — LND, в лёгком режиме Neutrino. Без аккаунта и без API-ключа.
| Узел | Статус | Реализация |
|---|---|---|
| Bitcoin Nordic Crypto | синхронизация / каналы ещё не открыты | LND (лёгкий режим Neutrino) |
URI узла. Скопируйте строку. Первая строка — IPv4. Вторая — тот же узел по IPv6, [2a01:4f8:c01e:36d9::1]:9735.
0225974bb701101a5d4352dcae0f76aa9c1388e482a666e892f462e0e0e4217dd9@91.99.122.75:9735 0225974bb701101a5d4352dcae0f76aa9c1388e482a666e892f462e0e0e4217dd9@[2a01:4f8:c01e:36d9::1]:9735
Публичный ключ.
0225974bb701101a5d4352dcae0f76aa9c1388e482a666e892f462e0e0e4217dd9
Адрес для пополнения в цепочке.
bc1p7zgqhev2zzn45mefzq59gq983379lr0rsymhl558rza9k05y7vsq9mglx7
Серверы Electrum (BCH и Nexa)#
Nordic Crypto поддерживает серверы Electrum на базе Rostrum для Bitcoin Cash и Nexa. Кошельки и приложения могут получать с них балансы, транзакции, UTXO, токены и последний блок, а также отправлять транзакции в сеть. Без аккаунта и без API-ключа.
| Сервер | Статус | Высота блока | Отклик | Версия |
|---|---|---|---|---|
Bitcoin Cashwss://electrum-bch.nordiccrypto.no:50004 | – | – | – | – |
Nexawss://electrum-nexa.nordiccrypto.no:20004 | – | – | – | – |
Они работают по протоколу Electrum (JSON-RPC) на стандартных портах: WebSocket с TLS (wss) — 20004 для Nexa и 50004 для Bitcoin Cash; TLS поверх TCP — 20002 для Nexa и 50002 для Bitcoin Cash. Незашифрованных портов нет. В клиентской библиотеке укажите хост, порт и схему (wss или tcp_tls). Методы перечислены в документации протокола Rostrum.
websocat wss://electrum-bch.nordiccrypto.no:50004
{"id":1,"method":"blockchain.headers.subscribe","params":[]}
Серверы работают на собственных полных узлах (Bitcoin Cash Node и Nexa), поэтому их ответы не зависят от третьих лиц. Клиент, который не выполняет SPV-проверок, всё же доверяет нам в том, что содержит цепочка. Гарантии доступности нет. Держите в списке второй сервер и переключайтесь, если один не отвечает в течение нескольких секунд.
С чего начать#
- Каталог — все эндпоинты и примеры URL.
- OpenAPI (также в формате YAML).
- llms.txt — инструкции простым языком.
- Каталог API (linkset по RFC 9727; копия в .json).
Получить новости и рассылку#
curl -fsS https://nordiccrypto.no/api/v1/news.json curl -fsS https://nordiccrypto.no/api/v1/newsletters.json curl -fsS https://nordiccrypto.no/api/v1/newsletters/002.json
Абсолютные URL указывают на публичный сайт, от корня домена: https://nordiccrypto.no/api/v1/news.json.
Опрос новых материалов#
/api/v1/news/latest.json содержит 25 самых новых опубликованных материалов, только с полями id, published, country, source, source_name, language_code, own_story, заголовками (title, title_en, title_i18n) и ссылками (url, html_url, api_url). Значения те же, что в news.json, в том же порядке (сначала новые). Файл остаётся небольшим, как бы ни рос архив, поэтому приложение или push-сервер может опрашивать его каждые несколько минут. Отправьте If-None-Match с последним ETag; GitHub Pages отвечает 304 Not Modified, пока файл не изменился. Сравнивайте id с уже виденными; generated_at меняется при каждой сборке.
curl -fsS https://nordiccrypto.no/api/v1/news/latest.json
Рыночные цены#
Цены северных бирж — это рыночные данные, а не инвестиционная рекомендация. /api/v1/markets.json перечисляет каждую пару: символ, базовую валюту и валюту котировки, последнюю цену, bid и ask (если биржа их публикует), id, название и страну биржи, fetched_at, URL источника и объём (если биржа его публикует). volume_base — объём в базовом активе без указанного периода (Firi). volume_base_24h и volume_quote_24h — за последние 24 часа (NBX). Отсутствующий объём равен null, а не нулю. Валюты котировки: NOK, SEK, DKK и EUR. Одна биржа: /api/v1/markets/{exchange}.json (firi, nbx, coinmotion). Один актив: /api/v1/markets/by-asset/{symbol}.json. Площадки без публичного тикера перечислены в skipped, и выдуманная цена для них не указывается.
/api/v1/markets/aggregated.json содержит одну строку на пару. BTC-NOK не усредняется с BTC-EUR. last — среднее арифметическое опубликованных последних цен. mid — среднее значение (bid+ask)/2, оно не смешивается с last. price равно last, если есть хоть одна последняя цена, иначе mid. min и max берутся из того же ряда. VWAP нет. Объём суммируется только в пределах одного поля и одной пары. logo_url — SVG из набора cryptocurrency-icons (CC0 1.0), если актив в нём есть; отдаётся по адресу /api/v1/markets/logos/{symbol}.svg, иначе null. Файл по активу повторяет aggregated и логотип.
Сборка запрашивает данные у бирж. .github/workflows/markets-refresh.yml перезаписывает JSON в gh-pages примерно раз в час, включая агрегированный файл и иконки. Страница рынков перезагружает этот файл и обновляет Firi и Coinmotion прямо в браузере, поскольку их API отправляют Access-Control-Allow-Origin: *. NBX этого не делает, поэтому её строки берутся из файла. Тот же документ в ветке gh-pages: raw.githubusercontent.com/jQrgen/nordic-crypto/gh-pages/api/v1/markets.json.
curl -fsS https://nordiccrypto.no/api/v1/markets.json curl -fsS https://nordiccrypto.no/api/v1/markets/aggregated.json
Статистика посещений#
Суммарные визиты и просмотры страниц из Cloudflare Web Analytics (без cookie). /api/v1/stats.json содержит строки daily, weekly (ISO) и monthly только с visits и pageviews. Дни считаются по UTC. Файл пуст, пока не настроены сайт Web Analytics и токен обновления. .github/workflows/stats-refresh.yml перезаписывает его в gh-pages примерно раз в сутки.
curl -fsS https://nordiccrypto.no/api/v1/stats.json
Доклады#
Публичные доклады о биткоине, криптовалютах и блокчейне, прочитанные в Норвегии, Швеции, Дании, Финляндии, Исландии, на Фарерских островах, в Гренландии и на Аландских островах, находятся в /api/v1/talks.json, от новых к старым. Один доклад: /api/v1/talks/{id}.json. Одна страна: /api/v1/talks/by-country/{country}.json (NO, SE, DK, FI, IS, FO, GL, AX). description написано нами. title, даты, длительность, канал и докладчики берутся с платформы по адресу source_url. Поле, которое платформа не указала, равно null. embed равно true, только если ответ oEmbed платформы содержит плеер. HTML-страница загружает плеер только после клика: YouTube через youtube-nocookie.com, Vimeo через player.vimeo.com. event_id и calendar_event_id — один и тот же id события, если доклад к нему привязан. Это событие находится в /api/v1/events/{id}.json (и в /api/v1/events/previous.json, если оно уже прошло), а его страница — /calendar/{id}/. talk_ids у события перечисляет эти доклады. unlink_reason заполняется, если на странице видео не указаны день или место; тогда event_id равно null. speaker_ids — id из раздела «Кто есть кто» в том же порядке, что и speakers. Карточка человека по адресу /api/v1/orgchart/{id}.json перечисляет эти доклады и любую аффилиацию, указанную на странице доклада.
Несколько изданий, одна новость#
У новости одно основное издание. Другие издания, написавшие о том же событии, указаны в also_covered_by. sources перечисляет сначала основное издание, затем остальные. У каждого издания есть outlet, outlet_name, url, title (заголовок этого издания), published, lang, country, source_type и logo. source_type принимает значения national, regional (региональные и местные), official (правосудие и госорганы: полиция, прокуратура, суды, регуляторы) или international. coverage.count — число изданий. coverage.by_country и coverage.by_source_type — количества и доли для диаграмм. Каждый тип источника присутствует, даже с нулевым количеством. html_url — наша страница этой новости. url — основное издание. Kaupr остаётся только источником новостей.
События#
Предстоящие и прошедшие события находятся в /api/v1/events.json. Календари Luma берутся из публичного iCal-адреса подписки каждого источника событий (ics). Страницы городов, страницы категорий и discover API Luma не используются. Отдельная страница события Luma читается как JSON-LD schema.org. Организаторы и площадки Eventbrite читаются через API v3, если на сервере есть EVENTBRITE_TOKEN. Этого токена нет ни в фиде, ни в репозитории. Без него используется JSON-LD страницы события. Одинаковые название, дата и место — это одно событие. Завершившиеся события остаются в фиде. description.text — собственный текст организатора, description.lang — язык этого текста, а description.source_url — страница, откуда он взят. description.i18n содержит перевод, если он у нас есть. Поле равно null, если у источника не было описания. Объявления хищнических конференций источником не служат. Kaupr никогда не бывает спонсором.
Языки#
Английский — поле по умолчанию (summary, title, text). Опубликованные нами переводы лежат в summary_i18n, title_i18n, subtitle_i18n, note_i18n, text_i18n и about_i18n с ключами nn, nb, sv, da, fi и is. Остальные языки сайта используют английское поле, пока не опубликован перевод. В новости title остаётся заголовком источника, title_en — наш заголовок на английском, а title_i18n — наш заголовок на северных языках сайта. Страницы показывают сначала заголовок на языке страницы, а под ним — заголовок источника, если они различаются. Собственный заголовок каждого издания в sources остаётся на языке этого издания. Даты — в формате ISO 8601.
/api/v1/languages.json перечисляет все языки сайта с полями code, native_name, english_name, rtl, html_lang и home. /api/v1/geo-language.json — соответствие «страна → язык», используемое при первом посещении. Страна по IP приходит от tipworker GET /api/geo (Cloudflare request.cf.country). Ничего не сохраняется. Cookie nc_lang, которую устанавливает переключатель языка, всегда имеет приоритет.
Логотипы источников#
У каждого издания в /api/v1/sources.json есть logo_url (абсолютный URL PNG или WebP, никогда не SVG, либо null) и logo (kind, file_url (оригинал, SVG или WebP), raster_url (то же, что logo_url), source_url, author, license, license_url, credit, либо null). У каждой новости есть source_logo_url, чтобы приложение могло показать логотип издания рядом с заголовком. Логотипы взяты из Wikimedia Commons (с лицензией) или с сайта самого издателя. Это товарные знаки издателей; они показываются только для указания источника заголовка. Логотип остаётся null, пока редактор его не проверит.
CORS#
GitHub Pages отдаёт эти файлы с заголовком Access-Control-Allow-Origin: *, поэтому страница на другом сайте может получить их через fetch(). GitHub Pages не применяет пользовательский файл заголовков. Используйте имя файла с .json: при открытии каталога JSON не возвращается.
Редакционная политика#
Подпись — The Nordic Crypto team. Kaupr (kaupr.io) — только источник новостей и никогда не спонсор. Ничто здесь не является инвестиционной рекомендацией.
Аккаунты бренда#
ios в /api/v1/meta.json — публичное приглашение TestFlight в iOS-приложение Nordic Crypto. В App Store его нет. apple_tv сообщает, что версия в TestFlight особенно поддерживает Apple TV. apple_tv_i18n содержит эту короткую фразу на всех языках сайта. Название бренда всегда Nordic Crypto.
/api/v1/meta.json содержит social для iOS-приложения. social.telegram — чат Nordic Crypto по адресу https://t.me/nordiccryptochat. social.x — аккаунт бренда по адресу https://x.com/nordiccryptobot (@nordiccryptobot), он также указан как urls.x. urls.telegram повторяет URL чата. urls.rss — английская лента новостей по адресу /rss.xml. У главной страницы каждого языка есть свой rss.xml. urls.newsletter — страница подписки на этом сайте. label — короткое название (Telegram, X). name — текст ссылки на английском. name_i18n содержит nn, nb, sv, da, fi и is. Остальные языки сайта используют name.
Уведомления в браузере#
Когда в workers/push/public.json указан URL Worker, кнопка внизу каждой страницы включает Web Push. До тех пор страница сообщает, что сервис не включён, и не обращается ни к какому Worker. Подписки хранятся в Cloudflare Worker, а не в этом статическом фиде. После публикации GET /api/push/feed.json на этом Worker перечисляет те же пакеты (заголовок, краткое описание, URL, страна и переводы, если они есть). Одна публикация — один пакет. В документе указано "apns": "not implemented": Apple Push Notification service не поддерживается. iOS-приложение может периодически опрашивать фид. URL Worker задаётся при развёртывании workers/push/; это не путь на этом сайте. Подписок в фиде нет. /api/v1/news.json этого API остаётся полным списком опубликованных новостей.
Эндпоинты#
Каждый эндпоинт — простой GET-запрос статического JSON-файла.
| Путь | Возвращает |
|---|---|
/api/v1/index.json | Discovery document: every endpoint, with example URLs. |
/api/v1/news.json | Published news and our own stories, newest first. |
/api/v1/news/latest.json | The 25 newest published stories with id, published, country, source and headlines only. For apps and notifiers that poll often; news.json is the full list. |
/api/v1/news/by-country/{country}.json | Published news for one country code: NO, SE, DK, FI, IS, NORDIC or EU. |
/api/v1/news/topics.json | Topic ids present in the published news, with counts. |
/api/v1/newsletters.json | Published newsletter issues, newest first. The list omits the HTML body; the issue URL includes text and html. |
/api/v1/events.json | Public events, soonest start first, including past events. |
/api/v1/events/upcoming.json | Events that have not ended, soonest first. Judged in the event's own offset. |
/api/v1/events/past.json | Finished public events, newest first. Finished events stay in the archive. |
/api/v1/events/previous.json | Previous events, newest finish first. Finished calendar events plus backfilled public events (source backfill). Backfill is not on the calendar or in upcoming or past. |
/api/v1/events/by-country/{country}.json | Public events for one country code. |
/api/v1/talks.json | Public talks on bitcoin, cryptocurrencies and blockchain in the Nordic countries, newest first. A player is embedded on the site only when embed is true (YouTube via youtube-nocookie.com, or the Vimeo player). Unknown fields are null. description is ours; title and the other details come from the platform. |
/api/v1/talks/by-country/{country}.json | Public talks for one country code: NO, SE, DK, FI, IS, FO (Faroe Islands), GL (Greenland) or AX (Åland). |
/api/v1/sources.json | News outlets, justice-system press pages, the public search terms, and event sources. coverage is national, regional, local or justice. region is the place. feed is null when no working RSS, sitemap or index page was verified. method is rss, html, sitemap, search or manual. Event sources name the intake method. Luma calendars use a public iCal subscribe URL. Eventbrite organizers and venues use the v3 API when the server has EVENTBRITE_TOKEN; the token is not in this feed. Without it, event pages are schema.org JSON-LD. icon_url is a public icon from the outlet when one was easy to find. logo_source is the URL the stored logo was fetched from. logo is the checked outlet image for that source id when one is on file, used only to identify the source. Kaupr is marked as a news source only and is never an event sponsor. |
/api/v1/academia.json | Editor-approved courses, student groups, publications and research. |
/api/v1/academia/courses.json | Academia section: courses. |
/api/v1/academia/groups.json | Academia section: groups. |
/api/v1/academia/publications.json | Academia section: publications. |
/api/v1/academia/research.json | Academia section: research. |
/api/v1/academia/{id}.json | One academia row. The id is in academia.json. |
/api/v1/books.json | Published books on bitcoin, crypto and blockchain by Nordic authors or about the Nordic countries. title is the original title. authors are as printed; author_role is "editors" for an edited volume. language is a code (nn, nb, sv, da, fi, en). source is the library catalogue or publisher page where the row was checked. about is our one-line description in English. No cover images. |
/api/v1/developers.json | Open-source developers: technical people in Nordic crypto with public crypto-related code (an own non-fork crypto repo, or merged commits or pull requests in a public crypto project). name is as shown on the code profile. profiles are the GitHub/GitLab/Codeberg/sourcehut profile links. notable has up to three items: kind "repo" (own repo: name, url, stars, language, description, last_push) or kind "contrib" (project, host, url, commits, merged_prs). Stars and counts are from the date in checked. nordic_source is where the Nordic link is shown. whoswho_id links the who's who entry. Only rows the editor approved; a preview build also has pending rows (status "pending"). |
/api/v1/orgchart.json | Published who's who: organisations, people, relations, regulation notes and caveats. A person named on a talk has talk_ids, event_ids and talks. affiliations lists the organisation the talk page stated for that talk, with the talk date when the page gave one, the source URL and the retrieval time. An affiliation the page did not state is omitted. |
/api/v1/orgchart/relations.json | Relations between published who's who entries. |
/api/v1/orgchart/regulation.json | Short regulation status for each Nordic country, as on the who's who page. |
/api/v1/orgchart/relations/{id}.json | One relation from the who's who. |
/api/v1/profiles.json | Public profile links (Wikipedia, X, Wikidata and similar) for people and organisations. |
/api/v1/images.json | Logos and photos used on the public who's who, with licence and credit. These are not newspaper photographs. |
/api/v1/illustrations.json | Pictures used on story cards and story pages. Each record has source, author, license and url. No photograph from another newspaper is included. Outlet logos are in images.json and on each news item as source_logo. |
/api/v1/changelog.json | Site changelog (product changes, not the news), newest first. |
/api/v1/rules.json | How EU crypto rules become law in the five countries. Simplified, not legal advice. Omitted while the page is still a placeholder. |
/api/v1/archive/articles.json | Append-only archive of stories that have been on the public site. removed is true when a story later left the site; the row stays. |
/api/v1/stats.json | Aggregate visitor counts from Cloudflare Web Analytics (no cookies): visits and page views per UTC day, ISO week and calendar month. updated_at is null and the lists are empty until the Web Analytics site and the refresh token are configured. |
/api/v1/markets.json | Nordic exchange prices. Market data, not investment advice. Each ticker names the exchange, fetched_at, the source URL and volume when the exchange published it. NOK, SEK, DKK and EUR only. aggregated is one row per pair. |
/api/v1/markets/aggregated.json | One price per base-quote pair. BTC-NOK is separate from BTC-EUR. last is the mean of published last prices. mid is the mean of bid/ask midpoints and is not blended into last. Volume is summed only within the same field and the same pair. logo_url is a CC0 icon when cryptocurrency-icons includes the asset, otherwise null. |
/api/v1/markets/{exchange}.json | Prices from one included exchange: firi (Norway), nbx (Norway) or coinmotion (Finland). |
/api/v1/markets/by-asset/{symbol}.json | Prices for one asset (the base symbol, such as BTC) on every included Nordic exchange, plus aggregated pairs for each quote currency and logo_url when an icon is available. |
/api/v1/languages.json | Site UI languages: code, native name, English name, rtl, html lang and home URL. |
/api/v1/geo-language.json | Country to default site language. An IP guess only; the nc_lang cookie from the language switcher wins. |
/api/v1/meta.json | Site name, languages, countries, page list, CORS, editorial notes and brand social accounts (social.telegram, social.x). |
Что не входит#
Черновики, редакционная очередь, отклонённые новости, сообщения читателей, адреса подписчиков рассылки, токен аналитики и частные персональные данные в этот фид не входят. Неизвестный id возвращает обычную страницу 404 сайта, а не ошибку в JSON.