http api

Tudo o que o painel faz, do seu terminal

Uma chave de conta. Liste seus sites, faça deploy neles, renomeie, leia o que seus formulários coletaram, apague — por HTTP puro, de um script, de um job de CI ou de um agente.

início rápido

Três comandos

Crie uma chave no seu painel, confirme que funciona e coloque uma pasta no ar. A chave vai em um cabeçalho Authorization em toda chamada.

Conferir se a chave funciona
curl -H "Authorization: Bearer hvs_…" https://harvis.dev/api/v1
Ver o que há na conta
curl -H "Authorization: Bearer hvs_…" https://harvis.dev/api/v1/sites
Publicar uma pasta
curl -X POST https://harvis.dev/api/v1/sites \
  -H "Authorization: Bearer hvs_…" \
  -F "files=@index.html" -F "paths=index.html"
um contrato

O app web e a API não podem se desencontrar

Cada recurso é declarado uma vez, em um único arquivo, e tanto o painel quanto esta API são construídos a partir dele. O openapi.json é gerado dessa declaração, e o build falha se os dois discordarem. Então isto não é documentação que descreve o produto — é aquilo de que o produto é feito.

  • Uma implementação por recurso, chamada tanto pelo app web quanto pelo seu script.
  • O openapi.json é gerado, nunca escrito à mão, e servido em /openapi.json.
  • Um build falha assim que uma rota, o contrato e o documento deixam de concordar.
deploys

Com uma chave, o site é seu na hora

Fazer deploy sem conta continua funcionando e sempre vai — você recebe um link de reivindicação privado para abrir depois. Mande uma chave na mesma chamada e não há nada a reivindicar: o site está na sua conta desde o primeiro byte, e nunca expira.

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
endpoints

Toda a superfície

Os formatos completos de requisição e resposta estão no documento OpenAPI.

métodocaminhoo que faz
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.
erros

Toda falha tem o mesmo formato

Decida pelo código, nunca pela mensagem. Os códigos são estáveis; o texto é para quem lê o log.

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