用户
先访问合作商网站并完成登录。用户不接触合作商 API key,只接收属于自己的 identity 与一次性返回的 token。
Star Citizen public data API
公共客户端通过短期票据读取数据;合作商通过 API key 分配 identity,再由终端用户携带 identity 凭据直连 SCAPI。
TRY
选择接口和参数,页面会自动完成需要的 session 与 ticket 流程。
选择接口后点击“运行测试”,响应 JSON 将显示在这里。
B2B
API key 只负责分配身份,identity 才是读取 SCAPI 数据的凭据。
API key 由 SCAPI 管理方离线签发,不存在公开的“创建 API key”端口。明文 key 只交付合作商一次;SCAPI 配置只保存 SHA-256。
$key = [Convert]::ToBase64String(
[Security.Cryptography.RandomNumberGenerator]::GetBytes(32)
)
$hash = [Convert]::ToHexString(
[Security.Cryptography.SHA256]::HashData(
[Text.Encoding]::UTF8.GetBytes($key)
)
).ToLowerInvariant()
"API key: $key"
"SHA-256: $hash"
{
"partners": [{
"id": "partner-a",
"api_key_sha256": "<64-character-sha256>",
"quota_30m": 3600,
"identity_quota_per_minute": 120,
"identity_max_ttl_seconds": 86400,
"enabled": true
}]
}
API key 通过安全渠道交给合作商后端负责人;将 SHA-256 写入 SCAPI 配置。合作商遗失 key 时应重新签发并替换哈希,无法从 SCAPI 状态中恢复明文。先访问合作商网站并完成登录。用户不接触合作商 API key,只接收属于自己的 identity 与一次性返回的 token。
验证用户后决定有效期和额度,使用保存在服务端的 API key 创建或撤销 identity。API key 不能读取数据。
从合作商 30 分钟额度窗口预留 grant,校验用户 identity,并按每次数据请求的 Cost 消耗用户额度。
合作商自行完成登录、订阅状态或权限检查。
为该用户选择 identity 名称、有效秒数和独立额度。
合作商后端使用 x-scapi-api-key 调用 POST /identity。
合作商把返回的完整 identity 与 token 交给用户;token 只在创建响应中出现一次。
用户携带两个 identity headers 请求 /api/*,不再需要 API key、session 或 ticket。
跨窗口自动续留剩余额度;到期自动失效,合作商也可提前撤销并回收当前窗口预留。
x-scapi-api-key 只能保存在合作商后端。不得写入网页 JavaScript、移动端包、桌面客户端或返回给终端用户。curl --request POST "$SCAPI_BASE/identity" \
--header "x-scapi-api-key: $SCAPI_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"identity": "ABC123",
"expires_in_seconds": 3600,
"quota": 1000
}'
{
"ok": true,
"data": {
"identity": "partner-a:ABC123",
"token": "<identity-token>",
"expires_at": 2000003600,
"expires_in_seconds": 3600,
"quota": 1000
}
}
curl "$SCAPI_BASE/api/components?page_size=10" \
--header "x-scapi-identity: partner-a:ABC123" \
--header "x-scapi-identity-token: <identity-token>"
curl --request DELETE "$SCAPI_BASE/identity/ABC123" \
--header "x-scapi-api-key: $SCAPI_API_KEY"
用户使用 400,identity 剩余 600;合作商当前窗口已为它预留 1000。
新窗口从合作商额度先扣 600。用户继续消费这 600,不会再次扣合作商额度。
API
每个公开资源都支持列表、搜索和详情三种读取方式。
/api/health0 Cost · 服务健康状态,无需 ticket。
/api/resources0 Cost · 当前可用资源键与中文标签。
/api/session1 Cost · 创建匿名会话,返回 nonce 与 sequence。
/api/ticket1 Cost · 签发绑定 intent 和参数的短期 Bearer ticket。
/identity合作商 API key 创建用户 identity,独立指定有效期与额度。
/identity/{name}合作商撤销自己的 identity,并返还当前窗口内未使用预留。
/api/{resource}普通资源每 10 个 1 Cost;ships 每 5 个 1 Cost,向上取整。
/api/{resource}/search普通资源每 8 个 1 Cost;ships 每 4 个 1 Cost,向上取整。
/api/search全局搜索每 4 个结果容量 1 Cost,向上取整。
/api/{resource}/{id}普通详情 1 Cost;ships 为 2/4,star_systems 为 1/2,terminals 为 1/4 Cost。
01
不使用合作商 identity 的客户端通过会话、票据和实际请求完成一次受保护读取。
GET /api/session保存 HTTP-only cookie,并取得 nonce 与 sequence。POST /api/ticket票据必须绑定实际请求的资源、ID 和参数。GET /api/...发送 Bearer ticket;详情还需发送轮换后的 replay headers。POST /api/ticket
Content-Type: application/json
x-scapi-fingerprint: your-browser-fingerprint
{
"resource": "ships",
"id": "Ship.anvl-ballista",
"intent": "detail",
"UncommonData": 0,
"nonce": "<session nonce>",
"sequence": 1,
"behavior": {"dwell_ms": 500, "has_interaction": true}
}
GET /api/ships/Ship.anvl-ballista?UncommonData=0
Authorization: Bearer <ticket>
x-scapi-fingerprint: your-browser-fingerprint
x-scapi-nonce: <next_nonce>
x-scapi-sequence: <next_sequence>
02
UncommonData 适用于载具、星系和终端详情接口。
保留状态、尺寸、装甲、飞行性能和现有 overview,并追加型号数量汇总。
components返回经过公共字段过滤的完整 components 节点结构,适合配装或结构分析。
{
"overview": {
"EquipmentSummary": {
"Weapons": [{
"ItemID": "VehicleWeapon.example",
"ItemType": "VehicleWeapon",
"NameCN": "示例火炮",
"Size": 3,
"Count": 4
}]
}
}
}{
"ID": "StarSystem.Stanton",
"Stars": [{
"ID": "Star.StantonStar",
"StarNameCN": "斯坦顿",
"StarNameEN": "Stanton",
"StarmapSize": 696000000,
"BodyRadius": null,
"Material": "Texture/StantonStar.mtl",
"Orbit": {"ParentID": null},
"Planets": [{
"ID": "Planet.Stanton3",
"PlanetNameCN": "弧光星",
"PlanetNameEN": "ArcCorp",
"StarmapSize": 800000,
"BodyRadius": 800000,
"Material": "Texture/Stanton3.mtl",
"Orbit": {"ParentID": "Star.StantonStar"}
}]
}]
}03
匿名认证链的每一步都消耗同一个 30 分钟共享额度,最终响应显示完整调用链成本。
/api/health · /api/resources0,不扣除额度/api/session · /api/ticket每次 1/api/{resource}普通资源 ⌈page_size / 10⌉;ships ⌈page_size / 5⌉/api/{resource}/search普通资源 ⌈limit / 8⌉;ships ⌈limit / 4⌉/api/search⌈limit / 4⌉/api/{resource}/{id}普通资源 1;ships 为 2/4;star_systems 为 1/2;terminals 为 1/4X-RateLimit-Limit当前生效额度桶的上限;匿名成功请求显示共享总额度X-RateLimit-Remaining本次扣费后的剩余额度X-RateLimit-Reset当前窗口重置的 Unix 时间X-RateLimit-Cost匿名首次调用显示 session 1 + ticket 1 + 数据 Cost;复用 session 后显示 ticket 1 + 数据 CostX-SCAPI-Next-Nonce · X-SCAPI-Next-Sequence详情请求返回下一次复用 session 所需的防重放状态Retry-After仅 429 返回,距离窗口重置的秒数匿名共享总额度默认每 IP 每 30 分钟 30 Cost。例如全局搜索 limit=20 的数据 Cost 为 5,首次调用报告并实际消耗 7 Cost;同一页面复用 session 后为 6 Cost。合作商可在接口测试区输入自己的 API key,创建短期测试 identity 后按 identity grant 调用;凭据只保留在当前页面内存。
04
所有 API 错误使用相同 envelope,并返回 request ID 与额度响应头。
{
"ok": false,
"error": {
"code": "ticket_scope_mismatch",
"message": "Ticket scope does not match.",
"detail": null
},
"meta": {"request_id": "..."}
}