HydraCore
API by router

Bootstrap

Download Artifact

GET
/internal/bootstrap/artifacts/{instance_id}

Path Parameters

instance_id*Instance Id
Formatuuid

Header Parameters

x-download-token?string|null

Response Body

Successful Response

response?unknownapplication/json
Example Request
curl -X GET 'https://example.com/internal/bootstrap/artifacts/497f6eca-6276-4993-bfeb-53cbbbba6f08'
Example Response
null

Download Website Bundle

GET
/internal/bootstrap/artifacts/{instance_id}/website

Path Parameters

instance_id*Instance Id
Formatuuid

Header Parameters

x-download-token?string|null

Response Body

Successful Response

response?unknownapplication/json
Example Request
curl -X GET 'https://example.com/internal/bootstrap/artifacts/497f6eca-6276-4993-bfeb-53cbbbba6f08/website'
Example Response
null

Receive Callback

POST
/internal/bootstrap/callback

Header Parameters

authorization?string|null

Request Body

application/json
  1. body
message?|null
seq*Seq
Range1 <= value <= 4
stage*Stage
Match^(installing|configuring|securing|ready|error)$

Response Body

Successful Response

application/json
  1. response
message*Message
status*Status
Example Request
curl -X POST 'https://example.com/internal/bootstrap/callback' \  -H 'Content-Type: application/json' \  -d '{  "seq": 1,  "stage": "string"}'
Example Response
{  "message": "string",  "status": "string"}

Issue Certificate

POST
/internal/bootstrap/cert

Request Body

application/json
  1. body
bootstrap_token*Bootstrap Token
Match^[0-9a-f]{64}$
Length64 <= length <= 64
csr_pem*Csr Pem
Length100 <= length <= 10000

Response Body

Successful Response

application/json
  1. response
cert_pem*Cert Pem
session_id*Session Id
Example Request
curl -X POST 'https://example.com/internal/bootstrap/cert' \  -H 'Content-Type: application/json' \  -d '{  "bootstrap_token": "stringstringstringstringstringstringstringstringstringstringstri",  "csr_pem": "stringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstringstri"}'
Example Response
{  "cert_pem": "string",  "session_id": "string"}

Receive Diagnostic

POST
/internal/bootstrap/diagnostic

Header Parameters

authorization?string|null

Request Body

application/json
  1. body

Free-form diagnostic breadcrumb from bootstrap-agent.sh.

Distinct from CallbackRequest: this endpoint does NOT enforce monotonic sequencing or the installing→configuring→securing→ ready stage progression. Bootstrap-agent uses it to ship arbitrary trace messages ("hermes:install_sh:start", "hermes:tail:<200 chars of stderr>") that land in provision_logs without poisoning the strict callback state machine. Same JWT auth as /callback.

label*Label
Length1 <= length <= 80
level?Level
Match^(info|warn|error)$
Default"info"
message*Message
Lengthlength <= 2000

Response Body

Successful Response

application/json
  1. response
message*Message
status*Status
Example Request
curl -X POST 'https://example.com/internal/bootstrap/diagnostic' \  -H 'Content-Type: application/json' \  -d '{  "label": "string",  "message": "string"}'
Example Response
{  "message": "string",  "status": "string"}

Receive Early Diagnostic

POST
/internal/bootstrap/early-diagnostic

Request Body

application/json
  1. body

Pre-mTLS diagnostic breadcrumb from bootstrap-agent.sh.

Auths via the per-instance bootstrap_token (already in the script's env from cloud-init Jinja templating, valid before Phase 1 cert exchange). This is the only way to get a phase-by- phase trace from bootstrap-agent before mTLS is established — every regular /callback or /diagnostic request requires the callback_jwt that's only minted at Phase 2.

Kept narrow: log message body only, no other side effects. The bootstrap_token is one-shot and consumed at /secrets, but multiple early-diagnostic calls before /secrets are fine because we only USE the token for hash compare, not consume.

bootstrap_token*Bootstrap Token
Length10 <= length <= 200
instance_id*Instance Id
Length1 <= length <= 80
label*Label
Length1 <= length <= 80
level?Level
Match^(info|warn|error)$
Default"info"
message*Message
Lengthlength <= 2000

Response Body

Successful Response

application/json
  1. response
message*Message
status*Status
Example Request
curl -X POST 'https://example.com/internal/bootstrap/early-diagnostic' \  -H 'Content-Type: application/json' \  -d '{  "bootstrap_token": "stringstri",  "instance_id": "string",  "label": "string",  "message": "string"}'
Example Response
{  "message": "string",  "status": "string"}

Get Secrets

POST
/internal/bootstrap/secrets

Request Body

application/json
  1. body
session_id*Session Id

Response Body

Successful Response

application/json
  1. response
agent_config*
agent_secrets*
artifact_cipher_hash*Artifact Cipher Hash
artifact_download_token*Artifact Download Token
bundle_plain_hash*Bundle Plain Hash
callback_jwt*Callback Jwt
decryption_key_hex*Decryption Key Hex
skill_lockfile*
Example Request
curl -X POST 'https://example.com/internal/bootstrap/secrets' \  -H 'Content-Type: application/json' \  -d '{  "session_id": "string"}'
Example Response
{  "agent_config": {},  "agent_secrets": {},  "artifact_cipher_hash": "string",  "artifact_download_token": "string",  "bundle_plain_hash": "string",  "callback_jwt": "string",  "decryption_key_hex": "string",  "skill_lockfile": {}}