npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@socheli/sdk

v0.1.1

Published

Official TypeScript SDK for the Socheli content engine API.

Readme

@socheli/sdk

The official, zero-dependency, fully typed TypeScript client for the Socheli content engine — the foundation every other Socheli surface builds on.


What it is

@socheli/sdk is the official TypeScript client for the Socheli content engine — the agentic system that turns a single idea into a finished, premium vertical video, end to end.

It is a thin, zero-runtime-dependency wrapper over the Socheli HTTP API (https://api.socheli.com). Just fetch under the hood, so it runs anywhere modern JavaScript runs:

  • Node 18+
  • Bun
  • Deno
  • Edge runtimes (Cloudflare Workers, Vercel Edge, etc.)

Every shape it returns is a stable, lean public DTO — intentionally decoupled from the engine's internal schemas so the public contract stays stable while the internals evolve.

This SDK is the foundation the rest of the Socheli ecosystem builds on — the CLI and MCP server are surfaces over the same client.


Install

npm install @socheli/sdk
# or
pnpm add @socheli/sdk
# or
bun add @socheli/sdk
# or
yarn add @socheli/sdk

It ships as pure ESM ("type": "module") with types bundled — no @types/* package required.


Authentication

Socheli uses a single API key, sent as a Bearer token.

The client reads your key, in order of precedence:

  1. The apiKey option passed to createSocheli({ apiKey }).
  2. The SOCHELI_API_KEY environment variable (used automatically when no apiKey is given and process.env is available).

The base URL is resolved the same way:

  1. The baseUrl option.
  2. The SOCHELI_API_URL environment variable.
  3. Default: https://api.socheli.com.

| Variable | Purpose | Default | | --- | --- | --- | | SOCHELI_API_KEY | Your Socheli API key (sent as Authorization: Bearer <key>) | — | | SOCHELI_API_URL | API base URL | https://api.socheli.com |

Every request is sent to <baseUrl>/v1/... with the header:

Authorization: Bearer <SOCHELI_API_KEY>
export SOCHELI_API_KEY="sk_..."

Quickstart

import { createSocheli } from "@socheli/sdk";

// Reads SOCHELI_API_KEY from the environment when no apiKey is passed.
const socheli = createSocheli({ apiKey: process.env.SOCHELI_API_KEY });

// Is the engine up?
const { ok, version, uptime } = await socheli.health();

// See the render fleet.
const { devices, online } = await socheli.fleet();

// Generate a post from a single seed idea.
const { dispatched, job } = await socheli.generate({
  seed: "why we procrastinate",
  channel: "concept_lab",
});

console.log(dispatched, job.id);

A createSocheli call returns a SocheliClient. The default export is createSocheli itself, so this also works:

import createSocheli from "@socheli/sdk";
const socheli = createSocheli();

Client configuration

createSocheli(opts?: SocheliOptions): SocheliClient

SocheliOptions

| Option | Type | Description | | --- | --- | --- | | apiKey | string | API key sent as a Bearer token. Falls back to SOCHELI_API_KEY. | | baseUrl | string | API base URL. Falls back to SOCHELI_API_URL, then https://api.socheli.com. A trailing slash is stripped automatically. | | fetch | typeof fetch | Custom fetch implementation, for testing or non-standard runtimes. Defaults to the global fetch. |


Reference

All methods are async and return parsed JSON typed per the DTOs below. Requests are issued against <baseUrl>/v1<path>.

client.health()

Returns the engine health probe.

health(): Promise<{ ok: boolean; version: string; uptime: number }>

GET /v1/health


client.items

Read and act on generated content items.

items.list(params?)

List item summaries, newest-relevant first.

items.list(params?: { limit?: number; channel?: string }): Promise<ItemSummary[]>

GET /v1/itemslimit and channel are passed as query parameters when provided.

const items = await socheli.items.list({ channel: "concept_lab", limit: 20 });

items.get(id)

Fetch a single, fully hydrated item by id.

items.get(id: string): Promise<Item>

GET /v1/items/:id

items.publish(id, input?)

Dispatch a publish for an item.

items.publish(id: string, input?: PublishInput): Promise<{ dispatched: boolean }>

POST /v1/items/:id/publish

await socheli.items.publish("itm_123", { public: true, aigc: true });

client.generate(input)

Generate a new post from a seed idea. With type: "auto" the engine also publishes after render; with type: "new" (the default) it builds only.

generate(input: GenerateInput): Promise<{ dispatched: boolean; job: Job }>

POST /v1/generate

const { dispatched, job } = await socheli.generate({
  seed: "the physics of a perfect espresso",
  channel: "concept_lab",
  mood: "cinematic",
  voice: true,
  type: "auto", // build + publish
});

client.jobs()

List job rows (queued, running, and finished work) with live progress.

jobs(): Promise<JobRow[]>

GET /v1/jobs


client.fleet()

Get the current render fleet — devices, their jobs, and how many are online.

fleet(): Promise<FleetState>

GET /v1/fleet

const { devices, jobs, online } = await socheli.fleet();

client.schedule

Read and replace the autopilot posting schedule.

schedule.get()

schedule.get(): Promise<Schedule>

GET /v1/schedule

schedule.set(schedule)

Replace the full schedule.

schedule.set(schedule: Schedule): Promise<Schedule>

PUT /v1/schedule

const current = await socheli.schedule.get();
await socheli.schedule.set({ ...current, enabled: true });

Endpoint summary

| Method | Endpoint | SDK call | | --- | --- | --- | | GET | /v1/health | client.health() | | GET | /v1/items | client.items.list(params?) | | GET | /v1/items/:id | client.items.get(id) | | POST | /v1/items/:id/publish | client.items.publish(id, input?) | | POST | /v1/generate | client.generate(input) | | GET | /v1/jobs | client.jobs() | | GET | /v1/fleet | client.fleet() | | GET | /v1/schedule | client.schedule.get() | | PUT | /v1/schedule | client.schedule.set(schedule) |


Error handling

Any non-2xx response throws a SocheliError. It carries the HTTP status and the parsed response body. The message is the API's error field when present, otherwise "<METHOD> <path> → <status>".

import { createSocheli, SocheliError } from "@socheli/sdk";

const socheli = createSocheli();

try {
  await socheli.items.get("does-not-exist");
} catch (err) {
  if (err instanceof SocheliError) {
    console.error(err.status); // e.g. 404
    console.error(err.body);   // parsed response body
    console.error(err.message);
  }
}
class SocheliError extends Error {
  name: "SocheliError";
  status: number;
  body?: unknown;
}

Types

All types are exported from the package root (export * from "./types").

GenerateInput

interface GenerateInput {
  seed: string;
  channel?: string;
  mood?: string;
  voice?: boolean;
  /** "auto" also publishes after render; "new" builds only. Default "new". */
  type?: "auto" | "new";
}

