APISDK setup

SDK utilities

Typed inputs, pagination, deployment helpers, and HTTP transport.

These utilities support the resource operations documented under API.

Typed inputs and results

Method inputs and results are exported by openship. Derive a specific operation's types when writing a reusable integration:

import type { ProjectOperations } from "openship";

type CreateProjectInput = Parameters<ProjectOperations["create"]>[0];
type Project = Awaited<ReturnType<ProjectOperations["get"]>>;

export async function createProject(input: CreateProjectInput): Promise<Project> {
  return ship.projects.create(input);
}

Do not import internal repository packages. The public package exports the operation types, contracts, and SDK errors. ? in an operation table marks an optional argument.

Pagination

iteratePages() works with named list methods that return { data, total?, page?, perPage? }:

import { iteratePages } from "openship";

for await (const project of iteratePages((page) => ship.projects.list(page), { perPage: 50 })) {
  console.log(project.id, project.name);
}

Pass signal to stop iteration. Methods that return a plain array do not need this helper. Access is checked by the underlying list operation on every page.

Deployment helpers

Use ship.deployment(id) for a handle, or pass an operations object directly:

import { createDeploymentHandle, waitForDeployment, consumeDeploymentEvents } from "openship";

const handle = createDeploymentHandle(ship.deployments, "dep_123");
const status = await handle.status();
console.log(status.deploymentStatus);

export async function waitForRelease(deploymentId: string) {
  return waitForDeployment(ship.deployments, deploymentId, { timeoutMs: 120_000 });
}

export async function printBuildLogs(deploymentId: string, signal: AbortSignal) {
  return consumeDeploymentEvents(ship.deployments.events(deploymentId, { signal }), (event) => {
    if (event.log) process.stdout.write(event.log);
  });
}

createDeploymentHandle() exposes id, get, status, wait, events, cancel, respond, and rollback. It does not own an installation. See deployment outcomes and decisions.

Compose normalization

normalizeComposeServices(document, baseDirectory) converts normalized Compose JSON, such as docker compose config --format json, into the input expected by services.sync().

import { normalizeComposeServices } from "openship";

const services = normalizeComposeServices(
  {
    services: { cache: { image: "redis:7" } },
  },
  "/absolute/path/to/project",
);

await ship.services.sync("proj_123", { services });

It validates unsupported mount, build, and namespace settings. Parse YAML and resolve Compose interpolation before calling this helper. See services.

HTTP transport

Only a remote OpenshipClient exposes http. Use it for documented endpoints without a named SDK method:

import type { OpenshipClient } from "openship";

export async function readImageCatalog(client: OpenshipClient) {
  return client.http.request("/images");
}

http.request<T>(path, init?) parses the JSON response body; T is your assertion, not runtime validation. http.raw(path, init?) returns a Response. http.events(path, options?) reads an SSE stream, and http.url(path) constructs an API URL. These helpers retain the client's URL, credential, and scope restrictions. They do not add native support to an HTTP-only feature.

For error handling, see SDK errors.

On this page