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.
Tiga perintah
Buat kunci di dasbormu, pastikan ia bekerja, lalu naikkan satu folder ke internet. Kuncinya masuk ke header Authorization di setiap panggilan.
curl -H "Authorization: Bearer hvs_…" https://harvis.dev/api/v1
curl -H "Authorization: Bearer hvs_…" https://harvis.dev/api/v1/sites
curl -X POST https://harvis.dev/api/v1/sites \ -H "Authorization: Bearer hvs_…" \ -F "files=@index.html" -F "paths=index.html"
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.
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
Seluruh permukaannya
Bentuk lengkap permintaan dan tanggapan ada di dokumen OpenAPI.
| metode | path | fungsinya |
|---|---|---|
| GET | /api/v1 | Check that a credential works. |
| GET | /api/v1/keys | The account's API keys. Revoked keys are not listed. |
| POST | /api/v1/keys | Create an API key. |
| DELETE | /api/v1/keys/{keyId} | Revoke an API key. Anything using it stops working immediately. |
| GET | /api/v1/me | The account a credential belongs to. |
| GET | /api/v1/sites | List the account's sites, newest first. |
| POST | /api/v1/sites | Create 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}/deploy | Replace every file of a site with the uploaded set. |
| POST | /api/v1/sites/{id}/deploy-token | Issue a new deploy token for a site. The old one stops working immediately. |
| POST | /api/v1/sites/{id}/deploy/zip | Replace every file of a site from a zip archive sent as the raw request body. |
| GET | /api/v1/sites/{id}/files | Every file a site is serving. |
| POST | /api/v1/sites/{id}/files | Add or overwrite individual files, leaving the rest of the site alone. |
| DELETE | /api/v1/sites/{id}/submissions | Delete every submission for a site, or every one of a single form. |
| GET | /api/v1/sites/{id}/submissions | One 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/csv | Export a site's form submissions as CSV. |
| POST | /api/v1/sites/{id}/submissions/read | Mark every unread submission as read. |
| GET | /api/v1/sites/{id}/submissions/summary | How many submissions a site holds, how many are unread, and which forms exist. |
| POST | /api/v1/sites/import | Create a site by downloading a single page from a known artifact URL. |
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."
}
}