http api

Semua yang dilakukan dasbor, dari terminalmu

Satu kunci akun. Daftar situsmu, deploy ke sana, ganti namanya, baca apa yang dikumpulkan formulirmu, hapus — lewat HTTP biasa, dari skrip, job CI, atau seorang agen.

mulai cepat

Tiga perintah

Buat kunci di dasbormu, pastikan ia bekerja, lalu naikkan satu folder ke internet. Kuncinya masuk ke header Authorization di setiap panggilan.

Pastikan kuncinya bekerja
curl -H "Authorization: Bearer hvs_…" https://harvis.dev/api/v1
Lihat isi akunnya
curl -H "Authorization: Bearer hvs_…" https://harvis.dev/api/v1/sites
Terbitkan satu folder
curl -X POST https://harvis.dev/api/v1/sites \
  -H "Authorization: Bearer hvs_…" \
  -F "files=@index.html" -F "paths=index.html"
satu kontrak

Aplikasi web dan API tak bisa berjalan sendiri-sendiri

Setiap kemampuan dideklarasikan sekali, dalam satu file, dan dasbor maupun API ini dibangun dari sana. openapi.json dihasilkan dari deklarasi itu, dan build gagal kalau keduanya tak cocok. Jadi ini bukan dokumentasi yang menggambarkan produk — ini bahan pembentuk produknya.

  • Satu implementasi per kemampuan, dipanggil oleh aplikasi web maupun skripmu.
  • openapi.json dihasilkan otomatis, tak pernah ditulis tangan, dan disajikan di /openapi.json.
  • Build gagal begitu rute, kontrak, dan dokumen tak lagi sepakat.
deploy

Dengan kunci, situsnya langsung jadi milikmu

Deploy tanpa akun tetap bisa dan akan selalu bisa — kamu dapat tautan klaim privat untuk dibuka nanti. Kirim kunci pada panggilan yang sama, dan tak ada yang perlu diklaim: situsnya ada di akunmu sejak byte pertama, dan tak pernah kedaluwarsa.

zip -r site.zip . && curl -X POST https://harvis.dev/api/upload \
  -H "Authorization: Bearer hvs_…" \
  -H "Content-Type: application/zip" --data-binary @site.zip
endpoint

Seluruh permukaannya

Bentuk lengkap permintaan dan tanggapan ada di dokumen OpenAPI.

metodepathfungsinya
GET/api/v1Check that a credential works.
GET/api/v1/keysThe account's API keys. Revoked keys are not listed.
POST/api/v1/keysCreate an API key.
DELETE/api/v1/keys/{keyId}Revoke an API key. Anything using it stops working immediately.
GET/api/v1/meThe account a credential belongs to.
GET/api/v1/sitesList the account's sites, newest first.
POST/api/v1/sitesCreate a site from a folder of files.
DELETE/api/v1/sites/{id}Delete a site, its files and its form submissions.
GET/api/v1/sites/{id}One site.
PATCH/api/v1/sites/{id}Rename a site, change its web address, or both.
POST/api/v1/sites/{id}/deployReplace every file of a site with the uploaded set.
POST/api/v1/sites/{id}/deploy-tokenIssue a new deploy token for a site. The old one stops working immediately.
POST/api/v1/sites/{id}/deploy/zipReplace every file of a site from a zip archive sent as the raw request body.
GET/api/v1/sites/{id}/filesEvery file a site is serving.
POST/api/v1/sites/{id}/filesAdd or overwrite individual files, leaving the rest of the site alone.
DELETE/api/v1/sites/{id}/submissionsDelete every submission for a site, or every one of a single form.
GET/api/v1/sites/{id}/submissionsOne page of a site's form submissions, newest first.
DELETE/api/v1/sites/{id}/submissions/{submissionId}Delete one submission.
GET/api/v1/sites/{id}/submissions/{submissionId}One submission.
GET/api/v1/sites/{id}/submissions/csvExport a site's form submissions as CSV.
POST/api/v1/sites/{id}/submissions/readMark every unread submission as read.
GET/api/v1/sites/{id}/submissions/summaryHow many submissions a site holds, how many are unread, and which forms exist.
POST/api/v1/sites/importCreate a site by downloading a single page from a known artifact URL.
galat

Setiap kegagalan berbentuk sama

Bercabanglah berdasarkan kode, jangan berdasarkan pesan. Kodenya stabil; kalimatnya untuk siapa pun yang membaca log.

{
  "error": {
    "code": "subdomainTaken",
    "message": "That address is already taken. Try another."
  }
}