Quickstart · 5 minutes
Resolve, mint, and submit in five minutes.
- Sandbox
- sandbox.wavestar.space
- Base URL
- api.wavestar.space
- Auth
- Bearer token (sandbox) · mTLS (prod)
- Free tier
- Unlimited sandbox calls
Step 1
Get a sandbox API key
Email devsupport@wavestar.space with a note on what you are building. We issue sandbox keys inside one business hour during working days. The key is prefixed ws_sbx_ and never expires.
Set the key as an environment variable on your machine:
export WAVESTAR_KEY=ws_sbx_your_key_hereStep 2
Make your first call with curl
The registry is the simplest surface. Resolve an existing did:orbit identifier for a known commercial spacecraft — Planet PlanetScope satellite 47428 — and you will see the DID Document with public keys, operator metadata, and service endpoints.
curl -s https://api.wavestar.space/v1/did/resolve/did:orbit:sat:planet:norad-47428You should see a JSON DID Document with the following top-level fields:
- id
did:orbit:sat:planet:norad-47428The canonical identifier.
- verificationMethod
- Array of public keys
Ed25519 and BLS12-381 keys for operational and attestation use.
- service
- Telemetry + attestation endpoints
Where to reach the spacecraft operator for telemetry exchange.
- operator
did:orbit:org:planetThe DID of the operating organisation.
Step 3 · TypeScript
Wrap it in the SDK
Install the TypeScript SDK:
pnpm add @wavestar/sdk
# or
npm install @wavestar/sdkThen resolve, mint, and submit an order:
import { WavestarClient } from "@wavestar/sdk";
const ws = new WavestarClient({
apiKey: process.env.WAVESTAR_KEY!,
environment: "sandbox",
});
// Resolve an existing did:orbit identifier
const planet47428 = await ws.registry.resolve(
"did:orbit:sat:planet:norad-47428",
);
// Mint a new did:orbit for a spacecraft you operate
const did = await ws.registry.mint({
kind: "sat",
operator: "did:orbit:org:your-org",
identifier: "constellation-alpha-001",
});
// Submit a downlink-minutes limit order into the sandbox
const order = await ws.orch.submit({
instrument: "downlink.ka.contact:gs-svalbard-1",
side: "buy",
quantity: "120", // minutes
price: "4.85", // USD per minute
timeInForce: "GTD",
expiresAt: "2026-05-30T00:00:00Z",
});
console.log(order.settlementDID, order.state);Step 3 · Python
Same flow in Python
pip install wavestarfrom wavestar import WavestarClient
import os
ws = WavestarClient(
api_key=os.environ["WAVESTAR_KEY"],
environment="sandbox",
)
planet = ws.registry.resolve("did:orbit:sat:planet:norad-47428")
did = ws.registry.mint(
kind="sat",
operator="did:orbit:org:your-org",
identifier="constellation-alpha-001",
)
order = ws.orch.submit(
instrument="downlink.ka.contact:gs-svalbard-1",
side="buy",
quantity="120",
price="4.85",
time_in_force="GTD",
expires_at="2026-05-30T00:00:00Z",
)
print(order.settlement_did, order.state)Step 3 · Rust
Same flow in Rust
cargo add wavestaruse wavestar::{Client, Environment, OrderSide, TimeInForce};
use rust_decimal_macros::dec;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let ws = Client::builder()
.api_key(std::env::var("WAVESTAR_KEY")?)
.environment(Environment::Sandbox)
.build()?;
let planet = ws
.registry()
.resolve("did:orbit:sat:planet:norad-47428")
.await?;
let did = ws
.registry()
.mint()
.kind("sat")
.operator("did:orbit:org:your-org")
.identifier("constellation-alpha-001")
.send()
.await?;
let order = ws
.orch()
.submit()
.instrument("downlink.ka.contact:gs-svalbard-1")
.side(OrderSide::Buy)
.quantity(dec!(120))
.price(dec!(4.85))
.time_in_force(TimeInForce::Gtd)
.expires_at("2026-05-30T00:00:00Z")
.send()
.await?;
println!("{} {:?}", order.settlement_did, order.state);
Ok(())
}Step 3 · Go
Same flow in Go
go get github.com/wavestar/wavestar-gopackage main
import (
"context"
"fmt"
"os"
wavestar "github.com/wavestar/wavestar-go"
)
func main() {
ctx := context.Background()
ws, err := wavestar.New(wavestar.Config{
APIKey: os.Getenv("WAVESTAR_KEY"),
Environment: wavestar.Sandbox,
})
if err != nil {
panic(err)
}
planet, _ := ws.Registry.Resolve(ctx, "did:orbit:sat:planet:norad-47428")
_ = planet
did, _ := ws.Registry.Mint(ctx, &wavestar.MintRequest{
Kind: "sat",
Operator: "did:orbit:org:your-org",
Identifier: "constellation-alpha-001",
})
_ = did
order, _ := ws.ORCH.Submit(ctx, &wavestar.OrderRequest{
Instrument: "downlink.ka.contact:gs-svalbard-1",
Side: wavestar.Buy,
Quantity: "120",
Price: "4.85",
TimeInForce: wavestar.GTD,
ExpiresAt: "2026-05-30T00:00:00Z",
})
fmt.Println(order.SettlementDID, order.State)
}What to read next
Three good next steps
- 01
Full API reference
Every REST and gRPC endpoint, with request and response schemas. /developers/api - 02
SDK details
Language-specific patterns, retry semantics, and tracing integration. /developers/sdks - 03
Protocol specification
The canonical format for did:orbit, Attest envelopes, and the settlement messages. /developers/spec
Stuck?
Developer support answers inside four hours.
If the quickstart does not work, that is a bug on our side. Email devsupport@wavestar.space with your API key prefix, the endpoint, and the error response. Response inside four business hours.