新文易數 API

公開取用台灣新聞媒體的標籤排行、事件分群、各家標題對照與議題追蹤資料;封存取回作業另需授權。

使用規則

  • 基底網址 https://tag.observe.tw。查詢使用 GET(也接受 HEAD);標記為 POST 的端點用於提交作業。預設回傳 UTF-8 JSON,檔案下載依端點提供檔案。
  • API 狀態頁:/api/status。瀏覽器以 HTML 顯示;以 Accept: application/json 取得 JSON。只顯示 API 回應狀態與端點用途。
  • 公開查詢不需要 API 金鑰;標記授權的封存作業需 Bearer token。每個 IP 每分鐘最多 60 次 API 請求,超過回 429;回應帶 x-ratelimit-limit、x-ratelimit-remaining、x-ratelimit-reset 標頭。需要更多額度時,登入後在 /my/settings/ 建立個人 API 金鑰(每人最多 3 把),請求帶 x-api-key: tag_… 標頭即改用該金鑰自己的額度:每分鐘 1000 次;無效或已撤銷的金鑰視同沒帶。
  • 允許跨網域(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"])

端點一覽

共用標籤詞彙快照

GET/api/v1/vocabulary/snapshots/current

目前完整索引詞彙快照

由受控匯出命令產生,HTTP 請求不查詢全量文章或寫入。涵蓋全部現存文章索引的標籤,不限排名或時間窗;不是人工 canonical 詞典,也不保證記者指派。尚未設定或產生快照時不可用。

curl -s 'https://tag.observe.tw/api/v1/vocabulary/snapshots/current'
在瀏覽器開啟這個範例 ↗
回應欄位60 個
schemaVersioninteger
idstring不可變快照 UUID
previousIdstring | null直接前一版本
generatedAtstring (ISO 時間)
sourcestring
attributionstring
coveragestring全期間目前 article_tags 索引關聯,不包含已移出索引/封存資料
provenancestring
identitystring
totalinteger
pageSizeinteger
pagesstring[]
totalPagesinteger500詞頁數
largePagesstring[]
sha256string所有依 UTF-8 排序詞條 JSON 各加 LF 串接後 SHA-256
changeCountinteger
changePagesstring[]
noisePolicyVersionstringtag 噪音規則版本與 no-equal-tags 清單的 SHA-256;詞條判定固定於此快照
activeobject
active.totalinteger
active.pagesstring[]
active.totalPagesinteger500詞頁數
active.largePagesstring[]
active.fileBytesinteger活躍500詞分頁gzip實體位元組
active.sha256string活躍詞逐筆 JSON 加 LF 的 SHA-256
active.daysinteger
active.minArticleCountinteger總篇數下限,現行為0
active.minRecentArticleCountintegerdays指定窗口的實際文章數下限,現行為30天3篇
active.policystringrecent-article-count
active.minLengthinteger
active.excludeNoiseboolean
sourceConsistencystring唯讀水位線加重讀;舊文與刪除依 tag 範圍在七天內對帳,不是全表同一時刻的交易快照
sourceAsOfobject
sourceAsOf.pendingTagsinteger尚待重算的詞群;正常輪次應為0
sourceAsOf.newArticleWatermarkstring
sourceAsOf.observedAtstring (ISO 時間)
sourceAsOf.bootstrapStartedAtstring (ISO 時間)
sourceAsOf.lastFullReconcileAtstring (ISO 時間) | null
sourceAsOf.reconciliationLagDaysinteger
sourceAsOf.overlapArticleIdsinteger
sourceAsOf.recentCountsReconciliationLagDaysinteger
tiersobject
tiers.excludeNoiseboolean
tiers.minLengthinteger
tiers.measuredTermsinteger
tiers.missingRecentCountsinteger
tiers.articleCountAtLeast{鍵: integer}
tiers.recentArticleCountAtLeast{鍵: {鍵: integer}}
tiers.intersections{鍵: {鍵: {鍵: integer}}}
statisticsobject
statistics.noiseinteger
statistics.noEqualinteger
statistics.recent180integer
statistics.articleCountAtLeast{鍵: integer}
statistics.articleCountAndRecent{鍵: integer}
statistics.eligibleAtThreshold{鍵: integer}
statistics.fileBytesinteger完整/變更/活躍分頁 gzip 檔案合計位元組,不含 manifest
statistics.fullFileBytesinteger完整分頁gzip大小
statistics.activeFileBytesinteger活躍分頁gzip大小
statistics.changeFileBytesinteger變更分頁gzip大小

錯誤:404 尚無快照;503 匯出未設定或不可用

GET/api/v1/vocabulary/snapshots/{id}

讀取固定版本詞彙分頁

預設每頁500詞,可用limit=5000;5000頁核對largePages。接受Accept-Encoding:gzip。下載端須核對每頁與完整快照 checksum、筆數,再原子發布。不同快照的 cursor 不得混用。

參數型別說明
id(路徑)stringcurrent 回傳的快照 id
cursorstring上一頁 nextCursor;起始 0
limitinteger500或5000;預設500。跨頁必須固定limit;5000請核對largePages
compactstring1:省略重複的完整 manifest,只回 snapshot id/時間/總數/pageSize/sha256;預設回完整manifest
curl -s 'https://tag.observe.tw/api/v1/vocabulary/snapshots/12345678-1234-4234-8234-123456789abc'
在瀏覽器開啟這個範例 ↗
回應欄位21 個
snapshotobject
entriesobject[]
entries[].idstring原始 UTF-8 標籤字串的 SHA-256,大小寫及字形不合併
entries[].labelstring原標籤
entries[].articleCountinteger快照時目前索引包含此詞的文章數
entries[].recentArticleCountinteger截至 recentCountsAsOf,近180天的實際文章數
entries[].recentArticleCountsobject
entries[].recentArticleCounts.30integer
entries[].recentArticleCounts.90integer
entries[].recentArticleCounts.180integer
entries[].recentCountsAsOfstring (ISO 時間)本詞窗口計數截至時間;不以最後刊登日推估篇數,舊詞最多七天對帳延遲
entries[].firstPublishedAtstring (ISO 時間)這些現存文章最早刊登時間,不是詞彙建立時間
entries[].lastPublishedAtstring (ISO 時間)這些現存文章最晚刊登時間
entries[].originstring混合原文關鍵字、編輯、規則補標
entries[].journalistAssigned | null目前無逐詞記者指派證據
entries[].noisebooleantag 的 isTagNoise 判定;標記但不刪除詞條
entries[].noiseReasonsstring[]control-character(含 C0/DEL/C1 控制字元)、empty、category、english-function-word、section-label 或 bare-year
entries[].noEqualboolean修剪前後空白後命中 no-equal-tags;不宜連結事件,並不等同顯示噪音
cursorstring
nextCursorstring | null
sha256string本頁 entries 的 JSON 陣列加 LF checksum

錯誤:400 快照 id 或 cursor 無效;404 快照不存在;409 完整分頁已超出3份保留範圍,請重讀current;503 匯出不可用/校驗失敗

GET/api/v1/vocabulary/snapshots/{id}/active

固定版本的活躍比對子集

完整詞庫不刪詞。此子集只選非 noise、至少兩字,且近30天實際文章數至少3篇;不套下游記憶體上限。完整分頁保留3份,活躍子集保留7份。

參數型別說明
id(路徑)string完整快照 id
cursorstring起始0;使用 nextCursor 續讀
limitinteger500或5000;預設500;大頁核對active.largePages
compactstring1:使用精簡快照資訊
curl -s 'https://tag.observe.tw/api/v1/vocabulary/snapshots/12345678-1234-4234-8234-123456789abc/active'
在瀏覽器開啟這個範例 ↗
回應欄位22 個
snapshotobject
subsetobject
entriesobject[]
entries[].idstring原始 UTF-8 標籤字串的 SHA-256,大小寫及字形不合併
entries[].labelstring原標籤
entries[].articleCountinteger快照時目前索引包含此詞的文章數
entries[].recentArticleCountinteger截至 recentCountsAsOf,近180天的實際文章數
entries[].recentArticleCountsobject
entries[].recentArticleCounts.30integer
entries[].recentArticleCounts.90integer
entries[].recentArticleCounts.180integer
entries[].recentCountsAsOfstring (ISO 時間)本詞窗口計數截至時間;不以最後刊登日推估篇數,舊詞最多七天對帳延遲
entries[].firstPublishedAtstring (ISO 時間)這些現存文章最早刊登時間,不是詞彙建立時間
entries[].lastPublishedAtstring (ISO 時間)這些現存文章最晚刊登時間
entries[].originstring混合原文關鍵字、編輯、規則補標
entries[].journalistAssigned | null目前無逐詞記者指派證據
entries[].noisebooleantag 的 isTagNoise 判定;標記但不刪除詞條
entries[].noiseReasonsstring[]control-character(含 C0/DEL/C1 控制字元)、empty、category、english-function-word、section-label 或 bare-year
entries[].noEqualboolean修剪前後空白後命中 no-equal-tags;不宜連結事件,並不等同顯示噪音
cursorstring
nextCursorstring | null
sha256string

錯誤:400 id/cursor 無效;404 快照或活躍子集不存在;503 匯出不可用

GET/api/v1/vocabulary/changes

跨世代的詞彙增量變更

每十分鐘增量,依世代先後串接 changes;每頁最多500筆,世代交界可少於500筆。同詞可重複 upsert,為絕對統計值,按頁序冪等套用。snapshot 可為完整 manifest 或 kind=delta 的世代資訊,delta 沒有完整 pages。完整快照每天一次;保留最近三份完整快照及其間增量,過期鏈回409後重新下載 current。absent-from-index 不推論編輯刪除。

參數型別說明
afterstring已套用的完整快照或增量世代 id,必填
targetstring目標世代;第一頁省略讀取最新增量,後續頁固定回傳 snapshot.id
cursorstring上一頁 nextCursor
curl -s 'https://tag.observe.tw/api/v1/vocabulary/changes'
在瀏覽器開啟這個範例 ↗
回應欄位5 個
snapshotobject
entriesobject[]
cursorstring
nextCursorstring | null
sha256string

錯誤:400 參數無效;404 目標快照不存在;409 resnapshotRequired=true,需全量重同步;503 匯出不可用

API 本身

GET/api/status

API 回應狀態與各端點用途

瀏覽器以 HTML 顯示,程式以 JSON 讀取。API 表示本端點可回應,Nearline 表示封存服務可回應;不代表每個查詢或取回作業已成功。

curl -s 'https://tag.observe.tw/api/status'
在瀏覽器開啟這個範例 ↗
回應欄位11 個
status"ok" | "degraded"
scopestring
descriptionstring
servicesobject[]
services[].namestring
services[].status"ok" | "unavailable"
services[].descriptionstring
endpointsobject[]
endpoints[].pathstring
endpoints[].methodstring
endpoints[].descriptionstring

GET/api/v1/reader-presence

本站最近 90 秒的線上讀者估計

單一 gateway 記憶體內的短期連線估計,不是 GA4 人數,不持久保存或按 IP 分組;服務重啟會歸零。此公開 GET 只回傳總數,不回傳識別碼。

curl -s 'https://tag.observe.tw/api/v1/reader-presence'
在瀏覽器開啟這個範例 ↗
回應欄位2 個
activeReadersinteger最近 90 秒送過心跳且未離開的讀者數
windowSecondsinteger統計時間窗,固定 90 秒

GET/api/v1/site-observation

網站觀測:GA4 與 Search Console 每日彙整

worker 每小時自 GA4(台灣時間)與 Search Console(美國太平洋時間,含尚未定案的近日資料)讀取彙整數字,近幾天每次重抓覆蓋;live 為 GA Realtime 最近 30 分鐘,約每 2 分鐘更新,超過 15 分鐘未更新則為 null。只含 tag.observe.tw 的流量;不含搜尋字詞、站內搜尋內容或使用者識別資料。traffic/search 在尚無資料時為 null;traffic.daily 從開始追蹤日補零。content 為讀者造訪的內容頁(事件、標籤、議題、專題、文章、記者、媒體),pages 含首頁與索引頁。vitals 需 GA4 已登錄 metric_name/metric_rating 自訂維度,否則為 null。

參數型別說明
days7 | 28 | 90期間(含今天),預設 28
curl -s 'https://tag.observe.tw/api/v1/site-observation'
在瀏覽器開啟這個範例 ↗
回應欄位57 個
updatedAtstring (ISO 時間) | null
liveobject | null
live.fetchedAtstring (ISO 時間)
live.activeUsersinteger最近 30 分鐘活躍使用者
live.viewsinteger最近 30 分鐘瀏覽
live.perMinuteinteger[]每分鐘瀏覽,30 筆,最舊在前
daysinteger
startstring台北日期 YYYY-MM-DD
endstring今天(台北)
trackingSincestring | nullGA4 第一筆資料的日期
trafficobject | null
traffic.dailyobject[]
traffic.daily[].datestring
traffic.daily[].viewsinteger
traffic.daily[].sessionsinteger
traffic.daily[].usersinteger當日活躍使用者
traffic.viewsinteger
traffic.sessionsinteger
traffic.channelsobject[]
traffic.channels[].namestringGA4 預設管道群組
traffic.channels[].valueinteger工作階段
traffic.devicesobject[]
traffic.devices[].namestringdesktop/mobile/tablet
traffic.devices[].valueinteger工作階段
traffic.eventsobject[]
traffic.events[].namestringopen_original/select_content/rss_click/app_installed
traffic.events[].valueinteger
pagesobject[]瀏覽最多的 20 頁
pages[].pathstring本站路徑(未編碼)
pages[].kindstringevent/tag/topic/feature/article/journalist/media/page
pages[].titlestring
pages[].viewsinteger
contentobject[]瀏覽最多的 10 個內容頁
content[].pathstring本站路徑(未編碼)
content[].kindstringevent/tag/topic/feature/article/journalist/media/page
content[].titlestring
content[].viewsinteger
searchobject | null
search.dailyobject[]
search.daily[].datestring
search.daily[].clicksinteger
search.daily[].impressionsinteger
search.daily[].positionnumber平均排名
search.clicksinteger
search.impressionsinteger
search.positionnumber | null以曝光加權的平均排名
search.pagesobject[]搜尋點擊最多的 10 頁
search.pages[].pathstring
search.pages[].kindstring
search.pages[].titlestring
search.pages[].clicksinteger
search.pages[].impressionsinteger
vitalsobject[] | null各評級的樣本數
vitals[].namestringLCP/INP/CLS
vitals[].goodinteger
vitals[].needsImprovementinteger
vitals[].poorinteger

錯誤:400 days 不是 7、28 或 90

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 兩個政治傾向分類。只列至少有一家媒體的標籤;ranked 為 false 的標籤沒有固定排行名單,/api/v1/ranking 不會有快照。

curl -s 'https://tag.observe.tw/api/v1/categories'
在瀏覽器開啟這個範例 ↗
回應欄位5 個
[].keystring分類代碼
[].labelstring中文名稱
[].mediainteger分類內媒體數
[].membersstring[]分類內的媒體代碼
[].rankedboolean是否有標籤排行

GET/api/v1/ranking-pools

指定刊登時間窗的完整合格詞池快照

嚴格半開 UTC [since,until),最多7天且until不得在未來。沿用固定媒體基準、noise/媒體自名排除、跨媒體資格及分數公式;先依文章去重、資格篩選後才排名,沒有500詞截斷。唯讀一致性快照,依媒體時間索引分批;完整空池available=true,缺覆盖/來源失敗/安全上限回503 unavailable。相同條件重用10分鐘;每程序最多一個生成中、每分鐘2份新快照,超限429。私有持久gzip頁檔,24小時過期;512MiB初期容量上限回503,保留舊檔不自動刪除。

參數型別說明
categorystring固定排行分類,預設news,見 /api/v1/categories,預設 news
sincestring (ISO 時間)含起點,嚴格UTC ISO8601
untilstring (ISO 時間)不含終點,兩站共用相同cutoff
gate"all" | "early" | "broad"all/early 至少2家各2篇/broad 至少3家、2家各2篇、1家3篇,預設 early
order"score"目前score;burst/growth拒絕,不替換成24h結果,預設 score
curl -s 'https://tag.observe.tw/api/v1/ranking-pools?category=news&since=2026-10-13T16%3A00%3A00Z&until=2026-10-14T12%3A00%3A00Z&gate=early&order=score'
在瀏覽器開啟這個範例 ↗
回應欄位46 個
snapshotIdstring
schemaVersionstring
policyVersionstring
availableboolean
incompleteReasonstring | null
windowobject
window.sincestring (ISO 時間)
window.untilstring (ISO 時間)
window.basisstringpublished_at
window.timezonestringUTC
categorystring
orderstring目前僅支援 score
gatestring
computedAtstring (ISO 時間)
asOfstring (ISO 時間)唯讀一致性資料快照開始時間
expiresAtstring (ISO 時間)24 小時後過期,讀取回409
basisobject
basis.idstring固定媒體名單版本
basis.mediastring[]
basis.coverageFromstring (ISO 時間)所有基準來源開始收錄後的第一個完整小時
basis.validFromstring (ISO 時間)收錄開始後滿 24 小時;更早的移動平均及分數為 null
upstreamVocabularyIdstring | null此資料直接來自文章標籤,未依詞庫快照截斷
noiseFilterVersionstringnoise/media-tag/qualification 原始碼指紋
qualificationobject
qualification.gatestring
qualification.distinctArticlesboolean
qualification.minTwiceMediainteger
qualification.minMediainteger
qualification.minArticlesAtOneMediainteger
sourceCoverageobject
sourceCoverage.kindstring
sourceCoverage.collectionCoverageFromstring (ISO 時間)
sourceCoverage.sourceArticleCountinteger
sourceCoverage.firstPublishedAtstring (ISO 時間) | null
sourceCoverage.lastPublishedAtstring (ISO 時間) | null
sourceCoverage.candidateTotalinteger
sourceCoverage.elapsedMsinteger
pageChecksumsstring[]
eligibleTotalinteger
truncatedboolean成功快照一定false;觸發安全上限回503/unavailable,不發布截斷快照
defaultPageSizeinteger
totalPagesinteger
checksumobject
checksum.algorithmstringsha256
checksum.serializationstringcanonical-entry-jsonl-v1
checksum.valuestring完整詞池校驗碼,不是單頁校驗碼

GET/api/v1/ranking-pools/{snapshotId}

讀取不可變時間窗詞池的完整分頁

所有頁綁同一snapshot/window/basis。cursor為opaque,跨快照409、錯誤400、過期409、不存在404。limit1..5000,gzip。checksum為依rank逐筆canonical JSON加\n的UTF-8 SHA256;property順序tag,tagId,rank,score,articleCount,mediaCount,media,media keys按UTF-8字節排序,最後一筆仍有換行,空池校驗空字串。完整掃到nextCursor=null再驗總數與checksum。

參數型別說明
snapshotId(路徑)string快照SHA256 ID
cursorstring上一頁nextCursor
limitinteger每頁筆數,1–5000,預設 500
curl -s 'https://tag.observe.tw/api/v1/ranking-pools/0000000000000000000000000000000000000000000000000000000000000000'
在瀏覽器開啟這個範例 ↗
回應欄位57 個
snapshotIdstring
schemaVersionstring
policyVersionstring
availableboolean
incompleteReasonstring | null
windowobject
window.sincestring (ISO 時間)
window.untilstring (ISO 時間)
window.basisstringpublished_at
window.timezonestringUTC
categorystring
orderstring目前僅支援 score
gatestring
computedAtstring (ISO 時間)
asOfstring (ISO 時間)唯讀一致性資料快照開始時間
expiresAtstring (ISO 時間)24 小時後過期,讀取回409
basisobject
basis.idstring固定媒體名單版本
basis.mediastring[]
basis.coverageFromstring (ISO 時間)所有基準來源開始收錄後的第一個完整小時
basis.validFromstring (ISO 時間)收錄開始後滿 24 小時;更早的移動平均及分數為 null
upstreamVocabularyIdstring | null此資料直接來自文章標籤,未依詞庫快照截斷
noiseFilterVersionstringnoise/media-tag/qualification 原始碼指紋
qualificationobject
qualification.gatestring
qualification.distinctArticlesboolean
qualification.minTwiceMediainteger
qualification.minMediainteger
qualification.minArticlesAtOneMediainteger
sourceCoverageobject
sourceCoverage.kindstring
sourceCoverage.collectionCoverageFromstring (ISO 時間)
sourceCoverage.sourceArticleCountinteger
sourceCoverage.firstPublishedAtstring (ISO 時間) | null
sourceCoverage.lastPublishedAtstring (ISO 時間) | null
sourceCoverage.candidateTotalinteger
sourceCoverage.elapsedMsinteger
pageChecksumsstring[]
eligibleTotalinteger
truncatedboolean成功快照一定false;觸發安全上限回503/unavailable,不發布截斷快照
defaultPageSizeinteger
totalPagesinteger
checksumobject
checksum.algorithmstringsha256
checksum.serializationstringcanonical-entry-jsonl-v1
checksum.valuestring完整詞池校驗碼,不是單頁校驗碼
offsetinteger
limitinteger
entriesobject[]
entries[].tagstring原始完整 Unicode 標籤,不做別名猜測或子字串比對
entries[].tagIdstring原標籤 UTF-8 SHA256
entries[].rankinteger完整合格詞池內名次
entries[].scorenumber沿用各媒體 2×(1−0.5^篇數) 加總
entries[].articleCountinteger不同文章數;同篇重複標籤只計一次
entries[].mediaCountinteger不同媒體數
entries[].media{鍵: integer}
nextCursorstring | null

GET/api/v1/ranking

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

過去 24 小時各媒體文章標籤的排行,每 10 分鐘重算一次、以整點小時存快照。order=burst(預設)依爆發力、order=score 依正規化分數、order=growth 只列升溫量大於零的詞並依升溫量排序。gate=early/broad 篩跨媒體門檻,先篩選再取 limit;growth 預設 early,其他預設 all。只涵蓋目前保存的排行候選詞。signals=1 加入近期首次收錄與相似稿比對證據;at 可取過去某個時間點的快照,證據不使用快照以後的收錄或比對結果。

參數型別說明
categorystring排行分類,見 /api/v1/categories,預設 all
order"burst" | "score" | "growth"排序:burst 爆發力/score 分數/growth 升溫量,預設 burst
gate"all" | "early" | "broad"跨媒體門檻:all 不限/early 至少 2 家各 2 篇/broad 至少 3 家、2 家各 2 篇、1 家 3 篇;growth 預設 early,其他預設 all
limitinteger筆數,1–500,預設 50
atstring (ISO 時間)取這個時間(ISO 8601)以前最新的快照
trend"0" | "1"1 表示附上每小時篇數與 24 小時移動平均;截至快照計算時間前的最後完整小時
related"0" | "1"1 表示附上每個標籤最常一起出現的標籤
signals"0" | "1"1 表示附上近期首次收錄與相似稿比對證據
ranks"0" | "1"1 表示附上每個標籤最近 24 小時的爆發力名次(由每小時快照重算,只在 order=burst 時提供)
curl -s 'https://tag.observe.tw/api/v1/ranking?category=news&limit=20'
在瀏覽器開啟這個範例 ↗
回應欄位60 個
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" | "growth"
gate"all" | "early" | "broad"
matchedCountinteger目前保存的候選詞中符合排序與門檻條件的總數,尚未套用 limit
unknownGrowthCountinteger符合媒體門檻、但升溫量因歷史不足而未知的候選詞數
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[].signalsobject
entries[].signals.growthnumber | null升溫量=爆發力-正規化分數;缺少任一步歷史時為 null
entries[].signals.earlyboolean至少 2 家媒體各有 2 篇以上
entries[].signals.broadboolean至少 3 家媒體、2 家各有 2 篇以上、1 家有 3 篇以上
entries[].signals.earlyJumpboolean | null24 小時前未達早期線索門檻、現在達標;無法確認歷史時為 null
entries[].signals.broadJumpboolean | null24 小時前未達多家跟進門檻、現在達標;無法確認歷史時為 null
entries[].firstCollectionobject | nullsignals=1 時回傳:近期首次見到的標籤收錄紀錄;已有舊報導或無法確認時為 null
entries[].firstCollection.atstring (ISO 時間)帶此標籤的現存文章紀錄最早收錄時間;不限分類、包含歷史匯入,不代表網路首次出現或精確取得標籤的時間
entries[].firstCollection.firstPublishedAtstring (ISO 時間)現存已收錄報導的最早刊登時間
entries[].firstCollection.recentboolean收錄時間與最早刊登時間都在快照以前 24 小時內;補收舊報導不標成新題
entries[].draftsobjectsignals=1 時回傳:快照以前已完成的相似稿比對覆蓋
entries[].drafts.articlesinteger同一視窗與基準媒體中、帶此標籤且已收錄的文章數
entries[].drafts.analyzedinteger截至快照時間已完成相似度比對的篇數
entries[].drafts.similarArticlesinteger具有同標籤、同視窗、同基準媒體高度相似配對的去重篇數
entries[].drafts.groupsinteger高度相似配對連通群數;不推定獨立稿源、轉載或抄襲
entries[].drafts.thresholdnumber內文相似度門檻,目前為 0.85
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 小時累計篇數
entries[].rankTrailobject[]ranks=1 且 order=burst 時回傳:最近 24 個整點快照的爆發力名次,舊到新,最後一點即目前快照
entries[].rankTrail[].tstring (ISO 時間)快照所屬小時(UTC)
entries[].rankTrail[].positioninteger | null該小時依爆發力排序的名次;沒有快照、不在榜上或當時爆發力無法比較為 null

錯誤:400 at 格式錯誤,或 order/gate 不支援;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'
在瀏覽器開啟這個範例 ↗
回應欄位55 個
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[].sameBylineinteger同署名跨站、無明示來源的文章數
nodes[].attributedinteger彼此引用或有共同明示來源的文章數
nodes[].unattributedinteger未辨識稿源的文章數
nodes[].earliestinteger未辨識稿源配對中標示刊登較早的篇數;不含同署名或時間未確認
nodes[].laterinteger未辨識稿源配對中標示刊登較晚的篇數;不含同署名或時間未確認
nodes[].outgoinginteger引用其他媒體的篇數
nodes[].incominginteger被其他媒體引用的篇數
edgesobject[]
edges[].sourcestring
edges[].targetstring
edges[].kind"similarity" | "citation"
edges[].relation"attributed" | "same-byline" | "unattributed"視覺分類,同署名優先
edges[].directedboolean箭頭由 target 指向 source;未辨識稿源僅表示刊登先後
edges[].countinteger
edges[].scorenumber | null
edges[].sameBylineinteger
edges[].attributedinteger
edges[].unattributedinteger

錯誤: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只看與此媒體有關的證據
edgeRelation"attributed" | "same-byline" | "unattributed"相似連線視覺分類(同署名優先)
edgeDirected"true" | "false"該相似連線是否有箭頭
edgeKind"similarity" | "citation"只看一條連線:類型(需同時給 source、target)
sourcestring連線起點媒體
targetstring連線終點媒體
direction"all" | "outgoing" | "incoming"引用:outgoing 引用他媒、incoming 被引用;相似配對無方向,忽略此參數,預設 all
scopestring逗號分隔的媒體;兩端都要在內
focusstring逗號分隔的媒體;至少一端在內
relation"attributed" | "same-byline" | "unattributed"相似配對來源線索,指定時只回相似配對
qstring關鍵字(最多 100 字元)
minScorenumber直接比對相似度下限(0–1);指定時不列明示引用,0–1
maxScorenumber直接比對相似度上限(0–1);指定時不列明示引用,0–1
bylines"both" | "missing" | "none"署名:both 兩篇都有、missing 至少一篇沒有、none 都沒有;明示引用只看引用方
gap"same" | "hour" | "later"兩篇刊登時間差:same 1 分鐘內、hour 1 小時內、later 超過 1 小時;指定時不列明示引用
minGroupinteger同一則新聞至少幾篇;指定時不列明示引用,2–1000
sort"latest" | "score"排序:latest 最新在前、score 相似度高到低,預設 latest
pageinteger頁碼,從 0 開始,預設 0
curl -s 'https://tag.observe.tw/api/v1/similarity/evidence?hours=48&node=cna&mode=similarity'
在瀏覽器開啟這個範例 ↗
回應欄位163 個
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.relationobject
items[].directPair.relation.kind"attributed" | "same-byline" | "unattributed"分類優先序:明示来源、同署名、未辨識稿源
items[].directPair.relation.sharedAuthorsstring[]共同人名署名;不保證同一人
items[].directPair.relation.aCitesBboolean
items[].directPair.relation.bCitesAboolean
items[].directPair.relation.aCreditRole"來源" | "引用"A 對 B 的來源標示角色
items[].directPair.relation.bCreditRole"來源" | "引用"B 對 A 的來源標示角色
items[].directPair.relation.commonSourcesobject[]
items[].directPair.relation.commonSources[].mediastring
items[].directPair.relation.commonSources[].namestring
items[].directPair.relation.publication"same" | "a-earlier" | "b-earlier" | "unknown"標示刊登先後,與稿源無關;同一分鐘或時間未確認不計方向
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.datePendingboolean
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.datePendingboolean
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[].diffobjectorigin 且有 directPair:本篇相對 sourceId 的修改
items[].diff.titleobject[][] | null完整標題,標出修改
items[].diff.bodyobject | null
items[].diff.body.identicalboolean正文除了站方固定字樣外一字未改
items[].diff.body.hunksobject[][][]修改處,依閱讀順序;每處前後附少量相同文字,其餘相同段落省略
items[].diff.body.moreinteger未列出的修改處數
items[].diff.body.removedinteger只在較早文章的字數
items[].diff.body.addedinteger只在本篇的字數
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.{鍵}.datePendingboolean
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[].relationobject
groups.{鍵}.pairs[].relation.kind"attributed" | "same-byline" | "unattributed"分類優先序:明示来源、同署名、未辨識稿源
groups.{鍵}.pairs[].relation.sharedAuthorsstring[]共同人名署名;不保證同一人
groups.{鍵}.pairs[].relation.aCitesBboolean
groups.{鍵}.pairs[].relation.bCitesAboolean
groups.{鍵}.pairs[].relation.aCreditRole"來源" | "引用"A 對 B 的來源標示角色
groups.{鍵}.pairs[].relation.bCreditRole"來源" | "引用"B 對 A 的來源標示角色
groups.{鍵}.pairs[].relation.commonSourcesobject[]
groups.{鍵}.pairs[].relation.commonSources[].mediastring
groups.{鍵}.pairs[].relation.commonSources[].namestring
groups.{鍵}.pairs[].relation.publication"same" | "a-earlier" | "b-earlier" | "unknown"標示刊登先後,與稿源無關;同一分鐘或時間未確認不計方向
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.datePendingboolean
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.datePendingboolean
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'
在瀏覽器開啟這個範例 ↗
回應欄位21 個
fromstring
tostring
thresholdnumber
daysstring[]台北日期
totalsobject
totals.articlesinteger[]每日已比對篇數
totals.pairsinteger[]每日相似配對數(以較晚刊登者的日期計)
totals.identicalinteger[]其中內文相同
totals.citationsinteger[]每日明示引用則數
mediaobject[]各陣列與 days 一一對應
media[].mediastring
media[].namestring
media[].articlesinteger[]
media[].pairsinteger[]一端為此媒體的配對數
media[].sameBylineinteger[]同署名跨站、無明示來源的文章數
media[].attributedinteger[]已註明來源的文章數
media[].unattributedinteger[]未辨識稿源的文章數
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'
在瀏覽器開啟這個範例 ↗
回應欄位40 個
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.datePendingboolean
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[].relationobject
matches[].relation.kind"attributed" | "same-byline" | "unattributed"分類優先序:明示来源、同署名、未辨識稿源
matches[].relation.sharedAuthorsstring[]共同人名署名;不保證同一人
matches[].relation.aCitesBboolean
matches[].relation.bCitesAboolean
matches[].relation.aCreditRole"來源" | "引用"A 對 B 的來源標示角色
matches[].relation.bCreditRole"來源" | "引用"B 對 A 的來源標示角色
matches[].relation.commonSourcesobject[]
matches[].relation.commonSources[].mediastring
matches[].relation.commonSources[].namestring
matches[].relation.publication"same" | "a-earlier" | "b-earlier" | "unknown"標示刊登先後,與稿源無關;同一分鐘或時間未確認不計方向
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'
在瀏覽器開啟這個範例 ↗
回應欄位45 個
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.summarystring | null媒體提供的獨立摘要;無摘要時為 null,不從正文自動生成
article.summarySourcestring | null摘要依據:article:selector、jsonld:abstract、meta:summary、meta:description、meta:og:description、feed:description 或 feed:summary
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 時間)首次經此來源發現文章的時間,不取代刊登時間
article.collectionsobject[]單篇內文回傳原站清單中實際收錄此文章的議題與專題,不限日期;self 為 true 的專題即此文章本身
article.collections[].idstring
article.collections[].mediastring
article.collections[].titlestring
article.collections[].kind"topic" | "feature"
article.collections[].selfboolean此文章就是該專題頁本身
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 字)
creditstring原文署名包含這段文字,最多 120 字
sourcestring明示引用的來源代碼,例如 cna、reuters
sectionstring原站分類完整名稱(完全相符)
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(整個查詢的總數、各政治傾向與各媒體篇數)
settled"0" | "1"1 表示略過刊登時間還沒確認的文章(datePending 為 true 的那些),facets 也一併略過
curl -s 'https://tag.observe.tw/api/v1/articles?q=%E9%A2%B1%E9%A2%A8&hours=72&limit=20'
在瀏覽器開啟這個範例 ↗
回應欄位38 個
queryobject
query.qstring | null
query.creditstring | null
query.sourcestring | null
query.sectionstring | null
query.mediastring[] | null
query.categorystring | null
query.tagstring | null
query.camp"blue" | "green" | "other" | null政治傾向分組:blue 藍營傾向、green 綠營傾向、other 其他(依管理員維護的媒體標籤,兩者都有時算藍營)
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 其他(依管理員維護的媒體標籤,兩者都有時算藍營)
articles[].titlestring
articles[].descriptionstring | null媒體提供的 description
articles[].summarystring | null媒體摘要;未取得時為 null
articles[].summarySourcestring | null摘要取自原文摘要區、JSON-LD abstract、meta 或 feed;與 description 來源明確區分
articles[].urlstring
articles[].imagestring | null
articles[].publishedAtstring (ISO 時間)發布時間(UTC)
articles[].datePendingbooleantrue 表示來源沒有提供發布時間、內文尚未抓取,publishedAt 暫為首次看到的時間
articles[].sectionstring | null媒體自己的分類/欄目
articles[].tagsstring[]

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

