Skip to content
Pre-Launch · Filing seed · Series A — Q4 2026

Quickstart · 5 minutes

Resolve, mint, and submit in five minutes.

Five-minute tour of the Wavestar API. You will resolve an existing did:orbit identifier, mint a new one against the sandbox, and submit a sandbox downlink-minutes order. No clearing-member status required to run this in sandbox.
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

Sandbox keys are instant and free. No clearing-member agreement required. Production keys require clearing-member status and are issued after KYC and onboarding.

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:

bash
export WAVESTAR_KEY=ws_sbx_your_key_here

Step 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.

bash
curl -s https://api.wavestar.space/v1/did/resolve/did:orbit:sat:planet:norad-47428

You should see a JSON DID Document with the following top-level fields:

id
did:orbit:sat:planet:norad-47428

The 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:planet

The DID of the operating organisation.

Step 3 · TypeScript

Wrap it in the SDK

Install the TypeScript SDK:

bash
pnpm add @wavestar/sdk
# or
npm install @wavestar/sdk

Then resolve, mint, and submit an order:

typescript
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

bash
pip install wavestar
python
from 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

bash
cargo add wavestar
rust
use 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

bash
go get github.com/wavestar/wavestar-go
go
package 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.