Orchestration API

TypeScript Type Generation

Generate TypeScript types for the M0 Orchestration API directly from the OpenAPI specification.

Quick Start

npx openapi-typescript https://orchestration-api.m0.xyz/openapi.json -o ./m0-swap.d.ts

This generates a type definition file with full type coverage for all API endpoints, request parameters, and response objects.

Generated Types

The generated file exports types organized by OpenAPI structure:

import type { components, operations } from "./m0-swap";

// Schema types (most commonly used)
type Asset = components["schemas"]["Asset"];
type Quote = components["schemas"]["Quote"];
type Order = components["schemas"]["Order"];
type OrdersResponse = components["schemas"]["OrdersResponse"];
type OrderStatus = components["schemas"]["OrderStatus"];
type Route = components["schemas"]["Route"];
type Chain = components["schemas"]["Chain"];
type Payload = components["schemas"]["Payload"];
type EvmPayload = components["schemas"]["EvmPayload"];
type SvmPayload = components["schemas"]["SvmPayload"];

// Operation types (for request/response typing)
type QuoteRequest =
  operations["quote_quote"]["requestBody"]["content"]["application/json"];
type QuoteResponse =
  operations["quote_quote"]["responses"]["200"]["content"]["application/json"];

Usage with fetch

Create a typed wrapper for API calls:

import type { components } from "./m0-swap";

type Quote = components["schemas"]["Quote"];
type Asset = components["schemas"]["Asset"];
type Order = components["schemas"]["Order"];
type OrdersResponse = components["schemas"]["OrdersResponse"];

const API_BASE = "https://orchestration-api.m0.xyz";

export async function getQuotes(params: {
  route: {
    source: { chain: string; address: string };
    destination: { chain: string; address: string };
  };
  amountIn: string;
  sender: string;
  recipient?: string;
}): Promise<Quote[]> {
  const response = await fetch(`${API_BASE}/quote`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(params),
  });
  return response.json();
}

export async function getSupportedAssets(): Promise<Asset[]> {
  const response = await fetch(`${API_BASE}/supported-assets`);
  return response.json();
}

export async function getOrders(params?: {
  sender?: string;
  status?: "CREATED" | "COMPLETED" | "CANCELLED";
  originChainId?: number;
  destChainId?: number;
  limit?: number;
  offset?: number;
}): Promise<OrdersResponse> {
  const query = new URLSearchParams();
  if (params?.sender) query.set("sender", params.sender);
  if (params?.status) query.set("status", params.status);
  if (params?.originChainId !== undefined)
    query.set("originChainId", String(params.originChainId));
  if (params?.destChainId !== undefined)
    query.set("destChainId", String(params.destChainId));
  if (params?.limit !== undefined) query.set("limit", String(params.limit));
  if (params?.offset !== undefined) query.set("offset", String(params.offset));

  const queryString = query.toString();
  const url = queryString
    ? `${API_BASE}/orders?${queryString}`
    : `${API_BASE}/orders`;

  const response = await fetch(url);
  return response.json();
}

export async function getOrderStatus(orderId: string): Promise<Order> {
  const response = await fetch(`${API_BASE}/order-status/${orderId}`);
  return response.json();
}

Type Aliases

For convenience, create a types file that re-exports commonly used types:

// types/m0-swap.ts
import type { components } from "./m0-swap.d.ts";

export type Asset = components["schemas"]["Asset"];
export type Quote = components["schemas"]["Quote"];
export type Order = components["schemas"]["Order"];
export type OrdersResponse = components["schemas"]["OrdersResponse"];
export type OrderStatus = components["schemas"]["OrderStatus"];
export type Route = components["schemas"]["Route"];
export type AssetAddress = components["schemas"]["AssetAddress"];
export type Payload = components["schemas"]["Payload"];
export type EvmPayload = components["schemas"]["EvmPayload"];
export type SvmPayload = components["schemas"]["SvmPayload"];
export type Chain = components["schemas"]["Chain"];
export type ChainRuntime = components["schemas"]["ChainRuntime"];
export type Providers = components["schemas"]["Providers"];
export type QuoteType = components["schemas"]["QuoteType"];

Then import from your alias file:

import type { Quote, Asset, EvmPayload } from "./types/m0-swap";

Keeping Types Updated

Regenerate types when the API changes:

# Add to package.json scripts
{
  "scripts": {
    "generate:types": "openapi-typescript https://orchestration-api.m0.xyz/openapi.json -o ./src/types/m0-swap.d.ts"
  }
}
pnpm generate:types

openapi-typescript Options

Common options for customization:

# Output to specific directory
npx openapi-typescript https://orchestration-api.m0.xyz/openapi.json -o ./src/types/api.d.ts

# Generate with immutable types (readonly)
npx openapi-typescript https://orchestration-api.m0.xyz/openapi.json -o ./api.d.ts --immutable

# Export types (for re-exporting)
npx openapi-typescript https://orchestration-api.m0.xyz/openapi.json -o ./api.d.ts --export-type

See the openapi-typescript documentation for more options.

API Reference

For interactive schema exploration and testing, visit the API Reference.

Copyright © M0 Foundation 2026