GET/api/v1/liveboard

即時看板輪詢:新文章、相似報導組與發稿量

給 /liveboard/ 這類常駐畫面輪詢。不帶參數時回最近 3 小時內收錄的 40 篇本站爬取文章與最近的相似報導組;之後把回應的 cursor 原樣帶回,只取新收錄的文章(依收錄順序,不是發布時間,晚抓到的也不會漏)與新算出的相似報導組。相似報導組是 3 小時內算出的正文相似配對連起來的一群文章,最早發布者為 lead,其餘依是否直接相似、相似度排序。stats 為依發布時間的各陣營發稿量。

參數型別說明
afterinteger上次回應的 cursor.after(文章 id)
pairsAfterstring (ISO 時間)上次回應的 cursor.pairsAfter
readAfterstring (ISO 時間)上次回應的 cursor.readAfter
curl -s 'https://tag.observe.tw/api/v1/liveboard'
在瀏覽器開啟這個範例 ↗
回應欄位99 個
generatedAtstring (ISO 時間)
cursorobject下次輪詢原樣帶回
cursor.afterinteger | null
cursor.pairsAfterstring (ISO 時間) | null
cursor.readAfterstring (ISO 時間) | null
articlesobject[]新收錄文章,新的在前,最多 40 篇
articles[].idinteger
articles[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
articles[].mediaTitlestring
articles[].camp"blue" | "green" | "other"政治傾向分組:blue 藍營傾向、green 綠營傾向、other 其他(依管理員維護的媒體標籤,兩者都有時算藍營)
articles[].titlestring
articles[].urlstring
articles[].imagestring | null
articles[].publishedAtstring (ISO 時間)
articles[].datePendingboolean發布時間仍只是首次看到的時間
articles[].tagsstring[]前 8 個標籤
articles[].authorsstring[]原始作者署名(包含具名作者與機構)
articles[].attributionsobject[]原文明示的內容提供者或引用媒體及證據
articles[].attributions[].mediastring
articles[].attributions[].namestring
articles[].attributions[].countrystring
articles[].attributions[].countryCodestring
articles[].attributions[].evidencestring
articles[].attributions[].kind"explicit"
articles[].textstring | null內文開頭(新文章 600 字、相似報導組的 lead 與前 3 篇同組文章 1500 字),沒有內文時為摘要
storiesobject[]新算出的相似報導組,最多 12 組
stories[].keystringlead 文章 id
stories[].computedAtstring (ISO 時間)組內最新配對的計算時間
stories[].leadobject最早發布的文章,欄位同 articles
stories[].followersobject[]
stories[].followers[].articleobject欄位同 articles
stories[].followers[].scorenumberDice 相似度(0.5–1)
stories[].followers[].containmentnumber
stories[].followers[].kind"identical" | "high"
stories[].followers[].evidencestring共同段落摘錄
stories[].followers[].relationobject
stories[].followers[].relation.kind"attributed" | "same-byline" | "unattributed"分類優先序:明示来源、同署名、未辨識稿源
stories[].followers[].relation.sharedAuthorsstring[]共同人名署名;不保證同一人
stories[].followers[].relation.aCitesBboolean
stories[].followers[].relation.bCitesAboolean
stories[].followers[].relation.aCreditRole"來源" | "引用"A 對 B 的來源標示角色
stories[].followers[].relation.bCreditRole"來源" | "引用"B 對 A 的來源標示角色
stories[].followers[].relation.commonSourcesobject[]
stories[].followers[].relation.commonSources[].mediastring
stories[].followers[].relation.commonSources[].namestring
stories[].followers[].relation.publication"same" | "a-earlier" | "b-earlier" | "unknown"標示刊登先後,與稿源無關;同一分鐘或時間未確認不計方向
stories[].followers[].directbooleanfalse 表示只與組內其他文章相似,不能展示為與 lead 相似
stories[].followers[].gapMinutesinteger比 lead 晚幾分鐘發布
stories[].moreinteger未列出的同組文章數
activityobject爬蟲與排程工作動態;每 15 秒更新
activity.crawlsobject[]近 10 分鐘的爬取,新的在前,最多 40 筆
activity.crawls[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
activity.crawls[].mediaTitlestring
activity.crawls[].stagestringindex 來源巡查、article 抓取內文、topic 議題
activity.crawls[].atstring (ISO 時間)結束時間,執行中為開始時間
activity.crawls[].runningboolean
activity.crawls[].insertedinteger新增文章數
activity.crawls[].failedboolean
activity.runningobject[]執行中的排程工作
activity.running[].jobstring
activity.running[].sincestring (ISO 時間)
activity.upcomingobject[]接下來的 8 個排程工作
activity.upcoming[].jobstring
activity.upcoming[].labelstring
activity.upcoming[].atstring (ISO 時間)
topicsobject[]6 小時內新增報導或 24 小時內新出現的議題/專題,每家媒體最多 2 個,最多 12 個
topics[].idinteger
topics[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
topics[].mediaTitlestring
topics[].titlestring
topics[].urlstring
topics[].imagestring | null
topics[].kind"topic" | "feature"topic 議題、feature 專題
topics[].isNewboolean24 小時內新出現;否則為新增了報導
topics[].atstring (ISO 時間)新出現或新增報導的時間
topics[].storyCountinteger | null
topics[].storiesobject[]頁面上最新的 4 則報導
topics[].stories[].titlestring
topics[].stories[].urlstring | null
topics[].stories[].datestring (ISO 時間) | null
topics[].stories[].articleobject | null對應的已收錄文章,欄位同 articles,text 為內文前 160 字
readingobject[]6 小時內發布、最近取得內文的 20 篇中,晚於 readAfter 取得的;最新取得的在前,每分鐘更新
statsobject
stats.last60mobject[]近 60 分鐘每 5 分鐘
stats.last60m[].tstring (ISO 時間)
stats.last60m[].blueinteger
stats.last60m[].greeninteger
stats.last60m[].otherinteger
stats.hourly24object[]近 24 小時逐時
stats.hourly24[].tstring (ISO 時間)
stats.hourly24[].blueinteger
stats.hourly24[].greeninteger
stats.hourly24[].otherinteger
stats.total24hinteger
stats.activeMedia1hinteger近 1 小時有發稿的媒體數
visitorsobject | null本站 GA 即時資料;即時工作停擺時為 null
visitors.activeUsersinteger
visitors.viewsinteger
visitors.perMinuteinteger[]近 30 分鐘每分鐘瀏覽數,舊的在前

錯誤:400 after、pairsAfter 或 readAfter 格式錯誤

記者署名與跨媒體相似

GET/api/v1/bylines

所有新聞署名:個人、團隊、機構與待辨識

依公開署名自動分類。部門依刊登媒體區分;同名不保證同一人。原文角色不推定職業;共同署名各自計入,篇數不可相加。沿用個人署名移除名單。

參數型別說明
hoursinteger最近幾小時,1–720,預設 48
pageinteger頁碼,從 0 起,0–10000,預設 0
mediastring限制刊登媒體
kind"person" | "desk" | "organization" | "unknown"署名類型
qstring搜尋署名名稱
curl -s 'https://tag.observe.tw/api/v1/bylines?hours=48&kind=organization'
在瀏覽器開啟這個範例 ↗
回應欄位23 個
generatedAtstring (ISO 時間)
hoursinteger
pageinteger
pageSizeinteger
totalinteger
creditedinteger可辨識署名文章数
counts{鍵: integer}
outletsobject[]
outlets[].mediastring
outlets[].namestring
bylinesobject[]
bylines[].keystring署名識別;部門依刊登媒體區分
bylines[].namestring
bylines[].kind"person" | "desk" | "organization" | "unknown"
bylines[].mediastring | null部門或待辨識署名的刊登媒體
bylines[].organizationstring | null已辨識機構的來源代碼
bylines[].rolesstring[]
bylines[].articlesinteger
bylines[].lateststring (ISO 時間)
bylines[].outletsobject[]
bylines[].outlets[].mediastring
bylines[].outlets[].namestring
bylines[].outlets[].countinteger

錯誤:400 無效的篩選條件

GET/api/v1/bylines/{key}

單一署名的文章與原文角色

參數型別說明
key(路徑)string署名總覽回傳的 key,放進路徑時需 URL 編碼
hoursinteger最近幾小時,1–720,預設 48
pageinteger頁碼,從 0 起,0–10000,預設 0
mediastring限制刊登媒體
curl -s 'https://tag.observe.tw/api/v1/bylines/organization%3Acna?hours=48'
在瀏覽器開啟這個範例 ↗
回應欄位42 個
generatedAtstring (ISO 時間)
hoursinteger
pageinteger
pageSizeinteger
totalinteger
bylineobject
byline.keystring署名識別;部門依刊登媒體區分
byline.namestring
byline.kind"person" | "desk" | "organization" | "unknown"
byline.mediastring | null部門或待辨識署名的刊登媒體
byline.organizationstring | null已辨識機構的來源代碼
byline.rolesstring[]
byline.articlesinteger
byline.lateststring (ISO 時間)
byline.outletsobject[]
byline.outlets[].mediastring
byline.outlets[].namestring
byline.outlets[].countinteger
articlesobject[]
articles[].idinteger
articles[].mediastring
articles[].mediaTitlestring
articles[].titlestring
articles[].urlstring
articles[].imagestring | null
articles[].publishedAtstring (ISO 時間)
articles[].tagsstring[]
articles[].creditsstring[]
articles[].entitiesobject[]
articles[].entities[].keystring署名識別;部門依刊登媒體區分
articles[].entities[].namestring
articles[].entities[].kind"person" | "desk" | "organization" | "unknown"
articles[].entities[].mediastring | null部門或待辨識署名的刊登媒體
articles[].entities[].organizationstring | null已辨識機構的來源代碼
articles[].entities[].rolesstring[]
articles[].attributionsobject[]
articles[].attributions[].mediastring
articles[].attributions[].namestring
articles[].attributions[].countrystring
articles[].attributions[].countryCodestring
articles[].attributions[].evidencestring
articles[].attributions[].kind"explicit"

錯誤:400 無效的署名或篩選條件;404 本期沒有這個署名

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'
在瀏覽器開啟這個範例 ↗
回應欄位35 個
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[].firstSeeninteger已比對文章扣除明示引用、有較早相近版本及時間未確認的文章,依 ID 去重
journalists[].unmatchedinteger已比對但未見達門檻相近文章的篇數;不代表原創
journalists[].similarobject
journalists[].similar.pairsinteger至少一端是此記者文章的相似配對數
journalists[].similar.articlesinteger有相似配對的自家文章數(去重)
journalists[].similar.laterinteger自家文章比對方晚至少一分鐘刊登的篇數(期間內文章去重,各欄可重疊);不含同署名跨站或已註明來源
journalists[].similar.earlierinteger自家文章比對方早至少一分鐘刊登的篇數(期間內文章去重,各欄可重疊);不含同署名跨站或已註明來源
journalists[].similar.sameAuthorinteger有同署名相近文章的篇數(期間內文章去重,不保證同一人)
journalists[].similar.attributedinteger排除同署名後,有明示來源相似配對的篇數(期間內文章去重)
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'
在瀏覽器開啟這個範例 ↗
回應欄位113 個
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.attributedinteger排除同署名後,有明示來源相似配對的篇數(期間內文章去重)
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.datePendingboolean
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.datePendingboolean
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[].attributedboolean已有彼此引用或共同明示來源
pairs[].publicationUnknownboolean標示刊登時間尚未確認
pairs[].ownCitesOtherboolean自家文章明示引用對方媒體
pairs[].otherCitesOwnboolean對方文章明示引用自家媒體
pairs[].diffobject只附在自家文章最新的 200 組配對
pairs[].diff.earlier"own" | "other"較早的一篇;修改由它讀到較晚的一篇
pairs[].diff.titleobject[][] | null較晚一篇的完整標題,標出修改
pairs[].diff.bodyobject | null
pairs[].diff.body.identicalboolean正文除了站方固定字樣外一字未改
pairs[].diff.body.hunksobject[][][]修改處,依閱讀順序;每處前後附少量相同文字,其餘相同段落省略
pairs[].diff.body.moreinteger未列出的修改處數
pairs[].diff.body.removedinteger只在較早文章的字數
pairs[].diff.body.addedinteger只在本篇的字數
indexobject
index.comparedinteger已比對的自家文章數
index.firstSeeninteger已比對文章扣除明示引用、有較早相近版本及時間未確認的文章,依 ID 去重
index.unmatchedinteger已比對但未見達門檻相近文章的篇數;不代表原創
index.pendinginteger有可用正文、等待索引的自家文章數
index.windowDaysinteger每篇與前後幾天內的他家文章比對

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

單一標籤

GET/api/v1/tags/suggest

輸入時的關鍵字建議

詞庫是最近 14 天至少 2 篇文章帶到的標籤(每篇只算一次),排除泛用詞、欄目詞、數字日期與超過 16 字的長句;每 30 分鐘重算一次。包含查詢字串的標籤中,開頭相符優先,其次依文章數排序。

參數型別說明
qstring輸入的文字(最多 60 字)
limitinteger筆數,1–20,預設 8
curl -s 'https://tag.observe.tw/api/v1/tags/suggest?q=%E5%8F%B0%E7%A9%8D'
在瀏覽器開啟這個範例 ↗
回應欄位5 個
qstring
daysinteger詞庫涵蓋的天數
tagsobject[]
tags[].tagstring
tags[].articlesinteger期間內帶到這個標籤的文章數

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
untilstring (ISO 時間)不含的時間右界,向下取整到完整小時;省略時為目前完整小時
curl -s 'https://tag.observe.tw/api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/series?hours=168'
在瀏覽器開啟這個範例 ↗
回應欄位18 個
tagstring
categorystring
hoursinteger
basisobject
basis.idstring固定媒體名單版本
basis.mediastring[]
basis.coverageFromstring (ISO 時間)所有基準來源開始收錄後的第一個完整小時
basis.validFromstring (ISO 時間)收錄開始後滿 24 小時;更早的移動平均及分數為 null
fromstring (ISO 時間)包含的時間左界
tostring (ISO 時間)不含的時間右界;查更早時傳入 from 作為 until
hasMorebooleanfrom 之前還有固定媒體基準的可比較期間
pointsobject[]
points[].tstring (ISO 時間)完整小時起點(UTC)
points[].scorenumber | null24 小時正規化分數
points[].countinteger | null固定基準 24 小時累計篇數,非單小時篇數
points[].rankinteger | null該小時快照中依原始分數的名次;沒有快照或未入榜為 null
points[].hourlyCountinteger | null該小時收錄篇數;收錄開始前為 null
points[].average24hnumber | null24 小時移動平均(篇/小時);歷史不足為 null

錯誤:400 無效的 hours 或 until(含未來時間);404 未知分類

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

和這個標籤一起出現的關鍵字,逐小時

標了這個標籤的報導(每次最多讀取最新 20000 篇),統計同一小時至少 2 篇共同帶到的其他標籤。每篇只算一次,排除泛用詞、欄目詞、數字日期與媒體自家名稱。span=day 將每小時篇數按台北日期相加;沒有報導的時段不列出。until 是不含的右界;下一段傳入這次的 from,hasMore 表示 from 之前仍有收錄報導。

參數型別說明
tag(路徑)string標籤(URL 編碼)
hoursinteger每次往前幾小時,1–744,預設 336
untilstring (ISO 時間)不含的時間右界;省略時為目前小時的結束
span"hour" | "day"逐小時或按台北日期合併,預設 hour
curl -s 'https://tag.observe.tw/api/v1/tags/%E6%B2%88%E4%BC%AF%E6%B4%8B/flow?hours=336'
在瀏覽器開啟這個範例 ↗
回應欄位11 個
tagstring
hoursinteger
fromstring (ISO 時間)
tostring (ISO 時間)
sampledboolean報導超過上限、只讀了最新的 20000 篇
span"hour" | "day"
hasMorebooleanfrom 之前仍有這個標籤的收錄報導
pointsobject[]
points[].tstring (ISO 時間)小時起點(UTC)
points[].countinteger該小時標了這個標籤的報導篇數
points[].tagsstring[][][標籤, 同時帶到它的篇數],多的在前

錯誤:400 hours、until 或 span 格式錯誤

GET/api/v1/tag-avatars

所有有素描頭像的人物標籤

目前顯示素描頭像的人物標籤與頭像網址(同 /api/v1/tags/{tag}/person 的 avatar.url),首頁文字雲用來把雲裡的人物畫成頭像。沒有頭像、被管理員隱藏或只符合別名尚未確認的標籤不列出。

參數型別說明
accentstring換成另一個強調色(6 位十六進位色碼,可加 #,例如 1d4ed8):圖改成這個色相,深淺照舊、白色仍是白色;回應裡的圖片網址也會帶上這個參數。省略時是本站橘色
curl -s 'https://tag.observe.tw/api/v1/tag-avatars'
在瀏覽器開啟這個範例 ↗
回應欄位1 個
avatars{鍵: string}依標籤

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

標籤代表的人物與素描頭像

標籤名稱若正好是 Wikidata 上某位人物的名稱或別名,回傳該人物(Wikidata ID、說明、國籍、職業、政黨、職位)與素描頭像。頭像由 Wikimedia Commons 的照片自動挑選、去背、轉成素描,管理員可改用其他候選或隱藏;avatar 附原照片的授權與作者,引用時須一併標示。不是人物或尚未比對的標籤,person 為 null。同名人物取 Wikipedia 條目最多的一位。

參數型別說明
tag(路徑)string標籤(URL 編碼)
accentstring換成另一個強調色(6 位十六進位色碼,可加 #,例如 1d4ed8):圖改成這個色相,深淺照舊、白色仍是白色;回應裡的圖片網址也會帶上這個參數。省略時是本站橘色
curl -s 'https://tag.observe.tw/api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/person'
在瀏覽器開啟這個範例 ↗
回應欄位19 個
tagstring
personobject | null
person.wikidataIdstringWikidata 項目 ID,例如 Q3847080
person.labelstring | nullWikidata 上的名稱(台灣正體優先)
person.descriptionstring | nullWikidata 說明
person.factsobject | null
person.facts.citizenshipstring[]國籍
person.facts.occupationsstring[]職業
person.facts.partiesstring[]政黨
person.facts.positionsobject[]擔任過的職位,現任在前
person.facts.positions[].labelstring職位
person.facts.positions[].currentboolean沒有卸任日期
person.avatarobject | null沒有可用照片或管理員隱藏時為 null
person.avatar.urlstring素描頭像線條(透明 WebP,256×256;加 layer=fill 取人物剪影)
person.avatar.filestringCommons 原檔名
person.avatar.pageUrlstringCommons 檔案頁
person.avatar.licensestring | null授權,例如 CC BY-SA 4.0、Public domain
person.avatar.licenseUrlstring | null授權條款網址
person.avatar.artiststring | null作者/來源

錯誤:400 標籤超過 60 字

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

標籤人物的素描頭像圖檔

256×256 的 WebP 素描頭像,只有透明度,拿來當 CSS mask:layer=ink 是線條,本站填網站橘色;layer=fill 是人物剪影,本站填白色墊在線條下面,所以淺色、深色頁面上人物都是白紙橘線,沒有外框。網址請用 person 回應裡的 avatar.url(帶版本參數,換圖時會變)。沒有頭像時回 404。

參數型別說明
tag(路徑)string標籤(URL 編碼)
layer"ink" | "fill" | "color"ink(線條)、fill(人物剪影)或 color(已上色:白色人物、橘色線條)
accentstring換成另一個強調色(6 位十六進位色碼,可加 #,例如 1d4ed8):layer=color 的線條改用這個顏色(ink、fill 只有透明度,由使用端自己上色)。省略時是本站橘色
curl -s 'https://tag.observe.tw/api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/avatar'
在瀏覽器開啟這個範例 ↗

錯誤:404 沒有頭像

GET/api/v1/tag-visuals

所有有小圖的非人物標籤

目前公開的非人物標籤小圖,首頁文字雲用來把標籤畫成圖(人物頭像見 /api/v1/tag-avatars)。台灣縣市鄉鎮給它在台灣或所屬縣市裡的位置圖,其他地方給輪廓,國家給單色國旗,標誌給單色標誌,emoji 直接給字元。待確認、隱藏或沒有圖的標籤不列出。

參數型別說明
accentstring換成另一個強調色(6 位十六進位色碼,可加 #,例如 1d4ed8):圖改成這個色相,深淺照舊、白色仍是白色;回應裡的圖片網址也會帶上這個參數。省略時是本站橘色
curl -s 'https://tag.observe.tw/api/v1/tag-visuals'
在瀏覽器開啟這個範例 ↗
回應欄位5 個
visuals{鍵: object}依標籤
visuals.{鍵}.kind"place" | "flag" | "logo" | "emoji"種類
visuals.{鍵}.imagestring | null圖檔網址,帶版本參數;emoji 為 null
visuals.{鍵}.emojistring | nullkind 為 emoji 時的 emoji
visuals.{鍵}.aspectnumber標誌與國旗的寬÷高,讓文字雲給長條形的圖較寬的位置;其他種類沒有這個欄位

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

非人物標籤的小圖

人物以外的標籤配的圖(人物用 /api/v1/tags/{tag}/person 的素描頭像)。kind:place 是縣市、鄉鎮、國家的輪廓或城市的定位點(地圖資料:內政部國土測繪中心、Natural Earth),image 是輪廓,large 是它在台灣、所屬縣市或地球上的位置;flag 是國家的國旗(Wikidata P41,Commons),和標誌一樣轉成單色,國家的輪廓改列為第二張候選;logo 是 Wikidata 項目在 Wikimedia Commons 上的標誌,轉成網站橘色的單色(只保留原本的明暗),source 附原檔的授權與作者,管理員上傳的沒有 source;emoji 是完全就是這個東西的 emoji。地方與 AI 確認過的 Commons 標誌自動顯示;emoji 由 AI 挑選,管理員確認後才回傳。沒有圖、待確認或被隱藏時 visual 為 null。

參數型別說明
tag(路徑)string標籤(URL 編碼)
accentstring換成另一個強調色(6 位十六進位色碼,可加 #,例如 1d4ed8):圖改成這個色相,深淺照舊、白色仍是白色;回應裡的圖片網址也會帶上這個參數。省略時是本站橘色
curl -s 'https://tag.observe.tw/api/v1/tags/%E5%8F%B0%E5%8C%97/visual'
在瀏覽器開啟這個範例 ↗
回應欄位13 個
tagstring
visualobject | null
visual.kind"place" | "flag" | "logo" | "emoji"種類
visual.emojistring | nullkind 為 emoji 時的 emoji
visual.labelstring | null地方的正式名稱或 Wikidata 名稱,例如 台北市
visual.wikidataIdstring | nullWikidata 項目 ID
visual.imagestring | null小圖網址(SVG;標誌為 WebP),帶版本參數
visual.largestring | null地方:位置圖網址(SVG)
visual.sourceobject | null標誌的原檔與授權
visual.source.pageUrlstringCommons 檔案頁
visual.source.licensestring | null授權
visual.source.licenseUrlstring | null授權條款網址
visual.source.artiststring | null作者/來源

錯誤:400 標籤超過 60 字

GET/api/v1/tags/{tag}/visual-image

非人物標籤的小圖圖檔

地方輪廓是 SVG,國旗與標誌是 WebP(標誌背景透明)。網址請用 visual 回應裡的 image/large(帶版本參數,換圖時會變)。沒有圖時回 404。

參數型別說明
tag(路徑)string標籤(URL 編碼)
size"small" | "large"small(輪廓、國旗、標誌)或 large(地方的位置圖)
accentstring換成另一個強調色(6 位十六進位色碼,可加 #,例如 1d4ed8):圖改成這個色相,深淺照舊、白色仍是白色。省略時是本站橘色
curl -s 'https://tag.observe.tw/api/v1/tags/%E5%8F%B0%E5%8C%97/visual-image'
在瀏覽器開啟這個範例 ↗

錯誤:404 沒有圖

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

經審核的標籤語義關係與既有上位分類

is-a 是有方向、可多重的上位分類;related 和 alias 是對稱關係,別名不會合併或改寫標籤 ID。只公開已核准的投稿,以及既有公開群組分類(含祖先);不把共現統計當成語義關係。tagId 是原始 UTF-8 字串的 SHA-256,與完整詞庫一致;群組沿用 group:<既有ID>。投稿者與審核者的帳號、說明只在有權限的後台提供。舊分類沒有建立時間,createdAt 如實為 null。單頁最多200筆關係(合計既有分類、分類祖先與投稿關係),祖先深度最多8層;truncated 表示筆數、查詢界限或深度限制使結果未完整列出。

參數型別說明
tag(路徑)string標籤(URL 編碼)
curl -s 'https://tag.observe.tw/api/v1/tags/%E6%9F%AF%E6%96%87%E5%93%B2/relations'
在瀏覽器開啟這個範例 ↗
回應欄位16 個
tagstring
tagIdstring
truncatedboolean
relationsobject[]
relations[].idstring穩定關係 ID
relations[].type"is-a" | "related" | "alias"關係型別
relations[].targetobject
relations[].target.idstring
relations[].target.labelstring
relations[].target.hrefstring本站相對路徑
relations[].sourcestringmanual、rule 或 submission
relations[].sourceDetailstring既有分類保留原來源
relations[].createdAtstring (ISO 時間) | null
relations[].statusstring僅公開核准結果
relations[].inheritedboolean既有分類祖先
relations[].depthinteger直接分類為1,祖先逐層遞增

錯誤:400 標籤格式不正確

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

標籤所屬的群組與主題大類

一個標籤可以同時屬於多個群組,例如川普同時是「外國政治人物」與「國際」。群組沿用舊站的 28 個身分/類型群組與主題大類,管理員可以再新增、改名、刪除,並把群組放進另一個群組底下。來源 source:legacy 是舊站人工標記或 2016 年版別統計,admin 是管理員手動加入,person 依 Wikidata 的國籍、職業、現任職位與政黨判斷,wikidata 依 Wikidata 的項目類型,section 依各媒體把帶這個標籤的報導放在哪個版別(每家媒體一票),ai 是 AI 依近期標題提出、經管理員確認的建議;parent 表示標籤不直接在這個群組,而是在它的子群組裡。只回傳自動判斷或管理員確認的結果,待確認與已排除的不回傳。

參數型別說明
tag(路徑)string標籤(URL 編碼)
curl -s 'https://tag.observe.tw/api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/groups'
在瀏覽器開啟這個範例 ↗
回應欄位7 個
tagstring
groupsobject[]
groups[].idinteger群組 ID;1–28 沿用舊站群組編號,101–110 是主題大類,之後新增的接著編
groups[].labelstring名稱,例如 政治人物、現任立委、政治、體育
groups[].kind"group" | "topic"group 是身分/類型群組,topic 是主題大類
groups[].parentIdinteger | null上層群組 ID;最上層為 null
groups[].source"legacy" | "admin" | "person" | "wikidata" | "section" | "ai" | "parent"判斷來源

錯誤:400 標籤超過 60 字

GET/api/v1/tag-groups

標籤群組與主題大類一覽

所有群組與主題大類(不含已刪除的),依管理員排的順序;用 parentId 組成樹狀。tags 是群組連同子群組裡的標籤數,只算自動判斷或管理員確認的。

curl -s 'https://tag.observe.tw/api/v1/tag-groups'
在瀏覽器開啟這個範例 ↗
回應欄位6 個
groupsobject[]
groups[].idinteger群組 ID;1–28 沿用舊站群組編號,101–110 是主題大類,之後新增的接著編
groups[].labelstring名稱,例如 政治人物、現任立委、政治、體育
groups[].kind"group" | "topic"group 是身分/類型群組,topic 是主題大類
groups[].parentIdinteger | null上層群組 ID;最上層為 null
groups[].tagsinteger標籤數(含子群組)

GET/api/v1/tag-groups/{id}

群組裡的標籤

群組連同子群組裡的標籤,依標籤名稱排序,一次 1000 筆,用 offset 翻頁;同一個標籤在多個子群組時各列一筆。

參數型別說明
id(路徑)integer群組 ID
offsetinteger略過前幾筆
curl -s 'https://tag.observe.tw/api/v1/tag-groups/24'
在瀏覽器開啟這個範例 ↗
回應欄位17 個
idinteger
labelstring
kind"group" | "topic"
parentsobject[]上層群組,最近的在前
parents[].idinteger
parents[].labelstring
parents[].kind"group" | "topic"
childrenobject[]直屬子群組
children[].idinteger
children[].labelstring
children[].kind"group" | "topic"
offsetinteger
nextinteger | null下一頁的 offset;沒有下一頁為 null
tagsobject[]
tags[].tagstring
tags[].groupIdinteger標籤所在的群組(本群組或子群組)
tags[].sourcestring判斷來源,見 /api/v1/tags/{tag}/groups

錯誤:404 沒有這個群組

GET/api/v1/tag-groups/overview

各群組最近報導最多的標籤

每個群組與主題(含子群組)最近 days 天達到關鍵字排行第一道門檻(24 小時內至少兩家新聞媒體各標了兩篇以上)的標籤:前 5 名的報導篇數、上新聞的標籤數與篇數合計,各附再之前 days 天的篇數。結果在伺服器保留 10 分鐘。

參數型別說明
daysinteger期間天數:1、7 或 30
curl -s 'https://tag.observe.tw/api/v1/tag-groups/overview?days=7'
在瀏覽器開啟這個範例 ↗
回應欄位14 個
daysinteger期間天數
groupsobject[]
groups[].idinteger
groups[].labelstring
groups[].kind"group" | "topic"
groups[].parentIdinteger | null上層群組 ID;最上層為 null
groups[].tagsinteger群組(含子群組)裡的標籤數
groups[].activeinteger其中這段期間上過新聞排行門檻的標籤數
groups[].recentinteger這些標籤最近 days 天的報導篇數合計(同一篇標了兩個標籤算兩次)
groups[].previousinteger再之前 days 天的篇數合計
groups[].topobject[]篇數最多的 5 個標籤
groups[].top[].tagstring
groups[].top[].recentinteger最近 days 天篇數
groups[].top[].previousinteger再之前 days 天篇數

GET/api/v1/tag-groups/{id}/ranking

群組標籤的報導量比較

群組(含子群組)裡,最近 days 天達到關鍵字排行第一道門檻(24 小時內至少兩家新聞媒體各標了兩篇以上)的標籤,依這段期間標了它的報導篇數排序,最多 200 個,並附上再之前 days 天的篇數供比較。

參數型別說明
id(路徑)integer群組 ID
daysinteger期間天數:1、7 或 30
curl -s 'https://tag.observe.tw/api/v1/tag-groups/1/ranking?days=7'
在瀏覽器開啟這個範例 ↗
回應欄位22 個
idinteger
labelstring
kind"group" | "topic"
parentsobject[]上層群組,最近的在前
parents[].idinteger
parents[].labelstring
parents[].kind"group" | "topic"
childrenobject[]直屬子群組
children[].idinteger
children[].labelstring
children[].kind"group" | "topic"
subgroupsobject[]所有子群組(含更下層)
subgroups[].idinteger
subgroups[].labelstring
subgroups[].kind"group" | "topic"
daysinteger期間天數
tagsinteger群組(含子群組)裡的標籤總數
rankingobject[]
ranking[].tagstring
ranking[].recentinteger最近 days 天的報導篇數
ranking[].previousinteger再之前 days 天的報導篇數
ranking[].groupsinteger[]標籤所在的子群組 ID;直接在本群組時不列

錯誤:404 沒有這個群組

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

標籤目前狀態

關鍵字頁的摘要:這個標籤在新聞媒體排行榜上的名次、分數、爆發力、升溫量、媒體門檻、跳升與新上榜(不在榜上為 null)、近期首次收錄、相似稿比對覆蓋、最常一起出現的標籤、最近 72 小時事件串,以及長期統計的首次上榜與高峰。

參數型別說明
tag(路徑)string標籤(URL 編碼)
curl -s 'https://tag.observe.tw/api/v1/tags/%E8%B3%B4%E6%B8%85%E5%BE%B7/status'
在瀏覽器開啟這個範例 ↗
回應欄位48 個
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 小時前不在完整榜單上
ranking.signalsobject
ranking.signals.growthnumber | null升溫量=爆發力-正規化分數;缺少任一步歷史時為 null
ranking.signals.earlyboolean至少 2 家媒體各有 2 篇以上
ranking.signals.broadboolean至少 3 家媒體、2 家各有 2 篇以上、1 家有 3 篇以上
ranking.signals.earlyJumpboolean | null24 小時前未達早期線索門檻、現在達標;無法確認歷史時為 null
ranking.signals.broadJumpboolean | null24 小時前未達多家跟進門檻、現在達標;無法確認歷史時為 null
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該小時文章數
firstCollectionobject | null
firstCollection.atstring (ISO 時間)帶此標籤的現存文章紀錄最早收錄時間;不限分類、包含歷史匯入,不代表網路首次出現或精確取得標籤的時間
firstCollection.firstPublishedAtstring (ISO 時間)現存已收錄報導的最早刊登時間
firstCollection.recentboolean收錄時間與最早刊登時間都在快照以前 24 小時內;補收舊報導不標成新題
draftsobject | null
drafts.articlesinteger同一視窗與基準媒體中、帶此標籤且已收錄的文章數
drafts.analyzedinteger截至快照時間已完成相似度比對的篇數
drafts.similarArticlesinteger具有同標籤、同視窗、同基準媒體高度相似配對的去重篇數
drafts.groupsinteger高度相似配對連通群數;不推定獨立稿源、轉載或抄襲
drafts.thresholdnumber內文相似度門檻,目前為 0.85

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/suggest

輸入時的事件串建議

最近 14 天的新聞事件串中,關鍵字包含查詢字串的:主要關鍵字(majorTags)相符的排前面,其次依最後出現時間(新的在前)、最高爆發力排序。事件串沒有標題,tags 即其主要關鍵字。名單每 10 分鐘更新一次。

參數型別說明
qstring輸入的文字(最多 60 字)
limitinteger筆數,1–20,預設 8
curl -s 'https://tag.observe.tw/api/v1/events/threads/suggest?q=%E5%9C%8B%E6%85%B6'
在瀏覽器開啟這個範例 ↗
回應欄位6 個
qstring
daysinteger涵蓋的天數
threadsobject[]
threads[].idinteger
threads[].tagsstring[]主要關鍵字
threads[].lastTimestring (ISO 時間)最後出現的小時

GET/api/v1/events/threads

某一天的所有事件串

台北時間某一天內曾出現的事件串(最多 300 個),依當天的事件排序:同一件事的事件串合併(foldedInto/folded),依當天各小時爆發力加總(storyWeight)排名,合併進來的事件串緊接在主事件串之後。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'
在瀏覽器開啟這個範例 ↗
回應欄位56 個
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[].dayRankinteger | null這件事在當天的名次;合併進來的事件串與主事件串相同
threads[].dayWeightnumber這條事件串當天各上榜小時爆發力的加總
threads[].storyWeightnumber這件事(主事件串加上合併進來的)當天的爆發力加總,dayRank 依此排序
threads[].hoursOnDayinteger當天上榜的小時數
threads[].dayTrailinteger | null[] | null當天 00 時到 23 時各小時的名次;不在榜上的小時為 null
threads[].foldedIntointeger | null若是同一件事被另開的事件串,主事件串的 id
threads[].foldedinteger[]合併進這條主事件串的其他事件串 id
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/period

過去 1、3、7 或 31 天的主要事件串

依事件串在期間內每小時分數的總和排序,在榜越久、越前面的越重;同一則新聞被拆成不同事件串時(主要標籤過半重疊或第一個標籤相同)只留較重的一個。藍綠報導(coverage、baseline)的窗口是整段期間。

參數型別說明
daysinteger期間天數:1、3、7 或 31,預設 1
limitinteger回傳幾個事件串,1 到 12,預設 6
curl -s 'https://tag.observe.tw/api/v1/events/threads/period?days=7'
在瀏覽器開啟這個範例 ↗
回應欄位43 個
daysinteger
fromstring (ISO 時間)
tostring (ISO 時間)
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[].majorTagsstring[]
threads[].maxTagstring | null分數最高的標籤
threads[].weightnumber期間內每小時分數的總和
threads[].hoursinteger期間內在榜的小時數
threads[].bestRankinteger期間內的最佳名次
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 days 不是 1、3、7 或 31

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

單一事件串

事件串的整體資訊與逐小時紀錄(最近 336 小時,即 14 天,新到舊)。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

同一事件的各家標題對照

帶有事件主要標籤的文章(最近 14 天,每個台北日最多 400 篇),依媒體與藍/綠/其他分組。blindspot 列出「對方陣營有報、這一方完全沒報」的陣營。

參數型別說明
id(路徑)integer事件串 id(/api/v1/events 的 threadId)
curl -s 'https://tag.observe.tw/api/v1/events/threads/365/coverage'
在瀏覽器開啟這個範例 ↗
回應欄位25 個
threadIdinteger
majorTagsstring[]
fromstring (ISO 時間)
tostring (ISO 時間)
articlesinteger文章總數
outletsinteger媒體數
campsobject[]
camps[].camp"blue" | "green" | "other"政治傾向分組:blue 藍營傾向、green 綠營傾向、other 其他(依管理員維護的媒體標籤,兩者都有時算藍營)
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 其他(依管理員維護的媒體標籤,兩者都有時算藍營)
byOutlet[].articlesobject[]
byOutlet[].articles[].idinteger
byOutlet[].articles[].titlestring
byOutlet[].articles[].urlstring
byOutlet[].articles[].imagestring | null
byOutlet[].articles[].publishedAtstring (ISO 時間)
byOutlet[].articles[].hitsinteger這篇文章帶了幾個事件主要標籤
byOutlet[].articles[].descriptionstring | null媒體提供的摘要,最多 160 字;沒有或與標題重複時為 null

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

各媒體的議題/專題

GET/api/v1/topics/{id}/stories

議題/專題實際收錄的新聞索引

累計原站議題/專題頁實際列出的文章,不限報導日期。依報導日期由新到舊排列,未知日期在後。已收錄文章提供本站 id;未收錄的提供原文 url。舊資料尚未還原的連結為 null。此清單不使用名稱或文章標籤推測成員,也不修改原文標籤。分頁或動態載入的文章可能尚未完整取得。

參數型別說明
id(路徑)integer議題/專題 ID
curl -s 'https://tag.observe.tw/api/v1/topics/1/stories'
在瀏覽器開啟這個範例 ↗
回應欄位20 個
idstring
mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
mediaTitlestring
titlestring
kind"topic" | "feature" | "article"
urlstring
imagestring | null
articleIdinteger | null專題頁本身的文章 ID;透過文章 content API 取得內文與圖片
checkedAtstring (ISO 時間) | null
totalinteger
storiesobject[]
stories[].keystring
stories[].titlestring
stories[].urlstring | null
stories[].idinteger | null
stories[].datestring (ISO 時間) | null
stories[].descriptionstring | null
stories[].imagestring | null
stories[].tagsstring[]
stories[].authorsstring[]

錯誤: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:指定 kind 的未停更上層項目名稱中最常見的站內標籤(依媒體家數,前 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只取指定 kind 中名稱含這段文字的項目(不分大小寫,最多 50 字;跨媒體)
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[]指定 kind 最常見的標籤
tags[].tagstring
tags[].mediainteger有議題或專題帶這個標籤的媒體家數
tags[].topicinteger帶這個標籤的議題數
tags[].featureinteger帶這個標籤的專題數
回應欄位(給 tag 或 q(不給 media))32 個
kind"topic" | "feature"
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[]指定 kind 最常見的標籤
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 天跨媒體標籤字典。與文章列表分頁無關。每個詞另與同類別排行榜基準媒體(不含本站)同期的報導比例比較:至少 3 篇且比例達同類媒體 3 倍以上者標為 distinctive。同類比較每個期間快取 10 分鐘,尚未算好時 comparison 為 null。

參數型別說明
media(路徑)string媒體代碼
hoursinteger回溯刊登小時,1–168,預設 168
curl -s 'https://tag.observe.tw/api/v1/media/rti/keywords'
在瀏覽器開啟這個範例 ↗
回應欄位16 個
mediastring
hoursinteger
fromstring (ISO 時間)
tostring (ISO 時間)
sampledArticlesinteger實際取樣文章數
cappedboolean期間文章超過 2000 篇,僅取最新文章
comparisonobject | null同類媒體基準;尚未算好時為 null
comparison.groupstring比較的排行榜基準類別,例如 news、3c;本站類別沒有基準時用 news
comparison.articlesinteger同類媒體的文章數
comparison.mediainteger同類媒體家數
termsobject[]
terms[].labelstring
terms[].countinteger包含此詞的文章數
terms[].sharenumber包含此詞的文章占取樣文章的比例
terms[].peerSharenumber | null同類媒體同期包含此詞的文章比例
terms[].distinctiveboolean本站報導比例明顯高於同類媒體(至少 3 篇且達 3 倍)

錯誤: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'
在瀏覽器開啟這個範例 ↗
回應欄位45 個
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[].summarystring | null媒體提供的獨立摘要;無摘要時為 null,不從正文自動生成
articles[].summarySourcestring | null摘要依據:article:selector、jsonld:abstract、meta:summary、meta:description、meta:og:description、feed:description 或 feed:summary
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[].collectionsobject[]單篇內文回傳原站清單中實際收錄此文章的議題與專題,不限日期;self 為 true 的專題即此文章本身
articles[].collections[].idstring
articles[].collections[].mediastring
articles[].collections[].titlestring
articles[].collections[].kind"topic" | "feature"
articles[].collections[].selfboolean此文章就是該專題頁本身
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 其他(依管理員維護的媒體標籤,兩者都有時算藍營)

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'
在瀏覽器開啟這個範例 ↗
回應欄位85 個
generatedAtstring (ISO 時間)
todayStartstring (ISO 時間)
summaryWindowobject
summaryWindow.sincestring (ISO 時間)
summaryWindow.untilstring (ISO 時間)
summaryWindow.hoursinteger摘要統計窗口,168 小時
summaryWindow.basisstring以出版時間界定窗口,published_at
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 其他(依管理員維護的媒體標籤,兩者都有時算藍營)
media[].schedulestring爬取頻率;hourly 或 every N min;未啟用時為 off
media[].crawlScheduleobject
media[].crawlSchedule.intervalMinutesnumber | null實際逐媒體最小巡查間隔(分鐘)
media[].crawlSchedule.reasonstring調整依據
media[].crawlSchedule.reviewedAtstring (ISO 時間)排程評估時間
media[].crawlSchedule.nextEligibleAtstring (ISO 時間) | null最早可巡查時間;不是佇列保證開始時間
media[].crawlSchedule.lastStartedAtstring (ISO 時間) | null
media[].crawlSchedule.runningboolean
media[].crawlHealthobject
media[].crawlHealth.runs24hinteger近24小時已完成巡查與內文抓取次數
media[].crawlHealth.failures24hinteger含部分失敗的有錯誤執行次數
media[].crawlHealth.lastFailureAtstring (ISO 時間) | null
media[].countrystring媒體營運/在地發行版本的國家或地區,不是報導發生地
media[].countryCodestring國家或地區代碼;INT 跨國、ZZ 待確認
media[].scopeobject | null
media[].scope.scope"tw" | "tw-foreign" | "intl-zh" | "cn" | "hkmo" | "sgmy" | "overseas-zh" | "zh-special" | "foreign"本站實際收錄版本主要服務的讀者範圍
media[].scope.scopeLabelstring
media[].scope.language"zh-Hant" | "zh-Hans" | "en" | "ja"收錄版本的文字
media[].scope.languageLabelstring
media[].scope.rolesobject[]
media[].scope.roles[].role"wire" | "platform" | "discovery" | "corporate"
media[].scope.roles[].labelstring
media[].scope.coveragestring | null實際收錄範圍與歷史差異,例如只收某個頻道或版本
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[].summaryobject | null文章發現入口為 null,摘要需查看原刊登媒體
media[].summary.totalinteger窗口內已出版且日期已確認的本站文章數;不含議題/專題包裝頁
media[].summary.withSummaryinteger目前存有非空 summary 的文章數;不表示全部欄位已人工驗證
media[].summary.sourcesstring[]
media[].summary.exampleIdinteger | null有摘要的站內文章範例,優先選原文導言;不是最新文章保證
media[].todayinteger
media[].last24hinteger
media[].last7dinteger
media[].collectingSincestring (ISO 時間) | null
media[].totalCollectedinteger本站爬蟲歷來儲存的紀錄筆數(source=own,含專題頁、待確認日期紀錄,不含歷史匯入);探索平台計已連結文章的發現紀錄
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 上該媒體議題爬蟲規則的位置

GET/api/v1/media-radar

Cloudflare Radar 全球網域排名與級距

讀取 worker 透過官方 Radar API 取得的最新 POPULAR 網域排名。前 100 名有精確名次,其他可能只提供排名級距;不能換算為造訪量或 page views。未設定 Token 時為 unconfigured,失敗保留最後成功資料。GET 不呼叫上游。

curl -s 'https://tag.observe.tw/api/v1/media-radar'
在瀏覽器開啟這個範例 ↗
回應欄位21 個
versioninteger資料格式版本
source"cloudflare-radar"抓取來源
scope"global"排名範圍
checkedAtstring (ISO 時間) | null最近一次批次檢查時間
status"unconfigured" | "pending" | "ok" | "partial" | "blocked" | "failed"批次狀態
errorstring | null最近一次錯誤摘要,不含 Token 或上游回應內容
domainsobject[]
domains[].domainstring網域
domains[].fetchedAtstring (ISO 時間)該網域最近成功抓取時間
domains[].dateStartstring (ISO 時間)API 回傳資料期間開始
domains[].dateEndstring (ISO 時間)API 回傳資料期間結束
domains[].rankinteger | null精確名次(只接受前 100 名),無名次時為 null
domains[].bucketinteger | null排名級距上界,例如 2000 表示前 2000 名,非第 2000 名
domains[].bucketLowerBoundinteger | null排名級距下界,例如 200000 表示未入前 200000 名;有此值時 bucket 為 null,舊快照可能省略此欄
domains[].historyobject[]本站保存的歷次排名,舊到新;資料庫不可用時為空陣列
domains[].history[].fetchedAtstring (ISO 時間)該期最近一次抓到的時間
domains[].history[].dateStartstring (ISO 時間)
domains[].history[].dateEndstring (ISO 時間)資料期間結束;每期一筆
domains[].history[].rankinteger | null
domains[].history[].bucketinteger | null
domains[].history[].bucketLowerBoundinteger | null

GET/api/v1/media-traffic-live

Similarweb 自動抓取流量狀態

讀取 worker 最近一次從 Similarweb 外掛公開端點抓取的 EstimatedMonthlyVisits。被拒絕或失敗時保留最後成功的網域快照,status 可為 blocked、failed 或 partial;本端點不把缺值補成 0。

curl -s 'https://tag.observe.tw/api/v1/media-traffic-live'
在瀏覽器開啟這個範例 ↗
回應欄位29 個
versioninteger資料格式版本
source"similarweb-extension"抓取來源
checkedAtstring (ISO 時間) | null最近一次批次檢查時間
status"pending" | "ok" | "partial" | "blocked" | "failed"批次狀態
errorstring | null最近一次錯誤摘要
domainsobject[]
domains[].domainstring網域
domains[].fetchedAtstring (ISO 時間)該網域最近成功抓取時間
domains[].monthlyobject[]本站保存的所有月份,舊到新;Similarweb 每次只回最近三個月,較早月份來自本站紀錄
domains[].monthly[].monthstring月份 YYYYMM
domains[].monthly[].visitsnumberSimilarweb EstimatedMonthlyVisits 估算造訪量
domains[].monthly[].source"genehong"只在數值來自 GeneHong 試算表時出現(Similarweb 以百萬計、四捨五入),本站開始抓取前的月份
domains[].profiles{鍵: object}依月份(YYYYMM)保存的國家來源、導流來源、互動與排名;每次只取得最近一期,較早月份隨排程累積,最多 12 個月;舊資料列可能沒有此欄
domains[].profiles.{鍵}.monthstring月份 YYYYMM
domains[].profiles.{鍵}.countriesobject[]前五大來源國家,由大到小
domains[].profiles.{鍵}.countries[].codestring國家代碼 ISO 3166-1 alpha-2
domains[].profiles.{鍵}.countries[].sharenumber占造訪量比例 0–1
domains[].profiles.{鍵}.channels{鍵: number}導流來源占比 0–1:Direct、SearchOrganic、SearchPaid、SocialOrganic、SocialPaid、Referrals、Mail、DisplayAds、GenAi、Affiliate
domains[].profiles.{鍵}.bounceRatenumber | null跳出率 0–1
domains[].profiles.{鍵}.pagesPerVisitnumber | null每次造訪瀏覽頁數
domains[].profiles.{鍵}.timeOnSitenumber | null平均造訪時間(秒)
domains[].profiles.{鍵}.globalRankinteger | null全球排名
domains[].profiles.{鍵}.countryRankobject | null主要國家排名
domains[].profiles.{鍵}.countryRank.codestring
domains[].profiles.{鍵}.countryRank.rankinteger
domains[].profiles.{鍵}.categoryRankobject | null類別排名
domains[].profiles.{鍵}.categoryRank.categorystring
domains[].profiles.{鍵}.categoryRank.rankinteger
failedAt{鍵: string (ISO 時間)}網域最近一次抓取成功但 Similarweb 沒有資料或資料無效的時間;成功後移除,一天後重試

GET/api/v1/media-taiwan-shares

台灣占比的人工修正

管理員在 /media/traffic/ 修正的台灣造訪占比,依媒體代碼列出。Similarweb 的台灣占比是整個網域的估算,全球共用網域(如 msn.com)或小網站會失準;有修正時本站一律以修正值取代 Similarweb 的數字(所有月份),台灣造訪估算 = 月造訪量 × 占比。沒有修正的媒體不列出。

curl -s 'https://tag.observe.tw/api/v1/media-taiwan-shares'
在瀏覽器開啟這個範例 ↗
回應欄位4 個
shares{鍵: object}依媒體代碼
shares.{鍵}.sharenumber台灣占造訪量比例,0–1(到 0.0001)
shares.{鍵}.notestring修正理由
shares.{鍵}.updatedAtstring (ISO 時間)最近一次修改時間

GET/api/v1/media-output

各媒體在流量網域上的發稿量

「每篇分攤造訪」的分母。worker 每 6 小時讀各媒體流量網域的 Google News sitemap,依 news:publication_date 記下台北時間前一天的發稿篇數(同一天讀到多次取較大值,保留 21 天),並統計本站近 7 天收錄的文章有多少位在該網域或其子網域。兩者都只會少算:sitemap 最多 1,000 筆、兩天,本站收錄可能不全。GET 不呼叫上游。

curl -s 'https://tag.observe.tw/api/v1/media-output'
在瀏覽器開啟這個範例 ↗
回應欄位13 個
versioninteger資料格式版本
checkedAtstring (ISO 時間) | null最近一次批次檢查時間
status"pending" | "ok" | "partial" | "failed"批次狀態
errorstring | null最近一次錯誤摘要
mediaobject[]
media[].mediastring媒體代碼
media[].hoststring流量量測的網域(Similarweb 以此網域及其子網域計)
media[].sitemapsstring[]上次成功讀到的 news sitemap;空陣列表示沒有可用的 news sitemap
media[].days{鍵: integer}台北日期 YYYY-MM-DD → 發稿篇數,只含已結束的日子
media[].cappedbooleansitemap 達 1,000 筆上限,篇數可能偏少
media[].articles7dinteger本站近 7 天收錄篇數
media[].onHost7dinteger其中網址位在 host 或其子網域的篇數
media[].checkedAtstring (ISO 時間)該媒體最近一次檢查時間

封存索引與授權取回

GET/api/v1/nearline/archives

查詢封存 metadata 索引

按 table/generation/來源主鍵或 hash 定位封存資料;不支援逐篇日期、關鍵字、正文搜尋。取回時提交 entryId 與 indexRevision。

參數型別說明
sourcestring封存查詢條件;ID/主鍵必須是十進位字串
kindstring封存查詢條件;ID/主鍵必須是十進位字串
generationstring封存查詢條件;ID/主鍵必須是十進位字串
tablestring封存查詢條件;ID/主鍵必須是十進位字串
legacyIdstring封存查詢條件;ID/主鍵必須是十進位字串
articleIdstring封存查詢條件;ID/主鍵必須是十進位字串
objectHashstring封存查詢條件;ID/主鍵必須是十進位字串
idstring封存查詢條件;ID/主鍵必須是十進位字串
cursorstring封存查詢條件;ID/主鍵必須是十進位字串
limitinteger每頁筆數,1–100,預設 50
curl -s 'https://tag.observe.tw/api/v1/nearline/archives?table=tag_cna&kind=sql_data&limit=1'
在瀏覽器開啟這個範例 ↗
回應欄位7 個
formatstring
indexRevisionstring
indexBuiltAtstring (ISO 時間)
countinteger
entries{鍵: object}[]
nextCursorstring | null
sourceSnapshots{鍵: object}[]

錯誤:400 查詢條件無效;503 索引未配置或服務不可用

GET/api/v1/nearline/status

封存索引更新狀況

curl -s 'https://tag.observe.tw/api/v1/nearline/status'
在瀏覽器開啟這個範例 ↗
回應欄位3 個
indexRevisionstring
indexBuiltAtstring (ISO 時間)
refresh{鍵: object} | null

錯誤:503 服務不可用

POST/api/v1/nearline/retrievals

排隊取回指定封存資料

需要 Bearer token。提交一個封存項目後,以作業 ID 查進度、讀取結果或下載檔案。結果保留 24 小時,不改變文章正文的公開期限。

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

錯誤:400 格式錯誤;401 需要授權;404 entry 不存在;409 索引版本改變或來源缺口;413 超過隔離還原預算;503 空間不足或服務不可用

GET/api/v1/nearline/retrievals/{id}

取回作業進度

參數型別說明
id(路徑)string取回 job ID
curl -s 'https://tag.observe.tw/api/v1/nearline/retrievals/0123456789abcdef0123456789abcdef'
在瀏覽器開啟這個範例 ↗

錯誤:401 需要授權;404 作業不存在

GET/api/v1/nearline/retrievals/{id}/results

分頁讀取封存取回結果

參數型別說明
id(路徑)string取回 job ID
cursorstring前頁 nextCursor
limitinteger每頁筆數,1–100,預設 50
curl -s 'https://tag.observe.tw/api/v1/nearline/retrievals/0123456789abcdef0123456789abcdef/results'
在瀏覽器開啟這個範例 ↗
回應欄位5 個
jobIdstring
result{鍵: object}
countinteger
entries{鍵: object}[]
nextCursorstring | null

錯誤:400 分頁參數錯誤;401 需要授權;409 結果尚未完成;410 結果已過期

GET/api/v1/nearline/retrievals/{id}/files/{role}

下載經驗證的封存 SQL 分包

參數型別說明
id(路徑)string取回 job ID
role(路徑)"schema" | "data" | "programs"schema、data 或 programs
curl -s 'https://tag.observe.tw/api/v1/nearline/retrievals/0123456789abcdef0123456789abcdef/files/schema'
在瀏覽器開啟這個範例 ↗

錯誤:401 需要授權;404 檔案不存在;409 校驗失敗;410 結果已過期

POST/api/v1/nearline/retrievals/{id}/retry

重試失敗的取回作業

參數型別說明
id(路徑)string取回 job ID
curl -s 'https://tag.observe.tw/api/v1/nearline/retrievals/0123456789abcdef0123456789abcdef/retry'
在瀏覽器開啟這個範例 ↗

錯誤:401 需要授權;409 作業非失敗狀態或已達三次上限

寫法:轉述社群貼文與標題用詞

GET/api/v1/writing

寫法總覽:轉述社群貼文與標題用詞

分母是已分析的文章(取得內文者)。轉述社群貼文:內文前 250 字寫明某人在臉書、Threads、X、節目等發文;發言者標籤依該句的頭銜詞,或這個名字在其他報導最常搭配的頭銜,管理員可設定多個角色或背景標籤;各標籤統計可重疊,文章總數不重複計算。轉載站不列入媒體表與總數。規則版本見 version。

參數型別說明
daysinteger最近幾天(台北日期),7–90,預設 30
curl -s 'https://tag.observe.tw/api/v1/writing?days=30'
在瀏覽器開啟這個範例 ↗
回應欄位31 個
generatedAtstring (ISO 時間)
versionstring規則版本
daysinteger
fromstring起始日(含)
totalsobject
totals.articlesinteger已分析篇數
totals.socialinteger轉述社群貼文篇數
totals.roles{鍵: integer}依發言者標籤;一篇可計入多個標籤,不可直接相加
totals.platforms{鍵: integer}依平台
totals.titleTags{鍵: integer}標題用詞:懸念、反應、攻擊
dailyobject[]逐日
daily[].daystring
daily[].articlesinteger已分析篇數
daily[].socialinteger轉述社群貼文篇數
daily[].roles{鍵: integer}依發言者標籤;一篇可計入多個標籤,不可直接相加
daily[].platforms{鍵: integer}依平台
daily[].titleTags{鍵: integer}標題用詞:懸念、反應、攻擊
mediaobject[]分析篇數 ≥ 100 的媒體,依轉述比例排序
media[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
media[].namestring
media[].articlesinteger已分析篇數
media[].socialinteger轉述社群貼文篇數
media[].roles{鍵: integer}依發言者標籤;一篇可計入多個標籤,不可直接相加
media[].platforms{鍵: integer}依平台
media[].titleTags{鍵: integer}標題用詞:懸念、反應、攻擊
postersobject[]最常被轉述的發言者(不含網友民眾),最多 40 人
posters[].namestring
posters[].rolestring相容舊版的第一個標籤
posters[].rolesstring[]全部發言者標籤
posters[].articlesinteger
posters[].outletsinteger幾家媒體轉述

GET/api/v1/writing/articles

寫法:符合條件的文章

沒有 tag 時只列轉述社群貼文的文章;指定 tag 時列標題含該類用詞的文章。新的在前,用 next 傳給 before 取下一頁。

參數型別說明
role"公職政治" | "前任公職" | "評論名嘴" | "專家企業" | "醫療健康" | "氣象" | "藝人網紅" | "機構" | "網友民眾" | "未知"發言者標籤
platform"Facebook" | "Threads" | "Instagram" | "X" | "YouTube" | "節目直播" | "PTT" | "Dcard" | "社群"平台
tag"懸念" | "反應" | "攻擊"標題用詞
mediastring刊登媒體
posterstring發言者名字
daysinteger最近幾天,1–90,預設 30
limitinteger筆數,1–100,預設 30
beforeinteger只列 id 小於此值的文章
curl -s 'https://tag.observe.tw/api/v1/writing/articles?role=醫療健康&limit=5'
在瀏覽器開啟這個範例 ↗
回應欄位14 個
articlesobject[]
articles[].idinteger
articles[].mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
articles[].namestring
articles[].titlestring
articles[].urlstring
articles[].publishedAtstring (ISO 時間)
articles[].platformstring | null
articles[].posterstring | null
articles[].rolestring | null相容舊版的第一個標籤
articles[].rolesstring[]全部發言者標籤
articles[].evidencestring | null判斷依據:內文中點名發言者的句子
articles[].titleTagsstring[]
nextinteger | null下一頁的 before

GET/api/v1/media/{media}/writing

單一媒體的寫法統計與逐日趨勢

參數型別說明
media(路徑)string媒體代碼
daysinteger最近幾天,7–365,預設 90
curl -s 'https://tag.observe.tw/api/v1/media/chinatimes/writing'
在瀏覽器開啟這個範例 ↗
回應欄位16 個
mediastring媒體代碼,例如 cna、ltn、udn;完整清單見 /api/v1/media
namestring
versionstring
daysinteger
fromstring
excludedFromStatisticsboolean轉載站,不列入跨媒體統計
totalsobject
totals.articlesinteger已分析篇數
totals.socialinteger轉述社群貼文篇數
totals.roles{鍵: integer}依發言者標籤;一篇可計入多個標籤,不可直接相加
totals.platforms{鍵: integer}依平台
totals.titleTags{鍵: integer}標題用詞:懸念、反應、攻擊
dailyobject[]
daily[].daystring
daily[].articlesinteger
daily[].socialinteger

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

單篇文章的寫法標記

參數型別說明
id(路徑)integer文章 id
curl -s 'https://tag.observe.tw/api/v1/articles/50878324/writing'
在瀏覽器開啟這個範例 ↗
回應欄位11 個
articleIdinteger
versionstring
analyzedAtstring (ISO 時間)
socialobject | null
social.platformstring
social.posterstring | null
social.rolestring | null相容舊版的第一個標籤
social.rolesstring[]全部發言者標籤
social.roleSourcestring | nullclause:句中頭銜;people:名字對照表;null:判斷不出
social.evidencestring | null
titleTagsstring[]

錯誤:400 文章 id 無效;404 尚未分析(沒有內文或還沒輪到)