跳到主要内容
Sursa Developers

POST/v1/cards/archive

上传文档压缩包

upload_card_archive

在 multipart/form-data 表单的 file 字段中发送 ZIP 压缩包。其中每个受支持的文件都会成为单独的文档,与单个上传(POST /v1/cards)相同。ASiC 签名容器(.asice、.sce、.bdoc、.asics)也视为压缩包:其中的数据文件成为文档,跳过 META-INF/,不验证签名。表单字段与文件上传相同(合集、标签、负责人、分类、敏感级别),但没有预览。

按签名检查压缩包(改了扩展名的 Office 文档不算压缩包,会返回 415 files.type_mismatch),适用部署的上传限制,病毒扫描覆盖整个压缩包。

压缩包的文件目录同步检查。响应包含计划(哪些文件会成为文档,哪些会被跳过及原因)和解压作业(job_id、batch_id)。该作业会打开嵌套的压缩包(默认最多 3 层),按签名和病毒扫描检查每个文档,并以相同的 batch_id 将其排入常规索引队列(文档进度:GET /v1/jobs?batch=)。结果可通过 GET /v1/archives/{job_id} 获取。

限制(部署的默认值):整个树中最多 1000 个文件(超过时返回 413 cards.archive_too_many_files),解压后最多 2048 MB(超过时返回 413 cards.archive_too_large),且不超过组织套餐的剩余存储空间(402 limits.storage);其中每个文件都受单文件上传限制约束,每个条目的压缩比最多为 100:1。包含“..”、绝对路径或盘符的条目、符号链接、加密条目和不支持的格式会被跳过并注明原因(skipped[].reason)。操作系统的系统文件、目录和空文件会被静默跳过(ignored)。不是 UTF-8 编码的名称按 cp866 或 cp1251 读取。不是 ZIP 的文件返回 400 cards.archive_invalid,完全加密的压缩包返回 400 cards.archive_encrypted,不含任何文档的压缩包返回 400 cards.archive_empty。

每个文档都会记住其所属的压缩包:CardVersion.archive 和 Card.source_archive(卡片显示其当前版本的压缩包)。

除表单外,也可以发送 application/json 请求体(ArchiveUploadFromUpload,从 1.62.0 起):压缩包是已就绪的分段上传 upload_id(用途为 archive),字段与表单相同,tags 为字符串列表。压缩包已在 complete 时检查过,大小限制采用分段上传的限制,而不是单次请求上传的限制。上传只能使用一次,并且在将解压作业排入队列的同一事务中使用;上传的错误码与 POST /v1/cards 相同。

身份验证

在 Authorization 请求头中传入 API 密钥:Authorization: Bearer <密钥>。

请求头参数

  • Idempotency-Keystring

    写操作安全重试所用的键:1 到 255 个可打印 ASCII 字符;建议每个逻辑操作使用一个 UUID v4。24 小时内使用同一个键重试不会再次执行操作,而是返回已保存的响应(状态、响应头和正文),并附带 Idempotency-Replayed: true 头。同一个键配合不同的方法、路径、Content-Type 或正文时返回 409 api.idempotency_mismatch;第一个请求仍在执行时返回 409 api.idempotency_in_progress,并附带 Retry-After: 1。收到 5xx 或 429 响应后,该键被释放,重试会再次执行操作。键的作用范围是组织和调用方(API 密钥、用户或自定义数据源密钥)。

    length ≥ 1, length ≤ 255

  • X-View-Asstring

    仅适用于具有 admin 角色的 API 密钥。以数据权限档案 <profile>[:viewer|verifier|editor] 的身份发出请求,例如 employee:viewer。部署密钥不能使用此头(403)。

Cookie 参数

  • kb_view_asstring

    会话的“View as”模式 Cookie。POST /auth/view-as 设置该 Cookie,DELETE /auth/view-as 将其清除。

请求体

multipart/form-data

对象:ArchiveUploadForm

  • filestring (application/zip)必填
  • collectionstring

    默认值:"default"

  • tagsstring

    默认值:""

  • forceboolean

    默认值:false

  • owner_idinteger | null
  • verify_interval_daysinteger | null
  • categorystring | null
  • sensitiveboolean | null
  • folder_idstring | null

    存放压缩包内所有文档的 collection 中的文件夹。属于其他合集的文件夹返回 400 folders.card_collection_mismatch,不存在的文件夹返回 404 folders.not_found,对该文件夹没有 COLLECTION_EDIT_CARDS 权限时返回 403 authz.forbidden。检查在保存压缩包之前进行。已上传文件的重复项不会被移入该文件夹。

    length ≤ 64

  • collection_idinteger | null

    按 ID 指定合集。同时传入 collection 时以 collection_id 为准。组织中不存在或不可见的合集返回 404 collections.not_found。

