Error Tracking
Capture errors and exceptions, group them into issues, search and resolve — Sentry-style error monitoring.
Overview
https://api.infrai.cc/v1/errorsAuthorization: Bearer $INFRAI_API_KEY# Call any /v1/errors capability over raw HTTP — no SDK to install.
# curl:
curl https://api.infrai.cc/v1/errors/... \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json"Methods
errors.capture
Capture an application error with optional tags.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
message | string | Required | Human-readable error message. |
code | string | Optional | Optional application error code. |
stack | string | Optional | Optional stack trace. |
tags | Record<string, string> | Optional | Key/value tags for grouping. |
Returns
{ ok, error_id }Example
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X POST https://api.infrai.cc/v1/errors/capture \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"exception": {"type": "ValueError", "message": "bad input", "stacktrace": "..."}, "level": "error"}'import os, requests
resp = requests.post(
"https://api.infrai.cc/v1/errors/capture",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={'exception': {'type': 'ValueError', 'message': 'bad input', 'stacktrace': '...'}, 'level': 'error'},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/capture",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"exception": {"type": "ValueError", "message": "bad input", "stacktrace": "..."}, "level": "error"}),
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/capture",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"exception": {"type": "ValueError", "message": "bad input", "stacktrace": "..."}, "level": "error"}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.message
上报一条结构化错误或日志消息
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
text | string | Required | 消息正文 |
level | 'debug' | 'info' | 'warning' | 'error' | 'fatal' | Optional | 级别:debug/info/warning/error/fatal |
tags | Record<string, string> | Optional | 键值标签,便于过滤与分组 |
user_id | string | Optional | 关联的用户 ID |
release | string | Optional | 发布版本标识 |
environment | 'production' | 'staging' | 'development' | Optional | 环境:production/staging/development |
idempotency_key | string | Optional | 幂等键,用于避免重复写入 |
Returns
CaptureResultExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X POST https://api.infrai.cc/v1/errors/message \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "..."}'import os, requests
resp = requests.post(
"https://api.infrai.cc/v1/errors/message",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={'text': '...'},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/message",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"text": "..."}),
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/message",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"text": "..."}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.list
分页列出捕获到的错误事件
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
filter | Record<string, unknown> | Optional | 过滤条件(观测过滤 DSL) |
cursor | string | Optional | 分页游标 |
limit | number | Optional | 每页返回数量 |
Returns
ErrorEventListExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X GET https://api.infrai.cc/v1/errors/list \
-H "Authorization: Bearer $INFRAI_API_KEY"import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/list",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/list",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/list",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.search
按关键词搜索错误事件
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Required | 搜索关键词 |
filter | Record<string, unknown> | Optional | 过滤条件(观测过滤 DSL) |
cursor | string | Optional | 分页游标 |
limit | number | Optional | 每页返回数量 |
Returns
ErrorEventListExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X GET https://api.infrai.cc/v1/errors/search \
-H "Authorization: Bearer $INFRAI_API_KEY"import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/search",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/search",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/search",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.get
按事件 ID 获取错误事件详情
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
event_id | string | Required | 错误事件 ID |
Returns
ErrorEventExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X GET https://api.infrai.cc/v1/errors/get/EVENT_ID \
-H "Authorization: Bearer $INFRAI_API_KEY"import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/get/EVENT_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/get/EVENT_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/get/EVENT_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.groups
分页列出错误分组
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
status | 'unresolved' | 'resolved' | 'ignored' | Optional | 按状态过滤:unresolved/resolved/ignored |
sort | 'count_desc' | 'last_seen_desc' | 'first_seen_desc' | Optional | 排序方式:count_desc/last_seen_desc/first_seen_desc |
cursor | string | Optional | 分页游标 |
limit | number | Optional | 每页返回数量 |
Returns
ErrorGroupListExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X GET https://api.infrai.cc/v1/errors/groups \
-H "Authorization: Bearer $INFRAI_API_KEY"import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/groups",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/groups",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/groups",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.group_detail
获取错误分组的聚合详情
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
error_group_id | string | Required | 错误分组 ID |
Returns
ErrorGroupDetailExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X GET https://api.infrai.cc/v1/errors/group_detail/ERROR_GROUP_ID \
-H "Authorization: Bearer $INFRAI_API_KEY"import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/group_detail/ERROR_GROUP_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/group_detail/ERROR_GROUP_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/group_detail/ERROR_GROUP_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.events
列出某错误分组下的事件
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
error_group_id | string | Required | 错误分组 ID |
cursor | string | Optional | 分页游标 |
limit | number | Optional | 每页返回数量 |
Returns
ErrorEventListExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X GET https://api.infrai.cc/v1/errors/events/ERROR_GROUP_ID \
-H "Authorization: Bearer $INFRAI_API_KEY"import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/events/ERROR_GROUP_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/events/ERROR_GROUP_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/events/ERROR_GROUP_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.resolve
将错误分组标记为已解决
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
error_group_id | string | Required | 错误分组 ID |
Returns
ErrorGroupExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X POST https://api.infrai.cc/v1/errors/resolve/ERROR_GROUP_ID \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"error_group_id": "..."}'import os, requests
resp = requests.post(
"https://api.infrai.cc/v1/errors/resolve/ERROR_GROUP_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={'error_group_id': '...'},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/resolve/ERROR_GROUP_ID",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"error_group_id": "..."}),
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/resolve/ERROR_GROUP_ID",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"error_group_id": "..."}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.unresolve
撤销错误分组的已解决状态
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
error_group_id | string | Required | 错误分组 ID |
Returns
ErrorGroupExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X POST https://api.infrai.cc/v1/errors/unresolve/ERROR_GROUP_ID \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"error_group_id": "..."}'import os, requests
resp = requests.post(
"https://api.infrai.cc/v1/errors/unresolve/ERROR_GROUP_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={'error_group_id': '...'},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/unresolve/ERROR_GROUP_ID",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"error_group_id": "..."}),
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/unresolve/ERROR_GROUP_ID",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"error_group_id": "..."}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.ignore
将错误分组标记为忽略
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
error_group_id | string | Required | 错误分组 ID |
Returns
ErrorGroupExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X POST https://api.infrai.cc/v1/errors/ignore/ERROR_GROUP_ID \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"error_group_id": "..."}'import os, requests
resp = requests.post(
"https://api.infrai.cc/v1/errors/ignore/ERROR_GROUP_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={'error_group_id': '...'},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/ignore/ERROR_GROUP_ID",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"error_group_id": "..."}),
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/ignore/ERROR_GROUP_ID",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"error_group_id": "..."}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.delete
删除错误分组
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
error_group_id | string | Required | 错误分组 ID |
Returns
DeleteResultExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X DELETE https://api.infrai.cc/v1/errors/delete/ERROR_GROUP_ID \
-H "Authorization: Bearer $INFRAI_API_KEY"import os, requests
resp = requests.delete(
"https://api.infrai.cc/v1/errors/delete/ERROR_GROUP_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/delete/ERROR_GROUP_ID",
{
method: "DELETE",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/delete/ERROR_GROUP_ID",
{
method: "DELETE",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.bulk
对多个错误分组批量执行操作
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
error_group_ids | string[] | Required | 目标错误分组 ID 列表 |
action | 'resolve' | 'unresolve' | 'ignore' | 'delete' | Required | 批量动作:resolve/unresolve/ignore/delete |
Returns
ErrorBulkResultExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X POST https://api.infrai.cc/v1/errors/bulk \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"error_group_ids": [], "action": "resolve"}'import os, requests
resp = requests.post(
"https://api.infrai.cc/v1/errors/bulk",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={'error_group_ids': [], 'action': 'resolve'},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/bulk",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"error_group_ids": [], "action": "resolve"}),
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/bulk",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"error_group_ids": [], "action": "resolve"}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.export
导出错误数据
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
filter | Record<string, unknown> | Optional | 过滤条件(观测过滤 DSL) |
format | 'json' | 'csv' | Optional | 导出格式:json 或 csv |
Returns
ErrorExportResultExample
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X POST https://api.infrai.cc/v1/errors/export \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'import os, requests
resp = requests.post(
"https://api.infrai.cc/v1/errors/export",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/export",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({}),
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/export",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.retention.get
查询错误数据保留期配置
Returns
{ days, auto_export_before_cleanup, export_destination }Example
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X GET https://api.infrai.cc/v1/errors/retention/get \
-H "Authorization: Bearer $INFRAI_API_KEY"import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/retention/get",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/retention/get",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/retention/get",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);errors.retention.set
设置错误数据保留期
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
days | number | Required | 保留天数 |
auto_export_before_cleanup | boolean | Optional | 清理前是否自动导出 |
export_destination | string | Optional | 导出目标地址 |
Returns
{ days, auto_export_before_cleanup, export_destination }Example
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."curl -X PUT https://api.infrai.cc/v1/errors/retention/set \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"days": 0}'import os, requests
resp = requests.put(
"https://api.infrai.cc/v1/errors/retention/set",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={'days': 0},
)
resp.raise_for_status()
print(resp.json())const resp = await fetch(
"https://api.infrai.cc/v1/errors/retention/set",
{
method: "PUT",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"days": 0}),
},
);
console.log(await resp.json());const resp = await fetch(
"https://api.infrai.cc/v1/errors/retention/set",
{
method: "PUT",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"days": 0}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);All capabilities
Every routed capability in this module — the complete public REST contract. The methods above are the guided walkthrough; this index is the full reference.
| Capability | Endpoint | Description |
|---|---|---|
errors.bulk | POST /v1/errors/bulk | Bulk-apply resolve/ignore/delete and other actions across multiple error groups. |
errors.capture | POST /v1/errors/capture | Capture an error event, aggregated into a group by fingerprint. |
errors.delete | DELETE /v1/errors/delete/{error_group_id} | Delete a specified error group. |
errors.events | GET /v1/errors/events/{error_group_id} | Page through all events within an error group. |
errors.export | POST /v1/errors/export | Export error data matching the filters (JSON or CSV). |
errors.get | GET /v1/errors/get/{event_id} | Get the details of one error event by event ID. |
errors.group_detail | GET /v1/errors/group_detail/{error_group_id} | Get the aggregated details of a specified error group. |
errors.groups | GET /v1/errors/groups | Page through error groups, with status filtering and sorting. |
errors.ignore | POST /v1/errors/ignore/{error_group_id} | Mark an error group as ignored. |
errors.list | GET /v1/errors/list | Page through captured error events, with filtering. |
errors.message | POST /v1/errors/message | Capture a structured error/log message (level, tags, user, release, environment). |
errors.resolve | POST /v1/errors/resolve/{error_group_id} | Mark an error group as resolved. |
errors.retention.get | GET /v1/errors/retention/get | Get the retention-period configuration for error data. |
errors.retention.set | PUT /v1/errors/retention/set | Set the retention period for error data, with auto-export before purge. |
errors.search | GET /v1/errors/search | Full-text search error events by keyword. |
errors.unresolve | POST /v1/errors/unresolve/{error_group_id} | Revert an error group's resolved status. |
End-to-end example
A production-style walkthrough of this module: configure once, then run the flow. It exercises most of the module's APIs.
A copy-paste-runnable single-file Python program (stdlib only, no SDK): set your INFRAI_API_KEY, run it, and walk this module's core flow with REAL billed calls — later steps reuse real fields returned by earlier ones. The 12-line helper is the entire integration.
#!/usr/bin/env python3
"""Infrai · errors — runnable real-app example (single file, zero deps).
Copy this file, set your key, run it: every step is a REAL call to
api.infrai.cc, billed at the real (tiny) per-call price, printing the
live JSON response. Get a key at https://infrai.cc/login (Google/
GitHub sign-in grants $2 free credit); add funds at
https://infrai.cc/billing. No SDK — the 12-line helper below is the
entire integration."""
import json
import os
from urllib import error, request
KEY = os.environ.get("INFRAI_API_KEY") or "ifr_..." # <- your key
BASE = "https://api.infrai.cc"
# Same raw HTTPS POST/GET as every per-method example on this page —
# wrapped once for reuse. There is nothing else to it: no SDK.
def infrai(method, path, body=None):
req = request.Request(
BASE + path, method=method,
data=json.dumps(body).encode() if body is not None else None,
headers={"Authorization": f"Bearer {KEY}",
"Content-Type": "application/json"})
try:
with request.urlopen(req, timeout=60) as r:
return json.loads(r.read())
except error.HTTPError as e:
return json.loads(e.read())
def show(label, resp):
print(f"\n== {label} ==")
print(json.dumps(resp, indent=2, ensure_ascii=False))
return resp
# 1) errors.capture — POST /v1/errors/capture · Capture an error event, aggregated into a group by fingerprint.
r1 = show("errors.capture", infrai("POST", "/v1/errors/capture", {"exception":{"type":"ValueError","message":"bad input","stacktrace":"..."},"level":"error"}))
# 2) errors.message — POST /v1/errors/message · Capture a structured error/log message (level, tags, user, release, environment).
r2 = show("errors.message", infrai("POST", "/v1/errors/message", {"text":"..."}))
# 3) errors.list — GET /v1/errors/list · Page through captured error events, with filtering.
r3 = show("errors.list", infrai("GET", "/v1/errors/list"))
一次性前置(每个范例都假定已完成):
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."# 1) Auth: every call is a raw HTTPS request to the Infrai gateway carrying
# only your project key. No SDK, no install.
# Get your key: sign in with Google/GitHub at https://infrai.cc/login for a
# project key + $2 free credit (email sign-in starts at $0). On 402
# INSUFFICIENT_CREDIT, add funds at https://infrai.cc/billing (or POST
# /v1/account/topup and open the returned checkout_url).
export INFRAI_API_KEY="ifr_..." # from https://infrai.cc/login
# 2) errors.capture
curl -X POST https://api.infrai.cc/v1/errors/capture \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"exception": {"type": "ValueError", "message": "bad input", "stacktrace": "..."}, "level": "error"}'
# 3) errors.message
curl -X POST https://api.infrai.cc/v1/errors/message \
-H "Authorization: Bearer $INFRAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "..."}'
# 4) errors.list
curl -X GET https://api.infrai.cc/v1/errors/list \
-H "Authorization: Bearer $INFRAI_API_KEY"
# 5) errors.search
curl -X GET https://api.infrai.cc/v1/errors/search \
-H "Authorization: Bearer $INFRAI_API_KEY"
# 6) errors.get
curl -X GET https://api.infrai.cc/v1/errors/get/EVENT_ID \
-H "Authorization: Bearer $INFRAI_API_KEY"
# 7) errors.groups
curl -X GET https://api.infrai.cc/v1/errors/groups \
-H "Authorization: Bearer $INFRAI_API_KEY"
# 8) errors.group_detail
curl -X GET https://api.infrai.cc/v1/errors/group_detail/ERROR_GROUP_ID \
-H "Authorization: Bearer $INFRAI_API_KEY"
# 9) errors.events
curl -X GET https://api.infrai.cc/v1/errors/events/ERROR_GROUP_ID \
-H "Authorization: Bearer $INFRAI_API_KEY"
# 1) Auth: every call is a raw HTTPS request carrying only your project key.
# No SDK to install — just the `requests` library.
import os, requests
BASE = "https://api.infrai.cc"
HEADERS = {
"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}",
"Content-Type": "application/json",
}
# 2) errors.capture
import os, requests
resp = requests.post(
"https://api.infrai.cc/v1/errors/capture",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={'exception': {'type': 'ValueError', 'message': 'bad input', 'stacktrace': '...'}, 'level': 'error'},
)
resp.raise_for_status()
print(resp.json())
# 3) errors.message
import os, requests
resp = requests.post(
"https://api.infrai.cc/v1/errors/message",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
json={'text': '...'},
)
resp.raise_for_status()
print(resp.json())
# 4) errors.list
import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/list",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())
# 5) errors.search
import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/search",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())
# 6) errors.get
import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/get/EVENT_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())
# 7) errors.groups
import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/groups",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())
# 8) errors.group_detail
import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/group_detail/ERROR_GROUP_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())
# 9) errors.events
import os, requests
resp = requests.get(
"https://api.infrai.cc/v1/errors/events/ERROR_GROUP_ID",
headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"},
)
resp.raise_for_status()
print(resp.json())
// 1) Auth: every call is a raw HTTPS request carrying only your project key.
// No SDK to install — just the built-in fetch().
const BASE = "https://api.infrai.cc";
const HEADERS = {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
};
// 2) errors.capture
const resp = await fetch(
"https://api.infrai.cc/v1/errors/capture",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"exception": {"type": "ValueError", "message": "bad input", "stacktrace": "..."}, "level": "error"}),
},
);
console.log(await resp.json());
// 3) errors.message
const resp = await fetch(
"https://api.infrai.cc/v1/errors/message",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"text": "..."}),
},
);
console.log(await resp.json());
// 4) errors.list
const resp = await fetch(
"https://api.infrai.cc/v1/errors/list",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());
// 5) errors.search
const resp = await fetch(
"https://api.infrai.cc/v1/errors/search",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());
// 6) errors.get
const resp = await fetch(
"https://api.infrai.cc/v1/errors/get/EVENT_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());
// 7) errors.groups
const resp = await fetch(
"https://api.infrai.cc/v1/errors/groups",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());
// 8) errors.group_detail
const resp = await fetch(
"https://api.infrai.cc/v1/errors/group_detail/ERROR_GROUP_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());
// 9) errors.events
const resp = await fetch(
"https://api.infrai.cc/v1/errors/events/ERROR_GROUP_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
console.log(await resp.json());
// 1) Auth: every call is a raw HTTPS request carrying only your project key.
// No SDK to install — just the built-in fetch(), typed.
const BASE = "https://api.infrai.cc";
const HEADERS: Record<string, string> = {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
};
// 2) errors.capture
const resp = await fetch(
"https://api.infrai.cc/v1/errors/capture",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"exception": {"type": "ValueError", "message": "bad input", "stacktrace": "..."}, "level": "error"}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);
// 3) errors.message
const resp = await fetch(
"https://api.infrai.cc/v1/errors/message",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"text": "..."}),
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);
// 4) errors.list
const resp = await fetch(
"https://api.infrai.cc/v1/errors/list",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);
// 5) errors.search
const resp = await fetch(
"https://api.infrai.cc/v1/errors/search",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);
// 6) errors.get
const resp = await fetch(
"https://api.infrai.cc/v1/errors/get/EVENT_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);
// 7) errors.groups
const resp = await fetch(
"https://api.infrai.cc/v1/errors/groups",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);
// 8) errors.group_detail
const resp = await fetch(
"https://api.infrai.cc/v1/errors/group_detail/ERROR_GROUP_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);
// 9) errors.events
const resp = await fetch(
"https://api.infrai.cc/v1/errors/events/ERROR_GROUP_ID",
{
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.INFRAI_API_KEY}`,
},
},
);
if (!resp.ok) throw new Error(`infrai ${resp.status}`);
const data: unknown = await resp.json();
console.log(data);