PublishInput

interface PublishInput {
  public?: boolean;
  /** Declare AI-generated content (defaults true). */
  aigc?: boolean;
}

ItemSummary

interface ItemSummary {
  id: string;
  channel: string;
  status: ItemStatus | string;
  title: string;
  createdAt: string;
  updatedAt: string;
  qa?: number;
  costUsd?: number;
  publish?: PublishEntry[];
}

Item (extends ItemSummary)

interface Item extends ItemSummary {
  idea?: { topic: string; angle: string; format: string };
  script?: { hook: string; narration: string[]; cta: string };
  storyboard?: {
    topic: string;
    format: string;
    scenes: { id: string; type: string; durationSec: number }[];
  };
  pkg?: { title: string; caption: string; hashtags: string[]; altText?: string };
  videoUrl?: string;
}

ItemStatus

type ItemStatus =
  | "idea_proposed"
  | "script_ready"
  | "storyboard_ready"
  | "qa_passed"
  | "qa_failed"
  | "rendered"
  | "packaged"
  | "failed";

PublishEntry

interface PublishEntry {
  platform: string;
  status: string;
  url?: string;
  id?: string;
  at: string;
}

Job & JobRow

type JobType = "auto" | "new" | "ping";

interface Job {
  id: string;
  type: JobType;
  channel?: string;
  seed?: string;
  by?: string;
  createdAt: string;
}

interface JobRow extends Job {
  status: "dispatched" | "running" | "done" | "error";
  device?: string;
  itemId?: string;
  message?: string;
  progress: { at: string; line: string }[];
  updatedAt: string;
}

Device, DeviceProfile & DeviceStatus

type DeviceStatus = "online" | "idle" | "busy" | "offline";

interface DeviceProfile {
  arch: string;
  platform: string;
  cpus: number;
  ramGb: number;
  gpu: string;
}

interface Device {
  device: string;
  status: DeviceStatus;
  host?: string;
  caps?: string[];
  profile?: DeviceProfile;
  currentJob?: string | null;
  lastSeen: string;
}

FleetState

interface FleetState {
  devices: Device[];
  jobs: JobRow[];
  online: number;
}

Schedule

interface Schedule {
  enabled: boolean;
  timezone: string;
  graceMinutes: number;
  channels: {
    channel: string;
    enabled: boolean;
    slots: {
      time: string;
      channel: string;
      mood?: string;
      seed?: string;
      public: boolean;
    }[];
  }[];
}

The Socheli ecosystem

@socheli/sdk is one of four sibling surfaces over the same engine. Use whichever fits your environment:

| Repo | What it is | | --- | --- | | Socheli/api | The HTTP API at api.socheli.com that this SDK talks to. | | Socheli/sdk | This package — the zero-dependency typed TypeScript client. | | Socheli/cli | The socheli command-line tool, built on this SDK. | | Socheli/mcp | The Model Context Protocol server, exposing Socheli to agents. |

Full guides and reference live at the docs site.


Developed in the Socheli monorepo

This package is developed inside the Socheli monorepo (packages/sdk) alongside the engine, API, CLI, and MCP server, then published standalone. The mirrored public repo at github.com/Socheli/sdk tracks the same source.


License

MIT