Webhook ingest
Marketplace Addon for Stratum: write arbitrary JSON onto a network over the public ingest gateway. One key is scoped to one network. This is the internet-reachable path for SIEM, ERP, adapters, and custom apps — not the token wallet API.
Marketplace Addon
Webhook ingest is the first public Marketplace Addon documented here. More adapters will appear under Marketplace Addons as they ship. Maturity: Live — see Integration Surfaces.
Requires a dashboard-minted ingest key (cd_ingest_…) with X-Api-Key. Copy the exact webhook URL from Dashboard → API Keys. Machine-readable contract: API reference → Marketplace Addons → Webhook ingest.
Partners should call the ingest URL from the dashboard, not node hostnames.
Endpoint
POST /{networkId} HTTP/1.1
Host: ingest.blockskunk.com
Content-Type: application/json
X-Api-Key: cd_ingest_<your-key>
Idempotency-Key: <optional-unique-id>
- Open Dashboard → Developer → API Keys.
- Select the deployment (network) — the page shows your webhook URL.
- Generate a key (shown once). Prefer
ingest:ping+ingest:write.
Use the exact host from your key card when it differs from ingest.blockskunk.com.
This gateway cannot call wallet issue / transfer / redeem — use the token gateway for those.
Ping
Verify connectivity without writing to the ledger:
curl -sS -X POST "https://ingest.blockskunk.com/<networkId>" \
-H "Content-Type: application/json" \
-H "X-Api-Key: $STRATUM_INGEST_KEY" \
-d '{"type":"ping"}'
{ "transactionIds": [], "summary": { "total": 0, "succeeded": 0, "failed": 0 }, "ping": true }
Write JSON
The gateway normalizes the body into one or more ledger records:
# Single record — id / type / owner are optional
curl -sS -X POST "https://ingest.blockskunk.com/<networkId>" \
-H "Content-Type: application/json" \
-H "X-Api-Key: $STRATUM_INGEST_KEY" \
-H "Idempotency-Key: order-8841" \
-d '{"type":"order","owner":"wallet-a","data":{"sku":"SKU-1","qty":2}}'
# Batch
curl -sS -X POST "https://ingest.blockskunk.com/<networkId>" \
-H "Content-Type: application/json" \
-H "X-Api-Key: $STRATUM_INGEST_KEY" \
-d '{"assets":[{"type":"order","data":{"sku":"A"}},{"type":"order","data":{"sku":"B"}}]}'
# Optional: route to a named shared space on that network
curl -sS -X POST "https://ingest.blockskunk.com/<networkId>" \
-H "Content-Type: application/json" \
-H "X-Api-Key: $STRATUM_INGEST_KEY" \
-d '{"type":"order","data":{"sku":"A"},"targetChannels":["ops-space"]}'
| Field | Behavior |
|---|---|
id | Optional; UUID generated if omitted |
type | Optional record type for queries / allowlists (default unknown) |
owner | Optional string |
data | Optional object; if omitted, other top-level fields become data |
targetChannels | Optional list of shared-space names on that network |
| Bare JSON | Wrapped as { "value": <your JSON> } |
Typical success response:
{
"transactionIds": ["tx_…"],
"summary": { "total": 1, "succeeded": 1, "failed": 0 },
"eventId": "…"
}
eventId deep-links to the deployment Sync Data tab so you can confirm the write landed without re-running curl.
Guardrails
| Guardrail | Behavior |
|---|---|
| Permissions | ingest:ping (no write) / ingest:write (seal records). Legacy keys with no permissions array are allowed everything |
| Type allowlist | If the key has allowedAssetTypes, other type values return 403 |
| PII stripping | password, ssn, social_security_number, credit_card, credit_card_number, cvv stripped from data before ledger write |
| Idempotency | Same Idempotency-Key + same body returns the cached response |
| Limits | ~1 MiB body, ~100 records per batch (defaults) |
| Rate limits | Per-network and per-key; 429 includes Retry-After |
| Method | POST only — other methods return 405 |
Signed-in detail for key format, minting, and revocation: Developer API → Authentication.