http api

Усе, що вміє дашборд, з вашого термінала

Один ключ облікового запису. Переглядайте свої сайти, деплойте на них, перейменовуйте, читайте те, що зібрали ваші форми, видаляйте їх — звичайним HTTP, зі скрипта, з CI-завдання чи від агента.

швидкий старт

Три команди

Створіть ключ у дашборді, перевірте, що він працює, і викладіть теку в мережу. Ключ іде в заголовку Authorization у кожному виклику.

Перевірити, що ключ працює
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"
один контракт

Вебзастосунок і API не можуть розійтися

Кожну можливість оголошено один раз, в одному файлі, і з нього збирають і дашборд, і цей API. openapi.json генерується з того оголошення, і збірка падає, якщо вони розходяться. Тож це не документація, що описує продукт, — це те, з чого продукт зроблено.

  • Одна реалізація на можливість, яку однаково викликають вебзастосунок і ваш скрипт.
  • openapi.json генерується, ніколи не пишеться руками, і віддається за адресою /openapi.json.
  • Збірка падає, щойно маршрут, контракт і документ перестають узгоджуватися.
деплої

З ключем сайт ваш одразу

Деплой без облікового запису працює й працюватиме далі — ви отримуєте приватне посилання для привласнення, яке відкриваєте пізніше. Надішліть ключ у тому ж виклику — і привласнювати нічого: сайт в обліковому записі з першого байта й ніколи не зникає.

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
ендпоїнти

Уся поверхня

Повні форми запитів і відповідей — у документі OpenAPI.

методшляхщо робить
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.
помилки

Кожна помилка має однакову форму

Розгалужуйтеся за кодом, ніколи за повідомленням. Коди стабільні; текст — для того, хто читає лог.

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