新文易數 API

台灣新聞媒體的標籤排行、事件分群、各家標題對照與議題追蹤資料,全部公開、免金鑰、唯讀。

使用規則

  • 基底網址 https://tag.observe.tw,所有端點都是 GET(也接受 HEAD),回傳 UTF-8 JSON。
  • 不需要 API 金鑰。每個 IP 每分鐘最多 240 次 API 請求,超過回 429;回應帶 x-ratelimit-limit、x-ratelimit-remaining、x-ratelimit-reset 標頭。
  • 允許跨網域(CORS Access-Control-Allow-Origin: *),瀏覽器前端可直接呼叫。
  • 時間一律是 UTC 的 ISO 8601(例如 2026-09-30T21:00:00.000Z);「一天」指台北時間(UTC+8)的日曆日。
  • 回應帶 cache-control,資料本身每 10 分鐘(排行)到每小時(事件、議題)更新,請勿以高於此的頻率輪詢。
  • 錯誤回 {"error": "..."},搭配 HTTP 狀態碼:400 參數錯誤、404 找不到、405 非 GET、429 太頻繁、5xx 伺服器問題。
  • 路徑參數(標籤、媒體代碼)請 URL 編碼,例如 /api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/articles。路徑結尾不要加 /。
  • v1 內只做向後相容的變更(新增欄位、新增端點);移除或改名會先在本文件公告。
  • 標題、圖片與內文著作權屬原媒體;本 API 提供標題、連結、統計及刊登 7 天內的擷取文字。使用資料請註明「資料來源:新文易數 tag.observe.tw」。
  • 舊站 tag.analysis.tw 的 /api/*.php 在本站回 410,JSON 內 replacement 指向對應的 v1 端點。
  • 不寫程式也能追:RSS /feeds/events.xml(新事件)與 /feeds/tag/<標籤>.xml(某標籤的最新報導,標籤需 URL 編碼);全站網址清單在 /sitemap.xml。

快速開始

命令列(curl + jq)

# 新聞媒體目前爆發力最高的 10 個標籤
curl -s 'https://tag.observe.tw/api/v1/ranking?category=news&limit=10' | jq '.entries[] | {tag, burst, count}'

# 過去三天標題含「颱風」的文章;有下一頁時把 nextCursor 放進 cursor
curl -s 'https://tag.observe.tw/api/v1/articles?q=%E9%A2%B1%E9%A2%A8&hours=72&limit=50' | jq -r '.nextCursor'
curl -s 'https://tag.observe.tw/api/v1/articles?q=%E9%A2%B1%E9%A2%A8&hours=72&limit=50&cursor=<nextCursor>'

# 現在排第一的事件,藍綠各家怎麼報
id=$(curl -s 'https://tag.observe.tw/api/v1/events?limit=1' | jq '.events[0].threadId')
curl -s "https://tag.observe.tw/api/v1/events/threads/$id/coverage" | jq '.camps, .blindspot'

JavaScript(瀏覽器或 Node 18+)

const res = await fetch('https://tag.observe.tw/api/v1/ranking?category=news&limit=10');
const { snapshot, entries } = await res.json();
for (const e of entries) console.log(e.position, e.tag, e.burst.toFixed(1));

Python

import requests

r = requests.get("https://tag.observe.tw/api/v1/articles", params={"q": "颱風", "hours": 72})
for a in r.json()["articles"]:
    print(a["publishedAt"], a["mediaTitle"], a["title"])

端點一覽

API 本身

GET/api/v1

API 索引

列出所有端點與文件位置。

curl -s 'https://tag.observe.tw/api/v1'
在瀏覽器開啟這個範例 ↗
回應欄位9 個
namestring
versionstring
docsstring人看的文件
openapistringOpenAPI 3.1 規格
endpointsobject[]
endpoints[].methodstring
endpoints[].pathstring
endpoints[].summarystring
endpoints[].examplestring

GET/api/v1/openapi.json

OpenAPI 3.1 規格

可匯入 Swagger UI、Postman、openapi-generator 等工具。

curl -s 'https://tag.observe.tw/api/v1/openapi.json'
在瀏覽器開啟這個範例 ↗

標籤排行與分類

GET/api/v1/categories

排行分類

可用於 category 參數的分類,含 blue/green 兩個政治傾向分類。

curl -s 'https://tag.observe.tw/api/v1/categories'
在瀏覽器開啟這個範例 ↗
回應欄位3 個
[].keystring分類代碼
[].labelstring中文名稱
[].mediainteger分類內媒體數

GET/api/v1/ranking

標籤排行(每 10 分鐘更新)

過去 24 小時各媒體文章標籤的排行,每 10 分鐘重算一次、以整點小時存快照。order=burst(預設)依爆發力排序,order=score 依正規化分數排序。at 可取過去某個時間點的快照。

參數型別說明
categorystring排行分類,見 /api/v1/categories,預設 all
order"burst" | "score"排序:burst 爆發力/score 分數,預設 burst
limitinteger筆數,1–500,預設 50
atstring (ISO 時間)取這個時間(ISO 8601)以前最新的快照
trend"0" | "1"1 表示附上每小時篇數與 24 小時移動平均;截至快照計算時間前的最後完整小時
related"0" | "1"1 表示附上每個標籤最常一起出現的標籤
curl -s 'https://tag.observe.tw/api/v1/ranking?category=news&limit=20'
在瀏覽器開啟這個範例 ↗
回應欄位38 個
snapshotobject
snapshot.idinteger
snapshot.categorystring
snapshot.hourStartstring (ISO 時間)快照所屬小時(UTC)
snapshot.computedAtstring (ISO 時間)計算時間
snapshot.weightnumber固定基準名單的媒體數
snapshot.basisobject
snapshot.basis.idstring固定媒體名單版本
snapshot.basis.mediastring[]
snapshot.basis.coverageFromstring (ISO 時間)所有基準來源開始收錄後的第一個完整小時
snapshot.basis.validFromstring (ISO 時間)收錄開始後滿 24 小時;更早的移動平均及分數為 null
snapshot.availableboolean是否已滿足基準的 24 小時收錄範圍
snapshot.articleCountinteger | null視窗內基準媒體文章數;舊快照無法完整重建時為 null
snapshot.mediaCountinteger | null視窗內基準媒體中有發文的家數;舊快照為 null
snapshot.historyAvailableinteger[]有歷史快照可比較的小時數
order"burst" | "score"
entriesobject[]
entries[].rankinteger依原始分數的名次
entries[].positioninteger在本次回應排序中的位置(從 1 起)
entries[].tagstring標籤
entries[].scorenumber原始分數:每篇文章 +1,同一媒體的第 2、3… 篇遞減為 0.5、0.25…
entries[].countinteger過去 24 小時帶這個標籤的文章數
entries[].media{鍵: integer}各媒體的文章數
entries[].normalizednumber原始分數 ÷ 固定基準媒體數 × 50
entries[].burstnumber | null爆發力:與同一基準 3/6/12/24/48 小時前分數比較的加權差;缺值、舊榜截斷或基準不相容為 null
entries[].history{鍵: number | null}N 小時前的正規化分數(鍵為 3、6、12、24、48;沒有可比較資料為 null)
entries[].rank24hinteger | null24 小時前依原始分數的名次;沒有可比較快照、基準不同或當時不在榜上為 null
entries[].newboolean24 小時前的完整快照中沒有這個標籤
entries[].relatedobject[]related=1 時回傳:同一視窗、同一基準媒體中最常與這個標籤同時出現的標籤,最多 5 個,依共同文章數排序
entries[].related[].tagstring一起出現的標籤
entries[].related[].countinteger視窗內同時帶兩個標籤的文章數
entries[].related[].sharenumber佔這個標籤文章數的比例(0–1)
entries[].trendobject[]trend=1 時回傳 49 個等距小時點,涵蓋 48 小時變化
entries[].trend[].tstring (ISO 時間)
entries[].trend[].hourlyCountinteger | null該完整小時收錄篇數
entries[].trend[].average24hnumber | null當小時及前 23 小時篇數總和 ÷ 24(篇/小時);歷史不足為 null
entries[].trend[].scorenumber | null固定基準 24 小時分數
entries[].trend[].countinteger | null固定基準 24 小時累計篇數

錯誤:400 at 格式錯誤;404 未知分類,或該時間以前沒有快照

文章搜尋

GET/api/v1/similarity

內文相似與明確引用關係

讀取全量相似度索引:每篇可用內文都與前後 7 天內其他媒體的全部文章比對,配對永久保存,每 10 分鐘更新;排除「內容」聯播來源。index 揭露期間內的比對篇數與尚待比對篇數。相似連線由同組較晚刊登的媒體指向同組最早刊登的媒體(早刊登不等於原創);citation 由刊登媒體指向明確提及來源,並不保證最初作者。文章證據另由 /api/v1/similarity/evidence 分頁取得。

參數型別說明
hoursinteger回溯小時;與 from/to 擇一,1–168,預設 48
fromstring起始台北日期 YYYY-MM-DD(與 to 一起使用,最多 31 天)
tostring結束台北日期 YYYY-MM-DD(含)
thresholdnumber最低 Dice 相似度,0.5–1,預設 0.65
curl -s 'https://tag.observe.tw/api/v1/similarity'
在瀏覽器開啟這個範例 ↗
回應欄位47 個
generatedAtstring (ISO 時間)
hoursinteger | null回溯小時;以日期區間查詢時為 null
daysobject | null日期區間;以小時查詢時為 null
days.fromstring台北日期 YYYY-MM-DD
days.tostring台北日期 YYYY-MM-DD(含)
fromstring (ISO 時間)期間起點
tostring (ISO 時間)期間終點
thresholdnumber
methodstring
coverageobject[]
coverage[].mediastring
coverage[].namestring
coverage[].totalinteger
coverage[].fetchedinteger
coverage[].usableinteger
coverage[].indexedinteger可用內文中已由相似度索引比對的篇數
coverage[].withAuthorsinteger
coverage[].missinginteger
coverage[].pendinginteger
coverage[].enabledboolean
coverage[].excludedFromStatisticsboolean
indexobject全量索引的涵蓋:沒有抽樣或篇數上限
index.availableinteger期間內可用內文篇數(不含「內容」聯播來源)
index.analyzedinteger期間內已比對、內文夠長可比對的篇數
index.pendinginteger等待下一次索引的可用內文篇數
index.pairsinteger門檻以上、兩篇都在期間內的相似配對數
index.groupsinteger同題報導組數(相似配對的連通群組)
index.citationsinteger明示引用則數
index.windowDaysinteger每篇與前後幾天內的他家文章比對
nodesobject[]
nodes[].idstring
nodes[].namestring
nodes[].countrystring
nodes[].countryCodestring
nodes[].articlesinteger期間內已比對篇數
nodes[].externalboolean只被引用、沒有收錄內文的媒體
nodes[].similarinteger屬於同題報導組的文章數
nodes[].earliestinteger其中為同組最早刊登的篇數
nodes[].laterinteger其中同組已有更早刊登的篇數
nodes[].outgoinginteger引用其他媒體的篇數
nodes[].incominginteger被其他媒體引用的篇數
edgesobject[]
edges[].sourcestring
edges[].targetstring
edges[].kind"similarity" | "citation"
edges[].countinteger
edges[].scorenumber | null

錯誤:400 參數無效

GET/api/v1/similarity/evidence

相似與引用證據(分頁)

與 /api/v1/similarity 相同期間與門檻的全部證據,最新在前,每頁 20 則。origin 為同題報導:文章連回同組最早刊登的文章;citation 為明示引用。可依媒體、連線、方向與關鍵字(標題、媒體、署名、相同片段)篩選。

參數型別說明
hoursinteger回溯小時;與 from/to 擇一,1–168,預設 48
fromstring起始台北日期 YYYY-MM-DD(與 to 一起使用,最多 31 天)
tostring結束台北日期 YYYY-MM-DD(含)
thresholdnumber最低 Dice 相似度,0.5–1,預設 0.65
mode"all" | "similarity" | "citation"關係類型,預設 all
nodestring只看與此媒體有關的證據
edgeKind"similarity" | "citation"只看一條連線:類型(需同時給 source、target)
sourcestring連線起點媒體
targetstring連線終點媒體
direction"all" | "outgoing" | "incoming"引用:outgoing 引用他媒、incoming 被引用;相似:outgoing 較晚刊登、incoming 同組最早,預設 all
scopestring逗號分隔的媒體;兩端都要在內
focusstring逗號分隔的媒體;至少一端在內
qstring關鍵字(最多 100 字元)
pageinteger頁碼,從 0 開始,預設 0
curl -s 'https://tag.observe.tw/api/v1/similarity/evidence?hours=48&node=cna&mode=similarity'
在瀏覽器開啟這個範例 ↗
回應欄位128 個
totalinteger符合條件的證據總數
pageinteger
pageSizeinteger
hiddenSourcesintegerscope 內媒體的同組來源在 scope 外的則數
itemsobject[]
items[].kind"origin" | "citation"
items[].keystring
items[].publishedAtstring (ISO 時間)
items[].articleIdinteger
items[].sourceIdintegerorigin:同組最早刊登的文章 id
items[].groupIdstringorigin:同題報導組 id
items[].directPairobject | null
items[].directPair.idstring
items[].directPair.aobject
items[].directPair.a.idinteger
items[].directPair.a.mediastring
items[].directPair.a.mediaTitlestring
items[].directPair.a.countrystring
items[].directPair.a.countryCodestring
items[].directPair.a.titlestring
items[].directPair.a.urlstring
items[].directPair.a.publishedAtstring (ISO 時間)
items[].directPair.a.authorsstring[]
items[].directPair.a.bodyLengthinteger
items[].directPair.a.attributionsobject[]
items[].directPair.a.attributions[].mediastring
items[].directPair.a.attributions[].namestring
items[].directPair.a.attributions[].countrystring
items[].directPair.a.attributions[].countryCodestring
items[].directPair.a.attributions[].evidencestring
items[].directPair.a.attributions[].kind"explicit"
items[].directPair.bobject
items[].directPair.b.idinteger
items[].directPair.b.mediastring
items[].directPair.b.mediaTitlestring
items[].directPair.b.countrystring
items[].directPair.b.countryCodestring
items[].directPair.b.titlestring
items[].directPair.b.urlstring
items[].directPair.b.publishedAtstring (ISO 時間)
items[].directPair.b.authorsstring[]
items[].directPair.b.bodyLengthinteger
items[].directPair.b.attributionsobject[]
items[].directPair.b.attributions[].mediastring
items[].directPair.b.attributions[].namestring
items[].directPair.b.attributions[].countrystring
items[].directPair.b.attributions[].countryCodestring
items[].directPair.b.attributions[].evidencestring
items[].directPair.b.attributions[].kind"explicit"
items[].directPair.scorenumber正規化內文五字片段的 Dice 相似度
items[].directPair.containmentnumber共同片段占較短文章片段的比例
items[].directPair.sharedShinglesinteger
items[].directPair.kind"identical" | "high"
items[].directPair.evidencestring最多 100 字的連續相同片段
items[].sourceobject
items[].source.mediastring
items[].source.namestring
items[].source.countrystring
items[].source.countryCodestring
items[].source.evidencestring
items[].source.kind"explicit"
articles{鍵: object}以 id 為鍵,本頁用到的文章
articles.{鍵}.idinteger
articles.{鍵}.mediastring
articles.{鍵}.mediaTitlestring
articles.{鍵}.countrystring
articles.{鍵}.countryCodestring
articles.{鍵}.titlestring
articles.{鍵}.urlstring
articles.{鍵}.publishedAtstring (ISO 時間)
articles.{鍵}.authorsstring[]
articles.{鍵}.bodyLengthinteger
articles.{鍵}.attributionsobject[]
articles.{鍵}.attributions[].mediastring
articles.{鍵}.attributions[].namestring
articles.{鍵}.attributions[].countrystring
articles.{鍵}.attributions[].countryCodestring
articles.{鍵}.attributions[].evidencestring
articles.{鍵}.attributions[].kind"explicit"
groups{鍵: object}以 id 為鍵,本頁用到的同題報導組
groups.{鍵}.idstring
groups.{鍵}.sourceIdinteger | null同組最早刊登的文章 id
groups.{鍵}.articleIdsinteger[]同組文章,刊登時間先後排序
groups.{鍵}.tiedFirstinteger同時最早刊登的篇數
groups.{鍵}.pairCountinteger同組相似配對總數
groups.{鍵}.pairsobject[]分數最高的最多 100 組
groups.{鍵}.pairs[].idstring
groups.{鍵}.pairs[].aobject
groups.{鍵}.pairs[].a.idinteger
groups.{鍵}.pairs[].a.mediastring
groups.{鍵}.pairs[].a.mediaTitlestring
groups.{鍵}.pairs[].a.countrystring
groups.{鍵}.pairs[].a.countryCodestring
groups.{鍵}.pairs[].a.titlestring
groups.{鍵}.pairs[].a.urlstring
groups.{鍵}.pairs[].a.publishedAtstring (ISO 時間)
groups.{鍵}.pairs[].a.authorsstring[]
groups.{鍵}.pairs[].a.bodyLengthinteger
groups.{鍵}.pairs[].a.attributionsobject[]
groups.{鍵}.pairs[].a.attributions[].mediastring
groups.{鍵}.pairs[].a.attributions[].namestring
groups.{鍵}.pairs[].a.attributions[].countrystring
groups.{鍵}.pairs[].a.attributions[].countryCodestring
groups.{鍵}.pairs[].a.attributions[].evidencestring
groups.{鍵}.pairs[].a.attributions[].kind"explicit"
groups.{鍵}.pairs[].bobject
groups.{鍵}.pairs[].b.idinteger
groups.{鍵}.pairs[].b.mediastring
groups.{鍵}.pairs[].b.mediaTitlestring
groups.{鍵}.pairs[].b.countrystring
groups.{鍵}.pairs[].b.countryCodestring
groups.{鍵}.pairs[].b.titlestring
groups.{鍵}.pairs[].b.urlstring
groups.{鍵}.pairs[].b.publishedAtstring (ISO 時間)
groups.{鍵}.pairs[].b.authorsstring[]
groups.{鍵}.pairs[].b.bodyLengthinteger
groups.{鍵}.pairs[].b.attributionsobject[]
groups.{鍵}.pairs[].b.attributions[].mediastring
groups.{鍵}.pairs[].b.attributions[].namestring
groups.{鍵}.pairs[].b.attributions[].countrystring
groups.{鍵}.pairs[].b.attributions[].countryCodestring
groups.{鍵}.pairs[].b.attributions[].evidencestring
groups.{鍵}.pairs[].b.attributions[].kind"explicit"
groups.{鍵}.pairs[].scorenumber正規化內文五字片段的 Dice 相似度
groups.{鍵}.pairs[].containmentnumber共同片段占較短文章片段的比例
groups.{鍵}.pairs[].sharedShinglesinteger
groups.{鍵}.pairs[].kind"identical" | "high"
groups.{鍵}.pairs[].evidencestring最多 100 字的連續相同片段

錯誤:400 參數無效

GET/api/v1/similarity/daily

每日相似配對與引用統計

每日已比對篇數、相似配對、內文相同與明示引用,並分列各媒體。資料自 2026 年 9 月開始累積並永久保存。

參數型別說明
fromstring起始台北日期 YYYY-MM-DD;預設 to 前 29 天
tostring結束台北日期(含);預設今天
thresholdnumber最低 Dice 相似度,0.5–1,預設 0.65
curl -s 'https://tag.observe.tw/api/v1/similarity/daily'
在瀏覽器開啟這個範例 ↗
回應欄位18 個
fromstring
tostring
thresholdnumber
daysstring[]台北日期
totalsobject
totals.articlesinteger[]每日已比對篇數
totals.pairsinteger[]每日相似配對數(以較晚刊登者的日期計)
totals.identicalinteger[]其中內文相同
totals.citationsinteger[]每日明示引用則數
mediaobject[]各陣列與 days 一一對應
media[].mediastring
media[].namestring
media[].articlesinteger[]
media[].pairsinteger[]一端為此媒體的配對數
media[].copiedinteger[]被跟進:此媒體先刊出、之後有他媒刊出相似內容的篇數(文章去重,以自身刊登日計;同時刊登不計)
media[].copyinginteger[]跟進他媒:此媒體刊出時已有他媒相似文章的篇數(文章去重,以自身刊登日計;同時刊登不計)
media[].citinginteger[]此媒體引用他媒的則數
media[].citedinteger[]他媒引用此媒體的則數

錯誤:400 參數無效(最多 366 天)

GET/api/v1/articles/{id}/similarity

單篇文章的他站相似報導

索引為這篇保存的全部相似配對:與前後 7 天內其他媒體文章比對的結果,刊登多久之後仍可查詢。

參數型別說明
id(路徑)integer文章 id
thresholdnumber最低 Dice 相似度,0.5–1,預設 0.65
curl -s 'https://tag.observe.tw/api/v1/articles/1/similarity'
在瀏覽器開啟這個範例 ↗
回應欄位28 個
articleIdinteger
thresholdnumber
indexedAtstring (ISO 時間) | null索引比對時間;null 表示等待中
charsinteger | null正規化內文長度;null 表示內文太短或不可比對
windowDaysinteger
matchesobject[]相似度高者在前
matches[].articleobject
matches[].article.idinteger
matches[].article.mediastring
matches[].article.mediaTitlestring
matches[].article.countrystring
matches[].article.countryCodestring
matches[].article.titlestring
matches[].article.urlstring
matches[].article.publishedAtstring (ISO 時間)
matches[].article.authorsstring[]
matches[].article.bodyLengthinteger
matches[].article.attributionsobject[]
matches[].article.attributions[].mediastring
matches[].article.attributions[].namestring
matches[].article.attributions[].countrystring
matches[].article.attributions[].countryCodestring
matches[].article.attributions[].evidencestring
matches[].article.attributions[].kind"explicit"
matches[].scorenumber
matches[].containmentnumber
matches[].kind"identical" | "high"
matches[].evidencestring最多 100 字的連續相同片段

錯誤:400 參數無效;404 文章不存在

GET/api/v1/articles/{id}/content

單篇內文(刊登 7 天內)

參數型別說明
id(路徑)integer文章 id
curl -s 'https://tag.observe.tw/api/v1/articles/1/content'
在瀏覽器開啟這個範例 ↗
回應欄位37 個
articleobject
article.idinteger
article.mediastring
article.mediaTitlestring
article.titlestring
article.urlstring
article.imagestring | null
article.publishedAtstring (ISO 時間)排序用時間;若另有 publishedDate,刊期只有日精度,不代表確知時分
article.publishedDatestring經官方證據核實的日期;原站未公開發刊時分
article.publishedDatePrecision"day"
article.tagsstring[]
article.descriptionstring | null
article.authorsstring[]
article.publisherobject
article.publisher.mediastring
article.publisher.namestring
article.publisher.countrystring
article.publisher.countryCodestring
article.discoverySourcesobject[]
article.discoverySources[].mediastring文章發現來源代碼,非刊登媒體
article.discoverySources[].titlestring發現來源名稱
article.discoverySources[].urlstring實際發現文章的公開頁面網址
article.discoverySources[].discoveredAtstring (ISO 時間)首次經此來源發現文章的時間,不取代刊登時間
contentobject
content.status"ok" | "short" | "missing" | "blocked" | "error" | "not_fetched" | "expired"
content.bodystring | null刊登 7 天內已抓取的文字;之後為 null。不保證原站目前仍存在
content.charsinteger
content.sourcestring | null擷取方式
content.fetchedAtstring (ISO 時間) | null
content.expiresAtstring (ISO 時間) | null站內提供正文的期限:刊登後 7 天。之後 body 為 null、chars 為 0、status 為 expired。未取得正文時為 null
content.attributionsobject[]
content.attributions[].mediastring
content.attributions[].namestring
content.attributions[].countrystring
content.attributions[].countryCodestring
content.attributions[].evidencestring
content.attributions[].kind"explicit"

錯誤:400 文章 id 無效;404 文章不存在

GET/api/v1/articles

文章搜尋

依時間窗、關鍵字(標題、摘要或標籤)、媒體、分類、政治傾向、標籤篩選所有爬到的文章,新到舊排序。關鍵字只比對標題、摘要與標籤,不搜尋內文(站內正文只保留刊登後 7 天)。給 facets=1 會另外回傳整個查詢(不限本頁)依媒體與政治傾向的篇數。時間窗預設為過去 24 小時,最長 31 天。還有下一頁時 nextCursor 不為 null,把它原樣放進 cursor 參數(其他參數不變)取下一頁。

參數型別說明
qstring標題或摘要包含這段文字,或文章帶有完全相同的標籤(最多 60 字)
mediastring媒體代碼,逗號分隔(最多 50 個)
categorystring排行分類(例如 news、blue、green),與 media 同時給則取交集
camp"blue" | "green" | "other"政治傾向:blue、green 或 other(不在藍綠名單的媒體)
tagstring文章帶有這個標籤(完全相符)
sincestring起始時間(含):ISO 8601,或 YYYY-MM-DD 表示台北時間當天 0 點
untilstring結束時間(不含),格式同 since;預設現在
hoursnumber沒給 since 時,從 until 往前幾小時,預設 24
limitinteger每頁筆數,1–200,預設 50
cursorstring上一頁回應的 nextCursor
facets"0" | "1"1 表示回傳 facets(整個查詢的總數、各政治傾向與各媒體篇數)
curl -s 'https://tag.observe.tw/api/v1/articles?q=%E9%A2%B1%E9%A2%A8&hours=72&limit=20'
在瀏覽器開啟這個範例 ↗
回應欄位33 個
queryobject
query.qstring | null
query.mediastring[] | null
query.categorystring | null
query.tagstring | null
query.camp"blue" | "green" | "other" | null政治傾向分組:blue 藍營傾向、green 綠營傾向、other 其他(依 app/data/media-catalog.json)
query.sincestring (ISO 時間)
query.untilstring (ISO 時間)
query.limitinteger
countinteger本頁筆數
facetsobject只有 facets=1 時出現
facets.totalinteger整個查詢的篇數
facets.campsobject各政治傾向篇數
facets.camps.blueinteger
facets.camps.greeninteger
facets.camps.otherinteger
facets.mediaobject[]各媒體篇數,多到少
facets.media[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
facets.media[].countinteger
nextCursorstring | null下一頁的 cursor;沒有下一頁為 null
articlesobject[]
articles[].idinteger
articles[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
articles[].mediaTitlestring媒體名稱
articles[].camp"blue" | "green" | "other"政治傾向分組:blue 藍營傾向、green 綠營傾向、other 其他(依 app/data/media-catalog.json)
articles[].titlestring
articles[].descriptionstring | null摘要(媒體提供的 description)
articles[].urlstring
articles[].imagestring | null
articles[].publishedAtstring (ISO 時間)發布時間(UTC)
articles[].datePendingbooleantrue 表示來源沒有提供發布時間、內文尚未抓取,publishedAt 暫為首次看到的時間
articles[].sectionstring | null媒體自己的分類/欄目
articles[].tagsstring[]

錯誤:400 參數錯誤(未知媒體、分類或政治傾向、時間格式、時間窗超過上限、cursor 無效)

記者署名與跨媒體相似

GET/api/v1/journalists

期間內具名記者一覽

從文章署名整理出人名或筆名(排除媒體、部門、通訊社、職稱、電頭與責任編輯),列出各自的刊登媒體與篇數。相似統計取自同期間、同門檻的全量相似度索引;compared 為已比對篇數。同名不同人不會分開;較晚刊登只是閱讀線索,不是抄襲判定。

參數型別說明
hoursinteger回溯小時,1–168,預設 48
thresholdnumber最低 Dice 相似度,0.5–1,預設 0.65
limitinteger最多回傳人數(依篇數排序),1–3000,預設 500
curl -s 'https://tag.observe.tw/api/v1/journalists?hours=48&limit=50'
在瀏覽器開啟這個範例 ↗
回應欄位32 個
generatedAtstring (ISO 時間)
hoursinteger
thresholdnumber
methodstring
indexobject
index.analyzedinteger期間內已比對篇數
index.pairsinteger期間內門檻以上的相似配對數
index.windowDaysinteger
index.fromstring (ISO 時間)期間起點
totalsobject
totals.journalistsinteger具名人數
totals.articlesinteger有人名署名的文章數
totals.creditedinteger有任何署名欄位的文章數
limitinteger
journalistsobject[]
journalists[].namestring署名整理出的人名或筆名
journalists[].articlesinteger期間內署名文章數
journalists[].mediaobject[]刊登媒體,篇數多者在前
journalists[].media[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
journalists[].media[].namestring媒體名稱
journalists[].media[].countinteger期間內署名篇數
journalists[].withBodyinteger有可比對正文的篇數
journalists[].citedinteger內文明示引用其他媒體的篇數
journalists[].lateststring (ISO 時間)最近一篇刊登時間
journalists[].comparedinteger相似度索引已比對的篇數
journalists[].similarobject
journalists[].similar.pairsinteger至少一端是此記者文章的相似配對數
journalists[].similar.articlesinteger有相似配對的自家文章數(去重)
journalists[].similar.laterinteger自家文章比對方晚至少一分鐘刊登的配對數;不含同署名跨站
journalists[].similar.earlierinteger自家文章比對方早至少一分鐘刊登的配對數;不含同署名跨站
journalists[].similar.sameAuthorinteger對方文章也署同一名字的配對數(同一人跨媒體刊登)
journalists[].similar.identicalinteger正規化內文完全相同的配對數

錯誤:400 參數無效

GET/api/v1/journalists/{name}

單一記者的文章、刊登媒體與他站相似配對

列出期間內署此名字的文章(以站方署名欄位比對,再以同一套人名整理規則確認)。相似配對來自全量相似度索引:每篇已比對的文章都與前後 7 天內其他媒體的全部文章比對,排除「內容」聯播來源。同署名的跨站版本另計為 sameAuthor。

參數型別說明
name(路徑)string人名或筆名(2–40 字)
hoursinteger回溯小時,1–720,預設 168
thresholdnumber最低 Dice 相似度,0.5–1,預設 0.65
curl -s 'https://tag.observe.tw/api/v1/journalists/%E5%BD%AD%E5%B7%A7%E8%93%81?hours=168'
在瀏覽器開啟這個範例 ↗
回應欄位97 個
namestring
generatedAtstring (ISO 時間)
hoursinteger
thresholdnumber
methodstring
statsobject
stats.articlesinteger
stats.withBodyinteger
stats.averageCharsinteger | null可讀正文的平均字元數
stats.citedinteger
stats.tagsobject[]最多 30 個常見標籤
stats.tags[].tagstring
stats.tags[].countinteger
stats.similarobject
stats.similar.pairsinteger至少一端是此記者文章的相似配對數
stats.similar.articlesinteger有相似配對的自家文章數(去重)
stats.similar.laterinteger自家文章比對方晚至少一分鐘刊登的配對數;不含同署名跨站
stats.similar.earlierinteger自家文章比對方早至少一分鐘刊登的配對數;不含同署名跨站
stats.similar.sameAuthorinteger對方文章也署同一名字的配對數(同一人跨媒體刊登)
stats.similar.identicalinteger正規化內文完全相同的配對數
mediaobject[]
media[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
media[].namestring媒體名稱
media[].countinteger期間內署名篇數
articlesobject[]期間內署名文章,最新在前,最多 1000 篇
articles[].idinteger
articles[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
articles[].mediaTitlestring
articles[].titlestring
articles[].urlstring
articles[].imagestring | null
articles[].publishedAtstring (ISO 時間)
articles[].tagsstring[]
articles[].bodyStatus"ok" | "short" | "missing" | "blocked" | "error" | "not_fetched" | "expired"
articles[].bodyCharsinteger站內可讀的正文字元數;超過刊登後 7 天為 0
articles[].bylinestring[]站方原始署名欄位,未經整理
articles[].coauthorsstring[]同篇其他具名作者
articles[].attributionsobject[]內文明示引用的媒體
articles[].attributions[].mediastring
articles[].attributions[].namestring
articles[].attributions[].countrystring
articles[].attributions[].countryCodestring
articles[].attributions[].evidencestring
articles[].attributions[].kind"explicit"
articles[].matchesinteger這篇與他站的相似配對數
articles[].comparedboolean相似度索引是否已比對這篇
pairsobject[]相似度高者在前
pairs[].ownobject
pairs[].own.idinteger
pairs[].own.mediastring
pairs[].own.mediaTitlestring
pairs[].own.countrystring
pairs[].own.countryCodestring
pairs[].own.titlestring
pairs[].own.urlstring
pairs[].own.publishedAtstring (ISO 時間)
pairs[].own.authorsstring[]
pairs[].own.bodyLengthinteger
pairs[].own.attributionsobject[]
pairs[].own.attributions[].mediastring
pairs[].own.attributions[].namestring
pairs[].own.attributions[].countrystring
pairs[].own.attributions[].countryCodestring
pairs[].own.attributions[].evidencestring
pairs[].own.attributions[].kind"explicit"
pairs[].otherobject
pairs[].other.idinteger
pairs[].other.mediastring
pairs[].other.mediaTitlestring
pairs[].other.countrystring
pairs[].other.countryCodestring
pairs[].other.titlestring
pairs[].other.urlstring
pairs[].other.publishedAtstring (ISO 時間)
pairs[].other.authorsstring[]
pairs[].other.bodyLengthinteger
pairs[].other.attributionsobject[]
pairs[].other.attributions[].mediastring
pairs[].other.attributions[].namestring
pairs[].other.attributions[].countrystring
pairs[].other.attributions[].countryCodestring
pairs[].other.attributions[].evidencestring
pairs[].other.attributions[].kind"explicit"
pairs[].scorenumber正規化內文五字片段的 Dice 相似度
pairs[].containmentnumber
pairs[].sharedShinglesinteger
pairs[].kind"identical" | "high"
pairs[].evidencestring最多 100 字的連續相同片段
pairs[].minutesinteger對方刊登時間減自家刊登時間(分鐘);正值表示自家較早
pairs[].relation"later" | "earlier" | "same"later 自家較晚、earlier 自家較早、same 一分鐘內
pairs[].sameAuthorboolean對方文章署同一名字
pairs[].ownCitesOtherboolean自家文章明示引用對方媒體
pairs[].otherCitesOwnboolean對方文章明示引用自家媒體
indexobject
index.comparedinteger已比對的自家文章數
index.pendinginteger有可用正文、等待索引的自家文章數
index.windowDaysinteger每篇與前後幾天內的他家文章比對

錯誤:400 參數無效;404 期間內沒有文章署此名字

單一標籤

GET/api/v1/tags/{tag}/articles

帶有某標籤的最新文章

參數型別說明
tag(路徑)string標籤(URL 編碼)
hoursinteger往前幾小時,1–336,預設 48
limitinteger筆數,1–200,預設 60
curl -s 'https://tag.observe.tw/api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/articles?limit=20'
在瀏覽器開啟這個範例 ↗
回應欄位11 個
tagstring
hoursinteger
articlesobject[]
articles[].idinteger文章 id
articles[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
articles[].titlestring標題
articles[].urlstring原文網址
articles[].imagestring | null代表圖網址
articles[].publishedAtstring (ISO 時間)發布時間(UTC)
articles[].tagsstring[]文章標籤
articles[].mediaTitlestring媒體名稱

GET/api/v1/tags/{tag}/series

標籤每小時的分數與文章數

每個完整小時一點。hourlyCount 從收錄文章按發布時間統計,average24h 為當小時及前 23 小時篇數總和 ÷ 24,無報導小時以 0 計,並讀取顯示範圍前 23 小時。整條曲線只使用 basis 的固定媒體,score/count 也從文章重算 24 小時加權分數/累計篇數。rank 是該小時排行快照中依原始分數的名次(同一分類);該小時沒有快照或未進入儲存的榜單時為 null。coverageFrom 前的篇數、validFrom 前的平均與分數均為 null;收錄開始後的空小時以零計。歷史篇數反映目前資料庫收錄,可包含後來補抓的文章。

參數型別說明
tag(路徑)string標籤(URL 編碼)
categorystring排行分類,見 /api/v1/categories,預設 all
hoursinteger往前幾小時,1–336,預設 72
curl -s 'https://tag.observe.tw/api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/series?hours=168'
在瀏覽器開啟這個範例 ↗
回應欄位15 個
tagstring
categorystring
hoursinteger
basisobject
basis.idstring固定媒體名單版本
basis.mediastring[]
basis.coverageFromstring (ISO 時間)所有基準來源開始收錄後的第一個完整小時
basis.validFromstring (ISO 時間)收錄開始後滿 24 小時;更早的移動平均及分數為 null
pointsobject[]
points[].tstring (ISO 時間)完整小時起點(UTC)
points[].scorenumber | null24 小時正規化分數
points[].countinteger | null固定基準 24 小時累計篇數,非單小時篇數
points[].rankinteger | null該小時快照中依原始分數的名次;沒有快照或未入榜為 null
points[].hourlyCountinteger | null該小時收錄篇數;收錄開始前為 null
points[].average24hnumber | null24 小時移動平均(篇/小時);歷史不足為 null

錯誤:404 未知分類

GET/api/v1/tags/{tag}/status

標籤目前狀態

關鍵字頁的摘要:這個標籤在新聞媒體排行榜上的名次、分數、爆發力、24 小時變動與報導媒體家數(不在榜上為 null)、最常一起出現的標籤、最近 72 小時含這個標籤的事件串,以及長期統計的首次上榜與高峰。

參數型別說明
tag(路徑)string標籤(URL 編碼)
curl -s 'https://tag.observe.tw/api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/status'
在瀏覽器開啟這個範例 ↗
回應欄位32 個
tagstring
rankingobject | null
ranking.categorystring排行分類;目前固定為 news
ranking.hourStartstring (ISO 時間)快照所屬小時
ranking.positioninteger依爆發力的名次
ranking.rankinteger依原始分數的名次
ranking.normalizednumber正規化分數
ranking.burstnumber | null爆發力
ranking.countinteger過去 24 小時文章數
ranking.mediaCountinteger報導的基準媒體家數
ranking.basisMediaCountinteger基準媒體總數
ranking.rank24hinteger | null24 小時前依分數的名次
ranking.newboolean24 小時前不在完整榜單上
relatedobject[]最多 8 個,依共同文章數排序
related[].tagstring
related[].countinteger共同文章數
related[].sharenumber佔這個標籤文章數的比例(0–1)
threadsobject[]最近 72 小時內含這個標籤的 news 事件串,最多 6 個,最近活動的在前
threads[].idinteger事件串 id;頁面為 /eve/{id}/
threads[].maxTagstring | null事件串的代表標籤
threads[].majorTagsstring[]
threads[].firstTimestring (ISO 時間)
threads[].lastTimestring (ISO 時間)
threads[].hoursinteger出現在事件榜的小時數
threads[].maxScorenumber最高分
historyobject | nullnews 分類的長期統計
history.levelinteger2 或 3;優先回傳 3
history.firstHourstring (ISO 時間)首次上榜小時
history.lastHourstring (ISO 時間)最近上榜小時
history.hoursCountinteger上榜小時數
history.maxHourstring (ISO 時間)文章數最多的小時
history.maxCountinteger該小時文章數

GET/api/v1/tags/{tag}/stats

標籤長期統計

這個標籤在各分類第一次/最後一次上榜的小時、上榜小時數與最高峰。level 2:至少 2 家媒體各提到 2 次以上;level 3:另需至少 3 家媒體、其中一家 3 次以上(news 分類的門檻,其他分類較寬)。

參數型別說明
tag(路徑)string標籤(URL 編碼)
curl -s 'https://tag.observe.tw/api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/stats'
在瀏覽器開啟這個範例 ↗
回應欄位9 個
tagstring
statsobject[]
stats[].categorystring
stats[].levelinteger
stats[].firstHourstring (ISO 時間)
stats[].lastHourstring (ISO 時間)
stats[].hoursCountinteger上榜小時數
stats[].maxHourstring (ISO 時間)文章數最多的小時
stats[].maxCountinteger該小時文章數

事件(同一件事,各家怎麼說)

GET/api/v1/events

目前的事件排行(每小時)

把同時爆發的標籤分群成「事件」,每小時 :04 與 :34 重算。prev/next/dayHours 可用於翻閱歷史小時(放進 at)。stale 為 true 表示最新快照超過 3 小時未更新。

參數型別說明
limitinteger事件數,1–30,預設 30
atstring (ISO 時間)取這個時間(ISO 8601)以前最新的一小時
curl -s 'https://tag.observe.tw/api/v1/events?limit=10'
在瀏覽器開啟這個範例 ↗
回應欄位54 個
hourstring (ISO 時間)快照小時(UTC)
builtAtstring (ISO 時間)
staleboolean
prevstring (ISO 時間) | null上一個有快照的小時
nextstring (ISO 時間) | null下一個有快照的小時;最新時為 null
dayHoursstring (ISO 時間)[]同一台北日內所有有快照的小時
dayStatsobject[]同一台北日內每個快照小時的概況
dayStats[].hourstring (ISO 時間)
dayStats[].topnumber該小時第 1 名的爆發力
dayStats[].countinteger該小時事件數
baselineobject各陣營的整體基準,用來判斷單一事件的藍綠比例是否異常;其他只計排行榜用的新聞媒體
baseline.outletsobject事件窗口(過去 24 小時)內有發稿的媒體家數
baseline.outlets.blueinteger
baseline.outlets.greeninteger
baseline.outlets.otherinteger
baseline.articlesobject同窗口內各陣營文章數
baseline.articles.blueinteger
baseline.articles.greeninteger
baseline.articles.otherinteger
eventsobject[]
events[].rankinteger
events[].scorenumber
events[].majorstring[]主要標籤
events[].tagsobject[]事件內所有標籤與爆發力
events[].tags[].tagstring
events[].tags[].burstnumber
events[].newsobject[]代表新聞(最多 6 則),各附媒體陣營 camp
events[].news[].idinteger | null文章 id(舊資料可能為 null)
events[].news[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
events[].news[].titlestring標題
events[].news[].urlstring原文網址
events[].news[].imagestring | null代表圖網址
events[].news[].campstring媒體陣營 blue/green/other(只在 /api/v1/events 回傳)
events[].relatedEventPkstring | null= threadId 的字串形式(相容舊版)
events[].threadIdinteger | null事件串 id,可查 /api/v1/events/threads/{id}
events[].prevRankinteger | null前一個快照的名次(依事件串或主要標籤比對);null 表示本小時新上榜
events[].hoursinteger | null事件串到這個小時為止已出現的小時數
events[].rankTrailinteger | null[] | null事件串在截至本小時的 24 個快照小時的名次(最舊在前);不在榜上的小時為 null
events[].firstTimestring (ISO 時間) | null事件串第一次上榜的小時
events[].coverageobject
events[].coverage.outletsobject[]過去 24 小時寫過此事件主要標籤的媒體,依篇數排序
events[].coverage.outlets[].mediastring
events[].coverage.outlets[].campstringblue/green/other
events[].coverage.articlesinteger報導篇數
events[].coverage.campsobject各陣營媒體家數
events[].coverage.camps.blueinteger
events[].coverage.camps.greeninteger
events[].coverage.camps.otherinteger
events[].coverage.shareobject | null藍綠之間的家數百分比(不含其他)
events[].coverage.share.blueinteger
events[].coverage.share.greeninteger
events[].coverage.leannumber | null藍綠家數比相對於 baseline 的 log2;0 為平常比例,正偏藍、負偏綠
events[].coverage.tiltstring | null明顯偏向的陣營(|lean| ≥ 0.8,約 1.75 倍,且藍綠合計 ≥ 5 家)
events[].coverage.blindspotstring[]盲點:幾乎沒報導的陣營(該陣營 ≤ 1 家而另一陣營 ≥ 4 家)。blue 表示藍營讀者看不到這件事

錯誤:400 at 格式錯誤;404 該時間以前沒有快照;503 尚無任何快照

GET/api/v1/events/threads

某一天的所有事件串

台北時間某一天內曾出現的事件串,依最高分排序(最多 300 個)。days 列出所有有資料的日期。藍綠報導(coverage、baseline)的窗口是到當天結束為止的 24 小時,也就是當天整天;今天則是到現在為止的 24 小時,與 /api/v1/events 相同。

參數型別說明
daystring台北日期 YYYY-MM-DD,預設今天
curl -s 'https://tag.observe.tw/api/v1/events/threads?day=2026-09-30'
在瀏覽器開啟這個範例 ↗
回應欄位49 個
daystring
daysstring[]
dayHoursstring (ISO 時間)[]當天所有有快照的小時
dayStatsobject[]當天每個快照小時的概況
dayStats[].hourstring (ISO 時間)
dayStats[].topnumber該小時第 1 名的爆發力
dayStats[].countinteger該小時事件數
baselineobject各陣營的整體基準,用來判斷單一事件的藍綠比例是否異常;其他只計排行榜用的新聞媒體
baseline.outletsobject事件窗口(當天)內有發稿的媒體家數
baseline.outlets.blueinteger
baseline.outlets.greeninteger
baseline.outlets.otherinteger
baseline.articlesobject同窗口內各陣營文章數
baseline.articles.blueinteger
baseline.articles.greeninteger
baseline.articles.otherinteger
threadsobject[]
threads[].idinteger
threads[].firstTimestring (ISO 時間)
threads[].lastTimestring (ISO 時間)
threads[].hoursinteger出現的小時數
threads[].majorTagsstring[]
threads[].maxTagstring | null分數最高的標籤
threads[].maxScorenumber
threads[].bestRankinteger | null最佳名次
threads[].rankTrailinteger | null[] | null到 trailEnd 為止 24 個快照小時的名次(最舊在前);不在榜上的小時為 null
threads[].trailEndstring (ISO 時間) | null名次走勢的最後一小時:事件串當天最後在榜的小時
threads[].coverageobject
threads[].coverage.outletsobject[]當天寫過此事件主要標籤的媒體,依篇數排序
threads[].coverage.outlets[].mediastring
threads[].coverage.outlets[].campstringblue/green/other
threads[].coverage.articlesinteger報導篇數
threads[].coverage.campsobject各陣營媒體家數
threads[].coverage.camps.blueinteger
threads[].coverage.camps.greeninteger
threads[].coverage.camps.otherinteger
threads[].coverage.shareobject | null藍綠之間的家數百分比(不含其他)
threads[].coverage.share.blueinteger
threads[].coverage.share.greeninteger
threads[].coverage.leannumber | null藍綠家數比相對於 baseline 的 log2;0 為平常比例,正偏藍、負偏綠
threads[].coverage.tiltstring | null明顯偏向的陣營(|lean| ≥ 0.8,約 1.75 倍,且藍綠合計 ≥ 5 家)
threads[].coverage.blindspotstring[]盲點:幾乎沒報導的陣營(該陣營 ≤ 1 家而另一陣營 ≥ 4 家)。blue 表示藍營讀者看不到這件事
threads[].newsobject[]最佳名次那一小時的代表新聞(最多 6 則),各附媒體陣營 camp
threads[].news[].idinteger | null文章 id(舊資料可能為 null)
threads[].news[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
threads[].news[].titlestring標題
threads[].news[].urlstring原文網址
threads[].news[].imagestring | null代表圖網址
threads[].news[].campstring媒體陣營 blue/green/other(只在 /api/v1/events 回傳)

錯誤:400 日期格式錯誤

GET/api/v1/events/threads/{id}

單一事件串

事件串的整體資訊與逐小時紀錄(最多 72 小時,新到舊)。thread.history 的鍵是台北時間 YYYY-MM-DD HH:00:00。

參數型別說明
id(路徑)integer事件串 id(/api/v1/events 的 threadId)
curl -s 'https://tag.observe.tw/api/v1/events/threads/365'
在瀏覽器開啟這個範例 ↗
回應欄位30 個
threadobject
thread.idinteger
thread.categorystring
thread.firstTimestring (ISO 時間)
thread.lastTimestring (ISO 時間)
thread.hoursinteger
thread.allTagsstring[]
thread.majorTagsstring[]
thread.maxTagstring | null
thread.maxScorenumber
thread.history{鍵: {鍵: number}}台北時間小時 → 標籤 → 分數
thread.combinedFrominteger[]併入本串的事件串
thread.combinedTointeger[]本串併入的事件串
thread.hoursTotalinteger | null
thread.equalFirstTimestring (ISO 時間) | null
thread.equalLastTimestring (ISO 時間) | null
relatedinteger[]相關事件串 id
hoursobject[]
hours[].hourStartstring (ISO 時間)
hours[].rankinteger
hours[].scorenumber
hours[].majorstring[]
hours[].tags[string, number][][標籤, 爆發力]
hours[].newsobject[]
hours[].news[].idinteger | null文章 id(舊資料可能為 null)
hours[].news[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
hours[].news[].titlestring標題
hours[].news[].urlstring原文網址
hours[].news[].imagestring | null代表圖網址
hours[].news[].campstring媒體陣營 blue/green/other(只在 /api/v1/events 回傳)

錯誤:400 id 格式錯誤;404 找不到

GET/api/v1/events/threads/{id}/series

事件串的每小時趨勢

事件主要標籤(最多 6 個)以固定媒體基準重算每小時分數,歷史不足為 null;藍/綠/其他報導數則涵蓋所有媒體。前後各多 12 小時,只畫已完成小時。

參數型別說明
id(路徑)integer事件串 id(/api/v1/events 的 threadId)
curl -s 'https://tag.observe.tw/api/v1/events/threads/365/series'
在瀏覽器開啟這個範例 ↗
回應欄位17 個
threadIdinteger
basisobject
basis.idstring固定媒體名單版本
basis.mediastring[]
basis.coverageFromstring (ISO 時間)所有基準來源開始收錄後的第一個完整小時
basis.validFromstring (ISO 時間)收錄開始後滿 24 小時;更早的移動平均及分數為 null
tagsstring[]
fromstring (ISO 時間)
tostring (ISO 時間)
pointsobject[]
points[].tstring (ISO 時間)
points[].blueinteger藍營傾向媒體文章數
points[].greeninteger綠營傾向媒體文章數
points[].otherinteger其他媒體文章數
points[].tags{鍵: object} | null
points[].tags.{鍵}.scorenumber | null
points[].tags.{鍵}.rankinteger | null固定為 null

錯誤:400 id 格式錯誤;404 找不到

GET/api/v1/events/threads/{id}/coverage

同一事件的各家標題對照

帶有事件主要標籤的所有文章,依媒體與藍/綠/其他分組。blindspot 列出「對方陣營有報、這一方完全沒報」的陣營。

參數型別說明
id(路徑)integer事件串 id(/api/v1/events 的 threadId)
curl -s 'https://tag.observe.tw/api/v1/events/threads/365/coverage'
在瀏覽器開啟這個範例 ↗
回應欄位24 個
threadIdinteger
majorTagsstring[]
fromstring (ISO 時間)
tostring (ISO 時間)
articlesinteger文章總數
outletsinteger媒體數
campsobject[]
camps[].camp"blue" | "green" | "other"政治傾向分組:blue 藍營傾向、green 綠營傾向、other 其他(依 app/data/media-catalog.json)
camps[].labelstring
camps[].outletsinteger
camps[].articlesinteger
blindspot"blue" | "green" | "other"[]
byOutletobject[]
byOutlet[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
byOutlet[].titlestring
byOutlet[].iconstring | null
byOutlet[].camp"blue" | "green" | "other"政治傾向分組:blue 藍營傾向、green 綠營傾向、other 其他(依 app/data/media-catalog.json)
byOutlet[].articlesobject[]
byOutlet[].articles[].idinteger
byOutlet[].articles[].titlestring
byOutlet[].articles[].urlstring
byOutlet[].articles[].imagestring | null
byOutlet[].articles[].publishedAtstring (ISO 時間)
byOutlet[].articles[].hitsinteger這篇文章帶了幾個事件主要標籤

錯誤:400 id 格式錯誤;404 找不到

各媒體的議題/專題

GET/api/v1/topics

各媒體的議題/專題

kind=topic(預設)為議題:持續增加新聞的集合;kind=feature 為專題:一次性的新聞包(長文、微網站或一次發完的系列)。媒體入口有宣告者依宣告,其餘依專題頁所列新聞的日期判定。不給 media:跨媒體合併的議題流(feed,依最後更新新到舊,附站內相關報導 coverage,不含已停更與更新時間不明者;開始追蹤前已上架的議題有新報導也會列入)與各媒體最近更新的議題(media)。給 media:只回該媒體最近更新的議題(同樣附 coverage),子議題列在上層議題的 children。給 tag 或 q(且不給 media):不分 kind,回所有媒體帶這個標籤/名稱含這段文字的上層議題與專題(含已停更,不附 coverage),依媒體分組:符合數多的媒體在前,同一媒體依最後更新新到舊、更新時間不明者在後。不給 media 時都附 tags:所有未停更上層議題與專題名稱中最常見的站內標籤(依媒體家數,前 40 個)。所有列表依最後更新(updatedAt)排序:議題頁上最新一則報導的時間;沒有報導日期的用本站首次發現時間(backlog 則為不明,排最後)。每小時 :50 檢查官方入口,check 顯示各媒體檢查狀態;部分入口失敗時保留成功結果與既有資料。

參數型別說明
kind"topic" | "feature"topic 議題(預設)或 feature 專題
mediastring只取這家媒體(須為有追蹤議題的媒體)
limitinteger筆數:有 media 時預設 20、最多 200;否則為 feed 筆數,預設 60、最多 120
perinteger沒給 media 時,每家媒體附幾則最近議題,1–10,預設 4
tagstring只取名稱對應到這個站內標籤的議題與專題(不分 kind,跨媒體)
qstring只取名稱含這段文字的議題與專題(不分大小寫,最多 50 字;不分 kind,跨媒體)
curl -s 'https://tag.observe.tw/api/v1/topics?limit=20'
在瀏覽器開啟這個範例 ↗
回應欄位(不給 media)93 個
kind"topic" | "feature"
mediaobject[]
media[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
media[].titlestring
media[].iconstring | null
media[].linkstring媒體議題列表頁
media[].checkobject
media[].check.checkedAtstring (ISO 時間) | null最近一次完成檢查時間
media[].check.lastSuccessAtstring (ISO 時間) | null最近一次所有入口成功的時間
media[].check.statusstringok、partial、failed、running 或 pending
media[].check.fetchedinteger本次取得的去重專題數
media[].check.staleboolean超過三小時未完整更新,或尚未成功
media[].check.sourcesobject[]最近一次完成檢查的各入口結果
media[].check.sources[].urlstring媒體官方的議題/專題列表入口
media[].check.sources[].kind"topic" | "feature" | "auto"入口宣告的類型:topic 議題、feature 專題、auto 依新聞日期判定
media[].check.sources[].itemsinteger本次取得的項目數
media[].check.sources[].pagesinteger有分頁時實際讀到第幾頁
media[].check.sources[].errorstring入口失敗或部分項目失敗的原因
media[].check.errorstring整次檢查失敗時的錯誤訊息
media[].countinteger該媒體累計追蹤到的 kind 類項目數
media[].countsobject該媒體累計追蹤到的議題與專題數
media[].counts.topicinteger累計議題數
media[].counts.featureinteger累計專題數
media[].latestobject | null
media[].latest.idstring議題 id
media[].latest.timestring (ISO 時間)首次看到的時間
media[].latest.backlogbooleantrue 表示開始追蹤該入口時就已上架(或在列表第二頁之後),time 只是開始追蹤的時間
media[].latest.titlestring議題名稱
media[].latest.urlstring媒體的專題頁網址
media[].latest.imagestring | null
media[].latest.kind"topic" | "feature"topic 議題(持續增加新聞)、feature 專題(一次性的新聞包)
media[].latest.status"active" | "ended"active;ended=已停更(議題最新一則新聞超過 90 天)
media[].latest.sponsoredboolean媒體標示為廣告/品牌合作
media[].latest.parentIdinteger | null上層議題 id(子議題);與 id 不同,為數字
media[].latest.storyFirstAtstring (ISO 時間) | null專題頁所列新聞中最早一則的日期
media[].latest.storyLastAtstring (ISO 時間) | null專題頁所列新聞中最新一則的日期
media[].latest.updatedAtstring (ISO 時間) | null最後更新:有 storyLastAt 用 storyLastAt,否則非 backlog 用 time(首次看到);backlog 又沒有報導日期者為 null(更新時間不明)。所有列表依此新到舊排序,null 在最後
media[].latest.storyCountinteger | null專題頁所列新聞數
media[].latest.tagsstring[]從議題名稱比對到的站內標籤(只看名稱,不需近期有報導;比對不到為空陣列)
media[].recentobject[]
media[].recent[].idstring議題 id
media[].recent[].timestring (ISO 時間)首次看到的時間
media[].recent[].backlogbooleantrue 表示開始追蹤該入口時就已上架(或在列表第二頁之後),time 只是開始追蹤的時間
media[].recent[].titlestring議題名稱
media[].recent[].urlstring媒體的專題頁網址
media[].recent[].imagestring | null
media[].recent[].kind"topic" | "feature"topic 議題(持續增加新聞)、feature 專題(一次性的新聞包)
media[].recent[].status"active" | "ended"active;ended=已停更(議題最新一則新聞超過 90 天)
media[].recent[].sponsoredboolean媒體標示為廣告/品牌合作
media[].recent[].parentIdinteger | null上層議題 id(子議題);與 id 不同,為數字
media[].recent[].storyFirstAtstring (ISO 時間) | null專題頁所列新聞中最早一則的日期
media[].recent[].storyLastAtstring (ISO 時間) | null專題頁所列新聞中最新一則的日期
media[].recent[].updatedAtstring (ISO 時間) | null最後更新:有 storyLastAt 用 storyLastAt,否則非 backlog 用 time(首次看到);backlog 又沒有報導日期者為 null(更新時間不明)。所有列表依此新到舊排序,null 在最後
media[].recent[].storyCountinteger | null專題頁所列新聞數
media[].recent[].tagsstring[]從議題名稱比對到的站內標籤(只看名稱,不需近期有報導;比對不到為空陣列)
feedobject[]
feed[].idstring議題 id
feed[].timestring (ISO 時間)首次看到的時間
feed[].backlogbooleantrue 表示開始追蹤該入口時就已上架(或在列表第二頁之後),time 只是開始追蹤的時間
feed[].titlestring議題名稱
feed[].urlstring媒體的專題頁網址
feed[].imagestring | null
feed[].kind"topic" | "feature"topic 議題(持續增加新聞)、feature 專題(一次性的新聞包)
feed[].status"active" | "ended"active;ended=已停更(議題最新一則新聞超過 90 天)
feed[].sponsoredboolean媒體標示為廣告/品牌合作
feed[].parentIdinteger | null上層議題 id(子議題);與 id 不同,為數字
feed[].storyFirstAtstring (ISO 時間) | null專題頁所列新聞中最早一則的日期
feed[].storyLastAtstring (ISO 時間) | null專題頁所列新聞中最新一則的日期
feed[].updatedAtstring (ISO 時間) | null最後更新:有 storyLastAt 用 storyLastAt,否則非 backlog 用 time(首次看到);backlog 又沒有報導日期者為 null(更新時間不明)。所有列表依此新到舊排序,null 在最後
feed[].storyCountinteger | null專題頁所列新聞數
feed[].tagsstring[]從議題名稱比對到的站內標籤(只看名稱,不需近期有報導;比對不到為空陣列)
feed[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
feed[].mediaTitlestring
feed[].iconstring | null
feed[].mediaImagestring | null
feed[].coverageobject | null站內相關報導;比對不到站內標籤時為 null
feed[].coverage.tagsstring[]議題對應到的站內標籤
feed[].coverage.basisstringtitle=從議題名稱比對到的標籤;page=議題名稱比對不到時,該媒體專題頁所列自家文章共有的標籤
feed[].coverage.countinteger過去 3 天同時帶有這些標籤的文章數
feed[].coverage.cappedbooleancount 達上限 500
feed[].coverage.mediaCountinteger
feed[].coverage.latestobject[]
feed[].coverage.latest[].idinteger
feed[].coverage.latest[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
feed[].coverage.latest[].mediaTitlestring
feed[].coverage.latest[].titlestring
feed[].coverage.latest[].urlstring
feed[].coverage.latest[].timestring (ISO 時間)
tagsobject[]議題與專題最常見的標籤
tags[].tagstring
tags[].mediainteger有議題或專題帶這個標籤的媒體家數
tags[].topicinteger帶這個標籤的議題數
tags[].featureinteger帶這個標籤的專題數
回應欄位(給 tag 或 q(不給 media))31 個
tagstring | null
qstring | null
totalinteger符合的項目數
mediaCountinteger符合的媒體家數
countsobject
counts.topicinteger符合的議題數
counts.featureinteger符合的專題數
topicsobject[]依媒體分組;limit 預設 300、最多 500
topics[].idstring議題 id
topics[].timestring (ISO 時間)首次看到的時間
topics[].backlogbooleantrue 表示開始追蹤該入口時就已上架(或在列表第二頁之後),time 只是開始追蹤的時間
topics[].titlestring議題名稱
topics[].urlstring媒體的專題頁網址
topics[].imagestring | null
topics[].kind"topic" | "feature"topic 議題(持續增加新聞)、feature 專題(一次性的新聞包)
topics[].status"active" | "ended"active;ended=已停更(議題最新一則新聞超過 90 天)
topics[].sponsoredboolean媒體標示為廣告/品牌合作
topics[].parentIdinteger | null上層議題 id(子議題);與 id 不同,為數字
topics[].storyFirstAtstring (ISO 時間) | null專題頁所列新聞中最早一則的日期
topics[].storyLastAtstring (ISO 時間) | null專題頁所列新聞中最新一則的日期
topics[].updatedAtstring (ISO 時間) | null最後更新:有 storyLastAt 用 storyLastAt,否則非 backlog 用 time(首次看到);backlog 又沒有報導日期者為 null(更新時間不明)。所有列表依此新到舊排序,null 在最後
topics[].storyCountinteger | null專題頁所列新聞數
topics[].tagsstring[]從議題名稱比對到的站內標籤(只看名稱,不需近期有報導;比對不到為空陣列)
topics[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
topics[].mediaTitlestring
topics[].iconstring | null
tagsobject[]議題與專題最常見的標籤
tags[].tagstring
tags[].mediainteger有議題或專題帶這個標籤的媒體家數
tags[].topicinteger帶這個標籤的議題數
tags[].featureinteger帶這個標籤的專題數
回應欄位(給 media)67 個
mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
kind"topic" | "feature"
titlestring
linkstring
mediaImagestring | null
checkobject
check.checkedAtstring (ISO 時間) | null最近一次完成檢查時間
check.lastSuccessAtstring (ISO 時間) | null最近一次所有入口成功的時間
check.statusstringok、partial、failed、running 或 pending
check.fetchedinteger本次取得的去重專題數
check.staleboolean超過三小時未完整更新,或尚未成功
check.sourcesobject[]最近一次完成檢查的各入口結果
check.sources[].urlstring媒體官方的議題/專題列表入口
check.sources[].kind"topic" | "feature" | "auto"入口宣告的類型:topic 議題、feature 專題、auto 依新聞日期判定
check.sources[].itemsinteger本次取得的項目數
check.sources[].pagesinteger有分頁時實際讀到第幾頁
check.sources[].errorstring入口失敗或部分項目失敗的原因
check.errorstring整次檢查失敗時的錯誤訊息
countinteger該媒體累計追蹤到的 kind 類項目數
countsobject該媒體累計追蹤到的議題與專題數
counts.topicinteger累計議題數
counts.featureinteger累計專題數
topicsobject[]
topics[].idstring議題 id
topics[].timestring (ISO 時間)首次看到的時間
topics[].backlogbooleantrue 表示開始追蹤該入口時就已上架(或在列表第二頁之後),time 只是開始追蹤的時間
topics[].titlestring議題名稱
topics[].urlstring媒體的專題頁網址
topics[].imagestring | null
topics[].kind"topic" | "feature"topic 議題(持續增加新聞)、feature 專題(一次性的新聞包)
topics[].status"active" | "ended"active;ended=已停更(議題最新一則新聞超過 90 天)
topics[].sponsoredboolean媒體標示為廣告/品牌合作
topics[].parentIdinteger | null上層議題 id(子議題);與 id 不同,為數字
topics[].storyFirstAtstring (ISO 時間) | null專題頁所列新聞中最早一則的日期
topics[].storyLastAtstring (ISO 時間) | null專題頁所列新聞中最新一則的日期
topics[].updatedAtstring (ISO 時間) | null最後更新:有 storyLastAt 用 storyLastAt,否則非 backlog 用 time(首次看到);backlog 又沒有報導日期者為 null(更新時間不明)。所有列表依此新到舊排序,null 在最後
topics[].storyCountinteger | null專題頁所列新聞數
topics[].tagsstring[]從議題名稱比對到的站內標籤(只看名稱,不需近期有報導;比對不到為空陣列)
topics[].coverageobject | null站內相關報導;比對不到站內標籤時為 null
topics[].coverage.tagsstring[]議題對應到的站內標籤
topics[].coverage.basisstringtitle=從議題名稱比對到的標籤;page=議題名稱比對不到時,該媒體專題頁所列自家文章共有的標籤
topics[].coverage.countinteger過去 3 天同時帶有這些標籤的文章數
topics[].coverage.cappedbooleancount 達上限 500
topics[].coverage.mediaCountinteger
topics[].coverage.latestobject[]
topics[].coverage.latest[].idinteger
topics[].coverage.latest[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
topics[].coverage.latest[].mediaTitlestring
topics[].coverage.latest[].titlestring
topics[].coverage.latest[].urlstring
topics[].coverage.latest[].timestring (ISO 時間)
topics[].childrenobject[]子議題(不分 kind,不附 coverage)
topics[].children[].idstring議題 id
topics[].children[].timestring (ISO 時間)首次看到的時間
topics[].children[].backlogbooleantrue 表示開始追蹤該入口時就已上架(或在列表第二頁之後),time 只是開始追蹤的時間
topics[].children[].titlestring議題名稱
topics[].children[].urlstring媒體的專題頁網址
topics[].children[].imagestring | null
topics[].children[].kind"topic" | "feature"topic 議題(持續增加新聞)、feature 專題(一次性的新聞包)
topics[].children[].status"active" | "ended"active;ended=已停更(議題最新一則新聞超過 90 天)
topics[].children[].sponsoredboolean媒體標示為廣告/品牌合作
topics[].children[].parentIdinteger | null上層議題 id(子議題);與 id 不同,為數字
topics[].children[].storyFirstAtstring (ISO 時間) | null專題頁所列新聞中最早一則的日期
topics[].children[].storyLastAtstring (ISO 時間) | null專題頁所列新聞中最新一則的日期
topics[].children[].updatedAtstring (ISO 時間) | null最後更新:有 storyLastAt 用 storyLastAt,否則非 backlog 用 time(首次看到);backlog 又沒有報導日期者為 null(更新時間不明)。所有列表依此新到舊排序,null 在最後
topics[].children[].storyCountinteger | null專題頁所列新聞數
topics[].children[].tagsstring[]從議題名稱比對到的站內標籤(只看名稱,不需近期有報導;比對不到為空陣列)

錯誤:400 kind 不是 topic 或 feature;404 該媒體沒有追蹤議題

媒體與爬蟲狀態

GET/api/v1/media/{media}/keywords

媒體報導關鍵字

統計期間內最新最多 2000 篇的標籤與標題關鍵詞,排除新聞分類與通用詞;每篇每詞計一次。標題詞彙沿用近 7 天跨媒體標籤字典。與文章列表分頁無關。

參數型別說明
media(路徑)string媒體代碼
hoursinteger回溯刊登小時,1–168,預設 168
curl -s 'https://tag.observe.tw/api/v1/media/rti/keywords'
在瀏覽器開啟這個範例 ↗
回應欄位9 個
mediastring
hoursinteger
fromstring (ISO 時間)
tostring (ISO 時間)
sampledArticlesinteger實際取樣文章數
cappedboolean期間文章超過 2000 篇,僅取最新文章
termsobject[]
terms[].labelstring
terms[].countinteger包含此詞的文章數

錯誤:400 參數無效;404 媒體不存在

GET/api/v1/media/{media}/content

媒體內文庫列表

以文章 id 遞減分頁;僅回傳內文狀態與長度,單篇內文另由 content API 取得。google_news 與 dongtaiwang 列出經該來源發現的文章;sourceKind 為 discovery、publisher 為 null,每篇文章仍歸屬原刊登媒體。discoverySources 記錄發現來源及網址。

參數型別說明
media(路徑)string媒體代碼
limitinteger每頁筆數,1–100,預設 40
cursorstring上一頁 nextCursor
qstring標題、摘要或完整標籤關鍵字(最多 60 字元)
hoursinteger僅列出近幾小時刊登的文章;省略則不限時間,1–168
curl -s 'https://tag.observe.tw/api/v1/media/cna/content'
在瀏覽器開啟這個範例 ↗
回應欄位37 個
mediastring
titlestring
sourceKind"discovery" | "publisher"discovery 為文章發現來源;publisher 為刊登媒體
publisherobject | null
publisher.mediastring
publisher.namestring
publisher.countrystring
publisher.countryCodestring
limitinteger
countinteger
nextCursorstring | null
articlesobject[]
articles[].idinteger
articles[].mediastring
articles[].mediaTitlestring
articles[].titlestring
articles[].urlstring
articles[].imagestring | null
articles[].publishedAtstring (ISO 時間)排序用時間;若另有 publishedDate,刊期只有日精度,不代表確知時分
articles[].publishedDatestring經官方證據核實的日期;原站未公開發刊時分
articles[].publishedDatePrecision"day"
articles[].tagsstring[]
articles[].descriptionstring | null
articles[].authorsstring[]
articles[].publisherobject
articles[].publisher.mediastring
articles[].publisher.namestring
articles[].publisher.countrystring
articles[].publisher.countryCodestring
articles[].discoverySourcesobject[]
articles[].discoverySources[].mediastring文章發現來源代碼,非刊登媒體
articles[].discoverySources[].titlestring發現來源名稱
articles[].discoverySources[].urlstring實際發現文章的公開頁面網址
articles[].discoverySources[].discoveredAtstring (ISO 時間)首次經此來源發現文章的時間,不取代刊登時間
articles[].bodyStatusstring
articles[].bodyCharsinteger
articles[].contentFetchedAtstring (ISO 時間) | null

錯誤:400 參數無效;404 媒體不存在

GET/api/v1/media

所有媒體代碼與名稱

curl -s 'https://tag.observe.tw/api/v1/media'
在瀏覽器開啟這個範例 ↗
回應欄位3 個
{鍵}.titlestring | null媒體名稱
{鍵}.iconstring | nullfavicon 網址;已存放在本站的為 https://tag.observe.tw/favicons/<媒體代碼>.png(64×64 PNG)
{鍵}.camp"blue" | "green" | "other"政治傾向分組:blue 藍營傾向、green 綠營傾向、other 其他(依 app/data/media-catalog.json)

GET/api/v1/media/{media}

單一媒體最近的文章與熱門標籤

參數型別說明
media(路徑)string媒體代碼
hoursinteger往前幾小時,1–168,預設 24
curl -s 'https://tag.observe.tw/api/v1/media/cna'
在瀏覽器開啟這個範例 ↗
回應欄位15 個
mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
titlestring
iconstring | null
hoursinteger
articleCountinteger期間內文章數(最多計 200)
topTagsobject[]最多 50 個
topTags[].tagstring
topTags[].countinteger
articlesobject[]最新 60 篇
articles[].idinteger
articles[].titlestring
articles[].urlstring
articles[].imagestring | null
articles[].publishedAtstring (ISO 時間)
articles[].tagsstring[]

錯誤:404 未知媒體

GET/api/v1/media-traffic-comparison

本站爬蟲跨月收錄量

依台北時間發布月份統計本站自行抓取(source=own)的文章,排除發布日期待定與未來文章,不限正文狀態。包含新聞來源清單與媒體目錄的所有來源,供介面對照原始 Similarweb 月份資料;本端點不提供流量數字。月份升冪排列,從參考表最舊月份延續至當月;連續區間最多保留近 24 個月,另保留較早的原表月份。當月只統計截至 generatedAt 的資料。早於首次收錄月份的正數是補收舊文章,並非完整歷史月;零筆也不代表當時沒有發稿。發現來源透過關聯統計原媒體文章,不改變文章歸屬,跨來源加總時應排除 discovery 避免重複計算。

curl -s 'https://tag.observe.tw/api/v1/media-traffic-comparison'
在瀏覽器開啟這個範例 ↗
回應欄位10 個
generatedAtstring (ISO 時間)統計產生時間;所有月份均為此時間點的已收錄資料
collectionStartedAtstring (ISO 時間) | null本站自行抓取文章的最早收錄時間;不含 legacy 匯入,沒有紀錄時為 null
monthsstring[]可用比較月份,升冪排列
mediaobject[]
media[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
media[].sourceKind"publisher" | "discovery"publisher 為原刊登媒體;discovery 為文章發現來源
media[].firstAcquiredAtstring (ISO 時間) | null刊登媒體為首次自行抓取時間,發現來源為首次發現時間;不受月份範圍限制,從未收錄為 null
media[].monthlyobject[]每個可用月份皆有一筆;無文章時回傳 0,不以 null 取代已知筆數
media[].monthly[].monthstring對應 months 的台北發布月份
media[].monthly[].articlesinteger目前資料庫中該來源、該發布月的文章數;0 表示零筆已收錄文章,不保證歷史收錄完整

GET/api/v1/media-stats

各媒體收錄量與爬蟲狀態

列出已登錄媒體,包含未啟用抓取與僅作為引用來源者,排除重複代碼。發現來源的個別列依文章關聯計量;全站文章總數僅計原刊登媒體,避免重複計算。today 為台北時間今天 0 點起。status:ok 正常、stale 太久沒有新文章、failing 近 3 小時爬取全部失敗、disabled 未啟用定期抓取(含停用)。

curl -s 'https://tag.observe.tw/api/v1/media-stats'
在瀏覽器開啟這個範例 ↗
回應欄位54 個
generatedAtstring (ISO 時間)
todayStartstring (ISO 時間)
totalsobject
totals.todayinteger
totals.last24hinteger
totals.publishingMedia24hinteger
totals.pendingDateinteger
totals.activeSourcesinteger
totals.disabledSourcesinteger
totals.taggedShare24hnumber24 小時內有標籤的文章比例(0–1)
totals.statusCounts{鍵: integer}
mediaobject[]
media[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
media[].titlestring
media[].iconstring | null
media[].sourceKind"discovery" | "publisher"discovery 為文章發現來源,篇數透過關聯計算;publisher 為刊登媒體,全站文章總數不重複計入發現來源
media[].categorystring | null
media[].categoryLabelstring | null
media[].camp"blue" | "green" | "other"政治傾向分組:blue 藍營傾向、green 綠營傾向、other 其他(依 app/data/media-catalog.json)
media[].schedulestring爬取頻率;未啟用時為 off
media[].countrystring媒體營運/在地發行版本的國家或地區,不是報導發生地
media[].countryCodestring國家或地區代碼;INT 跨國、ZZ 待確認
media[].crawlerobject
media[].crawler.methodsstring[]
media[].crawler.transportstring | nullHTTP、curl 或瀏覽器工具
media[].crawler.bodystring正文或標題摘要收錄方式
media[].crawler.lastVerifiedMethodstring | null最近匹配目前入口的成功驗證方式
media[].crawler.linksobject[]
media[].crawler.links[].labelstring
media[].crawler.links[].urlstringGitHub 設定或解析程式連結
media[].todayinteger
media[].last24hinteger
media[].last7dinteger
media[].collectingSincestring (ISO 時間) | null
media[].pendingDateinteger尚未確定發布時間的文章數
media[].taggedShare24hnumber | null
media[].lastArticlestring (ISO 時間) | null
media[].lastCrawlOkstring (ISO 時間) | null
media[].status"ok" | "stale" | "failing" | "disabled"
media[].topicsobject | null議題/專題爬蟲;沒有追蹤議題的媒體為 null
media[].topics.mediastring議題爬蟲使用的媒體代碼(報導者為 twreporter)
media[].topics.sourcesobject[]最近一次完成檢查的各入口結果
media[].topics.sources[].urlstring媒體官方的議題/專題列表入口
media[].topics.sources[].kind"topic" | "feature" | "auto"入口宣告的類型:topic 議題、feature 專題、auto 依新聞日期判定
media[].topics.sources[].itemsinteger本次取得的項目數
media[].topics.sources[].pagesinteger有分頁時實際讀到第幾頁
media[].topics.sources[].errorstring入口失敗或部分項目失敗的原因
media[].topics.checkedAtstring (ISO 時間) | null最近一次完成檢查時間
media[].topics.lastSuccessAtstring (ISO 時間) | null最近一次所有入口成功的時間
media[].topics.statusstringok、partial、failed、running 或 pending
media[].topics.countsobject該媒體累計追蹤到的議題與專題數
media[].topics.counts.topicinteger累計議題數
media[].topics.counts.featureinteger累計專題數
media[].topics.rulesUrlstringGitHub 上該媒體議題爬蟲規則的位置