application/json

对象:ArchiveUploadFromUpload

  • upload_idstring必填

    用途为 archive 的就绪上传(ready);只能使用一次。

  • collectionstring

    默认值:"default"

  • collection_idinteger | null

    按 ID 指定合集。同时传入 collection 时,以 collection_id 为准。合集在组织中不存在、不可见或不在密钥的合集范围内时,返回 404 collections.not_found。

  • tagsarray of string

    items ≤ 30

  • forceboolean

    默认值:false

  • owner_idinteger | null
  • verify_interval_daysinteger | null
  • categorystring | null
  • sensitiveboolean | null
  • folder_idstring | null

    length ≤ 64

响应

200解压计划和作业

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

  • Idempotency-Replayed

    为 true 时表示该响应是按此 Idempotency-Key 从已保存的响应重放的:操作没有再次执行。

application/json

对象:ArchiveUploadResult

  • job_idinteger必填
  • batch_idstring必填

    压缩包内文档的索引作业批次(GET /v1/jobs?batch=)。

  • statusstring必填

    可选值: queued

  • archiveArchiveInfo必填
  • plannedarray of string必填

    各层级中将成为文档的文件路径,包括嵌套压缩包中的文件(b.zip/c.pdf)。

  • documentsinteger必填

    各层级的文档数量,包括嵌套压缩包中的文件。解压结果加起来等于同一数字:已创建 + 重复项 + 未通过内容检查而被拒绝的文件(ArchiveJob)。

  • nested_archivesinteger必填
  • skippedarray of ArchiveSkip必填
  • ignoredinteger必填

    系统条目(操作系统文件、目录、空文件、容器签名)。

400请求无效:参数值或对象状态不允许执行该操作(`detail` 为消息)。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

401未发送凭据(既没有会话 Cookie,也没有 API 密钥),或未找到该密钥。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

402组织已达到套餐限额(卡片、存储空间或用户)。`error.details` 中包含 `kind`、`limit` 和 `used`。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

403不允许执行该操作:角色权限不足、无权访问合集或卡片、请求在“View as”模式下执行,或组织已被暂停或删除(`detail` 为对象,包含 `code: org_suspended | org_deleted`)。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

404对象不存在或您无权访问。对于访问受限的对象,API 不会确认其是否存在。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

409对象状态不允许执行该操作,例如存在重复、正在索引,或作业已处理过。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

410对象曾经存在,但已不可用:链接已被使用或已过期,或文件已在保留期限结束时删除。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

413请求体超过允许的大小。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

415不支持该文件格式。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

422校验错误:请求体或参数不符合定义的结构(`detail` 为校验错误列表),或参数值超出范围(`detail` 为消息)。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

429请求过多(`api.rate_limited`)、组织每分钟、每天或每月的配额已用完(`api.quota_exceeded`;`error.details` 中包含 `quota`、`limit` 和 `reset_at`)、已达到组织的限额,或回答服务繁忙(`answers.engine_busy`)。请等待 `Retry-After` 头中给出的时间。

响应头

  • Retry-After

    重试请求前需要等待的秒数。

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

503此请求所依赖的服务暂时不可用。请稍后重试。

响应头

  • RateLimit-Policy

    当前生效的限制,格式遵循 IETF 草案 draft-ietf-httpapi-ratelimit-headers:以逗号分隔的项 "<name>";q=<quota>;w=<window in seconds>。key 是 API 密钥的请求速率(配额即突发量,时间窗口是配额完全恢复所需的时间;会话为 user,无凭据时为 ip);minute、day 和 month 是组织按 UTC 计算的自然分钟、自然日和自然月的配额。

  • RateLimit

    RateLimit-Policy 中每项限制的剩余量:"<name>";r=<remaining>;t=<seconds until reset>。

  • X-RateLimit-Limit

    RateLimit-Policy 中最严格一项(剩余请求数最少的一项)的限额。

  • X-RateLimit-Remaining

    最严格限制下的剩余请求数。

  • X-RateLimit-Reset

    距最严格限制重置的秒数。

application/json

对象:Error

错误码

除所有请求通用的错误码外,此接口还可能在 error.code 中返回以下错误码。

安全重试

每个 POST 和 PATCH 请求都传入 Idempotency-Key 头(例如一个 UUID)。24 小时内用同一个键重试时,返回已保存的响应,不会再次执行请求。

速率限制

响应带有 RateLimit 和 RateLimit-Policy 头,以及旧版的 X-RateLimit-Limit、X-RateLimit-Remaining 和 X-RateLimit-Reset 头。429 响应带有以秒为单位的 Retry-After:等待后重试。

← cards · API 参考