Skip to main content
Use these vectors to verify your signer matches EchoZero and the official SDK.
Inbound vs outbound: Inbound agent signals sign canonical JSON (sorted keys, known field set). Outbound signal.execution webhooks sign the raw request body string. REST HMAC signs timestamp + METHOD + path + body.

REST HMAC (POST)

Inbound webhook (text + idempotencyKey)

Inbound webhook (structured buy, unknown fields stripped)

Canonical JSON for that vector:

Inbound canonicalization rules

  1. Only signing-eligible keys are included (text, idempotencyKey, and structured fields from the #1098 schema).
  2. Object keys are sorted alphabetically at every nesting level.
  3. Unknown top-level fields are omitted from the canonical form.
  4. Numbers must be finite JSON numbers (no NaN / Infinity).
Match the SDK implementation: inbound_canonical.rs (reference for all languages).

Outbound signal.execution

Verify with the same raw bytes you receive on the wire (do not re-serialize JSON).

Inbound webhook (nested buy with triggers + context)

Nested objects must be sorted at every level (slPrice before tps; targetType before value inside each TP). This is where cross-language signing bugs usually appear.

curl self-test (REST)