Skip to main content
The Fabro API is defined by an OpenAPI 3.1 specification (docs/public/api-reference/fabro-api.yaml in the repository) that serves as the single source of truth for all endpoints, request/response schemas, and parameter definitions. The spec is also available at runtime from the server at GET /api/v1/openapi.json. Both client SDKs below are generated directly from this spec.

TypeScript (Axios)

The @qltysh/fabro-api-client package is a fully typed HTTP client generated with the OpenAPI Generator using the typescript-axios template. It produces typed API classes (one per tag) and model interfaces for every schema.

Regenerating

From the repository root:
cd lib/packages/fabro-api-client
bun run generate
This runs openapi-generator-cli against docs/public/api-reference/fabro-api.yaml and writes the generated source into lib/packages/fabro-api-client/src/.

Usage

import { RunsApi, Configuration } from "@qltysh/fabro-api-client";

const config = new Configuration({ basePath: "http://localhost:3000" });
const runs = new RunsApi(config);

const { data } = await runs.listRuns();
console.log(data);
The generated client includes a typed API class for each endpoint group: RunsApi, WorkflowsApi, SessionsApi, VerificationsApi, InsightsApi, and others.

Rust (Types + Client)

The fabro-api crate generates Rust structs, enums, and a reqwest-based HTTP client from the full OpenAPI spec at compile time using progenitor. This provides type-safe representations of all API models and a builder-style client for every endpoint.

How It Works

A build.rs script reads docs/public/api-reference/fabro-api.yaml, patches it from OpenAPI 3.1 to 3.0 for progenitor compatibility, and generates both types and a client. The generated code is written to OUT_DIR and included via:
// lib/crates/fabro-api/src/lib.rs
include!(concat!(env!("OUT_DIR"), "/codegen.rs"));

Regenerating

The types and client are regenerated automatically on every cargo build when the OpenAPI spec changes:
cargo build -p fabro-api

Usage

use fabro_api::types::RunListItem;
use fabro_api::Client;

let client = Client::new("http://localhost:3000");
All generated types derive serde::Deserialize and serde::Serialize. The client uses builder-style methods for each endpoint.