POST/v1/uploads/{upload_id}/complete
Selesaikan unggahan
complete_upload
Setelah semua bagian diterima, Sursa merakit file, membandingkan SHA-256 seluruh file dengan sha256 di isi permintaan, dan menjalankan pemeriksaan yang sama seperti untuk unggahan dalam satu permintaan: format menurut tanda tangan konten dan pemindaian antivirus. Hasilnya ready, atau rejected dengan reject_reason (checksum_mismatch, type_mismatch, unsupported_format, infected, scan_unavailable, unsafe_content). Setiap penolakan oleh pemeriksaan format atau antivirus dicatat di log audit sebagai file.rejected.
Respons 200 berarti hasilnya sudah siap; 202 berarti file masih diperiksa (processing), dan hasilnya didapat dari GET /v1/uploads/{upload_id}. Jika status kembali ke pending (restart instans API menginterupsi pemeriksaan), kirim complete lagi. Mengulang complete setelah ada hasil mengembalikan hasil yang sama. Bagian yang belum ada mengembalikan 409 uploads.incomplete (details.missing). sha256 yang berbeda dari yang dideklarasikan saat pembuatan, atau parts[].etag yang berbeda dari bagian yang diterima, mengembalikan 422 uploads.checksum_mismatch. Unggahan siap yang tidak dipakai berlaku selama 24 jam. Ditambahkan di 1.62.0.
Autentikasi
Kirim kunci API di header Authorization: Authorization: Bearer <kunci>.
Parameter path
upload_idstringwajibID unggahan (
upl_diikuti 32 karakter heksadesimal).length ≤ 64
Parameter header
Idempotency-KeystringKunci untuk percobaan ulang penulisan yang aman: 1 hingga 255 karakter ASCII yang dapat dicetak; disarankan satu UUID v4 per operasi logis. Percobaan ulang dengan kunci yang sama dalam 24 jam tidak menjalankan operasi lagi: yang dikembalikan adalah respons tersimpan (status, header, dan isi) dengan header
Idempotency-Replayed: true. Kunci yang sama dengan metode, path,Content-Type, atau isi yang berbeda mengembalikan409 api.idempotency_mismatch; selama permintaan pertama masih berjalan,409 api.idempotency_in_progressdenganRetry-After: 1. Setelah respons 5xx atau 429, kunci dilepaskan, dan percobaan ulang menjalankan operasi lagi. Kunci berlaku dalam lingkup organisasi dan pemanggil (kunci API, pengguna, atau kunci sumber kustom).length ≥ 1, length ≤ 255
Isi permintaan
application/json
sha256stringwajibSHA-256 seluruh file.
partsarray of UploadPartRefPemeriksaan bagian yang opsional: ETag setiap bagian seperti yang dikembalikan oleh
PUT …/parts/{n}.items ≤ 1000
Respons
200Hasilnya sudah siap: `ready` atau `rejected`.
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
Idempotency-Replayedtrueberarti respons ini dikirim ulang dari respons tersimpan untukIdempotency-Keyini: operasi tidak dijalankan lagi.
application/json
idstringwajibID unggahan (
upl_diikuti 32 karakter heksadesimal).filenamestringwajibNama file (tanpa folder).
content_typestringwajibJenis konten yang dinyatakan; kosong jika tidak dinyatakan.
sizeinteger (int64)wajibUkuran file dalam byte.
sha256string | nullwajibSHA-256 file, yang dinyatakan saat pembuatan atau saat
complete;nulljika belum diketahui.part_sizeinteger (int64)wajibUkuran setiap bagian kecuali yang terakhir (dari 5 hingga 100 MiB).
part_countintegerwajibJumlah bagian.
≥ 1, ≤ 1000
parts_receivedintegerwajibJumlah bagian yang sudah diterima.
≥ 0
Bagian yang sudah diterima menurut nomor (kosong dalam respons
POST /v1/uploads).reject_reasonstring | nullwajibAlasan penolakan (
rejected):checksum_mismatch,type_mismatch,unsupported_format,infected,scan_unavailable,unsafe_content. Enum dapat bertambah;nulljika tidak ditolak.reject_detailsobject | nullwajibDetail penolakan (ekstensi, format yang dinyatakan dan yang terdeteksi, checksum);
nulljika tidak ditolak.created_atstring (date-time)wajibKapan unggahan dibuat.
expires_atstring (date-time)wajibTenggat untuk menyelesaikan unggahan dan, setelah siap, untuk memakainya.
completed_atstring (date-time) | nullwajibKapan pemeriksaan selesai (
readyataurejected).consumed_atstring (date-time) | nullwajibKapan unggahan dipakai (oleh kartu, arsip, atau impor).
202File masih diperiksa (`processing`).
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
Idempotency-Replayedtrueberarti respons ini dikirim ulang dari respons tersimpan untukIdempotency-Keyini: operasi tidak dijalankan lagi.
application/json
idstringwajibID unggahan (
upl_diikuti 32 karakter heksadesimal).filenamestringwajibNama file (tanpa folder).
content_typestringwajibJenis konten yang dinyatakan; kosong jika tidak dinyatakan.
sizeinteger (int64)wajibUkuran file dalam byte.
sha256string | nullwajibSHA-256 file, yang dinyatakan saat pembuatan atau saat
complete;nulljika belum diketahui.part_sizeinteger (int64)wajibUkuran setiap bagian kecuali yang terakhir (dari 5 hingga 100 MiB).
part_countintegerwajibJumlah bagian.
≥ 1, ≤ 1000
parts_receivedintegerwajibJumlah bagian yang sudah diterima.
≥ 0
Bagian yang sudah diterima menurut nomor (kosong dalam respons
POST /v1/uploads).reject_reasonstring | nullwajibAlasan penolakan (
rejected):checksum_mismatch,type_mismatch,unsupported_format,infected,scan_unavailable,unsafe_content. Enum dapat bertambah;nulljika tidak ditolak.reject_detailsobject | nullwajibDetail penolakan (ekstensi, format yang dinyatakan dan yang terdeteksi, checksum);
nulljika tidak ditolak.created_atstring (date-time)wajibKapan unggahan dibuat.
expires_atstring (date-time)wajibTenggat untuk menyelesaikan unggahan dan, setelah siap, untuk memakainya.
completed_atstring (date-time) | nullwajibKapan pemeriksaan selesai (
readyataurejected).consumed_atstring (date-time) | nullwajibKapan unggahan dipakai (oleh kartu, arsip, atau impor).
401Kredensial tidak dikirim (baik cookie sesi maupun kunci API), atau kunci tidak ditemukan.
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
403Tindakan tidak diizinkan: peran tidak memadai, tidak ada akses ke koleksi atau kartu, permintaan berjalan dalam mode “View as”, atau organisasi ditangguhkan atau dihapus (`detail` adalah objek dengan `code: org_suspended | org_deleted`).
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
404Objek tidak ada atau tidak tersedia bagi Anda. API tidak mengonfirmasi keberadaan objek yang dibatasi.
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
409Status objek tidak memungkinkan tindakan ini, misalnya duplikat, pengindeksan yang sedang berlangsung, atau job yang sudah diproses.
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
410Objek pernah ada tetapi tidak lagi tersedia: tautan sudah dipakai atau kedaluwarsa, atau file dihapus pada akhir masa retensinya.
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
422Error validasi: isi atau parameter tidak sesuai dengan skema (`detail` berisi daftar error validasi), atau nilai parameter berada di luar rentang (`detail` berisi pesan).
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
429Terlalu banyak permintaan (`api.rate_limited`), kuota organisasi untuk menit, hari, atau bulan sudah habis (`api.quota_exceeded`; `error.details` berisi `quota`, `limit`, dan `reset_at`), batas organisasi tercapai, atau layanan jawaban sedang sibuk (`answers.engine_busy`). Tunggu selama waktu di header `Retry-After`.
Header respons
Retry-AfterJumlah detik yang perlu ditunggu sebelum Anda mencoba ulang permintaan.
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
Kode error
Kode yang dapat dikembalikan endpoint ini di error.code, selain kode umum yang berlaku untuk setiap permintaan.
Percobaan ulang yang aman
Kirim header Idempotency-Key (misalnya UUID) bersama setiap POST dan PATCH. Percobaan ulang dengan kunci yang sama dalam 24 jam mengembalikan respons yang tersimpan alih-alih menjalankan permintaan lagi.
Batas laju
Respons berisi header RateLimit dan RateLimit-Policy serta header lama X-RateLimit-Limit, X-RateLimit-Remaining, dan X-RateLimit-Reset. Respons 429 berisi Retry-After dalam detik: tunggu, lalu coba lagi.