查看全局 API 说明(请求/响应头、通用 JSON 格式)
省级非遗 API
省级非物质文化遗产代表性项目、传承人及数量统计(2005–2024)
https://www.resapi.cn/v1/ich
简介
基于整理的省级非遗名录 Excel 数据,支持项目/传承人列表、关键词搜索、详情(含关联传承人)及省/市数量统计。数据来源于公开整理资料,仅供参考,请以文化和旅游主管部门最新公布为准。
GET /v1/ich/projects
按条件分页列出 省级非遗代表性项目。
查询参数
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| province | string | 否 | 省级行政区,如 安徽省 |
| city | string | 否 | 市级行政区 |
| category | string | 否 | 类别,如 传统戏剧 |
| batch | string | 否 | 批次,如 第一批 |
| year | int | 否 | 公布年份 |
| page | int | 否 | 页码,默认 1 |
| page_size | int | 否 | 每页条数,默认 20,最大 100 |
响应
data 为项目数组;meta 含分页信息(page、page_size、total、total_pages)。
GET /v1/ich/projects/search
按关键词搜索项目(匹配项目名、类别、地区等)。
| 名称 | 必填 | 说明 |
|---|---|---|
| q | 是 | 搜索关键词,如 黄梅戏 |
| province / city / category / batch / year | 否 | 与列表接口相同,用于缩小范围 |
| page / page_size | 否 | 分页 |
搜索接口有独立限流策略。
GET /v1/ich/projects/{id}
获取项目详情,并附带同 省、市、项目名、批次 关联的传承人列表。
路径参数 id 为项目主键。meta.inheritor_count 为关联传承人数;meta.note 说明关联规则。
GET /v1/ich/inheritors
分页列出 代表性传承人。
| 名称 | 必填 | 说明 |
|---|---|---|
| province | 否 | 省级行政区 |
| city | 否 | 市级行政区 |
| project | 否 | 所属项目名称 |
| name | 否 | 传承人姓名(精确匹配) |
| page / page_size | 否 | 分页 |
GET /v1/ich/inheritors/search
按关键词搜索传承人(姓名、项目名、地区等)。q 必填。
GET /v1/ich/stats/provinces
返回各省非遗 项目数 与 传承人数(截止 2024 年统计表)。
meta.scope 为统计口径说明。
GET /v1/ich/stats/cities
返回各市项目数与传承人数(2024 年统计表)。
meta.note:市级统计表不含省份字段,全国可能存在同名市,解读时请结合业务上下文。
GET /v1/ich/meta/provinces
返回项目库中出现的省份列表及条目数(用于筛选项)。
GET /v1/ich/meta/categories
返回类别列表及条目数。
GET /v1/ich/meta/batches
返回批次列表及条目数。
数据字段说明(项目 / 传承人)
| 字段 | 说明 |
|---|---|
| province / province_en | 省(中英文) |
| city / city_en | 市(中英文) |
| batch / batch_en | 公布批次 |
| publish_year | 公布年份 |
| category / category_en | 类别 |
| project_name / project_name_en | 项目名称 |
| person_name / person_name_en | 传承人姓名(仅传承人记录) |
响应头 X-Data-Version-ICH 表示当前数据版本(配置项 data.ich_version)。
通用错误码
以下错误码适用于平台全部 /v1/* 接口(各接口在「错误代码」Tab 中另有本接口补充说明)。
错误响应格式
HTTP 状态码非 2xx 时,响应体一般为:
{
"error": {
"code": "错误码",
"message": "错误信息"
}
}
错误码一览
| HTTP | code | message | 说明 |
|---|---|---|---|
| 400 | invalid_params | 参数无效 | 必填参数缺失、格式不合法或超出允许范围 |
| 404 | not_found | 资源不存在 | 按编码或 ID 查询时无匹配记录 |
| 429 | rate_limit_exceeded | 请求过于频繁 | 超过当前 IP 的访问频率限制 |
| 500 | internal_error | 服务器内部错误 | 服务端或数据库异常,请稍后重试 |
限流、缓存等 HTTP 响应头含义见上文「响应头说明」。
常见错误
| HTTP | code | 说明 |
|---|---|---|
| 400 | invalid_params |
参数无效,如 q 为空、id 非数字、page/page_size 超出范围 |
| 404 | not_found |
项目 id 不存在 |
| 429 | rate_limited |
搜索类接口触发限流 |
| 500 | internal_error |
服务端查询失败 |
错误响应格式与平台统一:
{
"error": {
"code": "invalid_params",
"message": "q 不能为空"
}
}
请求根地址为 https://www.resapi.cn。每个场景含 7 种语言(cURL → JavaScript → Python → Go → Java → PHP → C#)。
搜索非遗项目
GET /v1/ich/projects/search?q=黄梅戏&limit=5
cURL
curl -s "https://www.resapi.cn/v1/ich/projects/search?q=黄梅戏&page_size=5" \
-H "Accept: application/json"
JavaScript
const res = await fetch(
"https://www.resapi.cn/v1/ich/projects/search?q=" + encodeURIComponent("黄梅戏") + "&page_size=5",
{ headers: { Accept: "application/json" } }
);
if (!res.ok) throw new Error(res.statusText);
console.log(await res.json());
Python
import requests
r = requests.get(
"https://www.resapi.cn/v1/ich/projects/search",
params={"q": "黄梅戏", "page_size": 5},
headers={"Accept": "application/json"},
timeout=30,
)
r.raise_for_status()
print(r.json())
Go
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
u, _ := url.Parse("https://www.resapi.cn/v1/ich/projects/search")
q := u.Query()
q.Set("q", "黄梅戏")
q.Set("page_size", "5")
u.RawQuery = q.Encode()
resp, err := http.Get(u.String())
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var out any
json.Unmarshal(body, &out)
fmt.Println(out)
}
Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
var req = HttpRequest.newBuilder()
.uri(URI.create("https://www.resapi.cn/v1/ich/projects/search?q=%E9%BB%84%E6%A2%85%E6%88%8F&page_size=5"))
.header("Accept", "application/json")
.GET()
.build();
var res = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
}
}
PHP
<?php
$ch = curl_init("https://www.resapi.cn/v1/ich/projects/search?" . http_build_query([
"q" => "黄梅戏",
"page_size" => 5,
]));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Accept: application/json"],
]);
echo curl_exec($ch);
curl_close($ch);
C#
using System.Net.Http;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
var json = await client.GetStringAsync(
"https://www.resapi.cn/v1/ich/projects/search?q=%E9%BB%84%E6%A2%85%E6%88%8F&page_size=5");
Console.WriteLine(json);
各省非遗数量统计
GET /v1/ich/stats/provinces
cURL
curl -s "https://www.resapi.cn/v1/ich/stats/provinces" -H "Accept: application/json"
JavaScript
const res = await fetch("https://www.resapi.cn/v1/ich/stats/provinces", {
headers: { Accept: "application/json" },
});
console.log(await res.json());
Python
import requests
print(requests.get("https://www.resapi.cn/v1/ich/stats/provinces", timeout=30).json())
Go
resp, _ := http.Get("https://www.resapi.cn/v1/ich/stats/provinces")
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)
Java
var res = HttpClient.newHttpClient().send(
HttpRequest.newBuilder().uri(URI.create("https://www.resapi.cn/v1/ich/stats/provinces")).GET().build(),
HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
PHP
<?php echo file_get_contents("https://www.resapi.cn/v1/ich/stats/provinces"); ?>
C#
Console.WriteLine(await new HttpClient().GetStringAsync("https://www.resapi.cn/v1/ich/stats/provinces"));