SDK Parity
Measured from the generated comparison fixture.
Generated 2026-05-26
A generated side-by-side view of SDK Parity against Fern, OpenAPI Generator, Kiota, Hey API, Stainless, and Speakeasy. Local providers are run against the same fixture; account-gated providers stay source-backed until credentials are connected.
Measured from the generated comparison fixture.
Generated locally with Fern self-hosted SDK generation for TypeScript, Python, Go, Rust, Java, C#, Ruby, and PHP.
Generated locally with OpenAPI Generator Docker clients for TypeScript Fetch and Python.
Generated locally with Kiota Docker fluent request builders for TypeScript and Python.
Generated locally with Hey API openapi-ts for a TypeScript fetch client.
Account-gated hosted SDK platform with SDKs, docs, CLI, MCP, Terraform, and enterprise controls in public docs.
Account-gated SDK and MCP platform with language generators, contract tests, managed workflows, and AI control-plane products in public docs.
Feature matrix
Scroll to compare.
Local provider numbers are generated from the comparison fixture in this build.
Stainless and Speakeasy are source-backed account-gated integrations, not local artifact runs in this repo.
Benchmark values are generation-time and footprint evidence, not live API latency claims.
Scroll to compare.
SDK code shape
Language
Compare against
SDK Parity baseline
Generated TypeScript client
export class SDKParityClient {
readonly apiKey: string | null;
readonly username: string | null;
readonly password: string | null;
readonly oauthClientId: string | null;
readonly oauthClientSecret: string | null;
readonly oauthTokenUrl: string | null;
readonly oauthScopes: string[];
readonly baseURL: string;
readonly timeoutMs: number;
readonly maxRetries: number;
readonly retryBackoff: Required<RetryBackoffConfig>;
readonly defaultHeaders: Record<string, string | undefined>;
readonly idempotency: Required<IdempotencyConfig> | false;
readonly strictRequestValidation: boolean;
readonly strictResponseValidation: boolean;
readonly hooks: SDKEventHooks;
private readonly accessTokenProvider?: () => string | Promise<string>;
private readonly fetchImpl: typeof globalThis.fetch;
private readonly limiter?: RateLimiter;
private readonly operationLimiters = new Map<string, RateLimiter>();
private oauthToken?: { accessToken: string; expiresAt: number };
readonly artifacts: ArtifactsResource;
readonly codeMode: CodeModeResource;
readonly configs: ConfigsResource;
readonly docs: DocsResource;
readonly jobs: GeneratorJobsResource;
readonly mcp: McpResource;
readonly migration: MigrationResource;
readonly openapi: OpenapiResource;
readonly previewBuilds: PreviewBuildsResource;
readonly releaseWorkflows: ReleaseWorkflowsResource;
constructor(options: ClientOptions = {}) {
const apiKey = options.apiKey ?? readEnv("SDKPARITY_API_KEY") ?? null;
const username = options.username ?? readEnv("SDKPARITY_USERNAME") ?? null;
const password = options.password ?? readEnv("SDKPARITY_PASSWORD") ?? null;
const oauthClientId = options.oauthClientId ?? readEnv("SDKPARITY_OAUTH_CLIENT_ID") ?? null;
const oauthClientSecret = options.oauthClientSecret ?? readEnv("SDKPARITY_OAUTH_CLIENT_SECRET") ?? null;
if (!options.dangerouslyAllowBrowser && isBrowser() && (apiKey || options.accessTokenProvider || username || password || oauthClientId || oauthClientSecret)) {
throw new APIError('Refusing to run with secret credentials in a browser. Pass dangerouslyAllowBrowser only if your credential model is safe for browsers.');
}
if (!apiKey && !options.accessTokenProvider && (!oauthClientId || !oauthClientSecret)) throw new APIError('Missing credentials. Pass apiKey, accessTokenProvider, OAuth client credentials, or set SDKPARITY_API_KEY.');
this.apiKey = apiKey;
this.username = username;
this.password = password;
this.oauthClientId = oauthClientId;
this.oauthClientSecret = oauthClientSecret;
this.oauthTokenUrl = options.oauthTokenUrl ?? null;
this.oauthScopes = options.oauthScopes ?? [];
this.baseURL = stripTrailingSlash(options.baseURL ?? environmentURL(options.environment) ?? "https://api.sdkparity.example/v1");
this.timeoutMs = options.timeoutMs ?? 60000;
this.maxRetries = options.maxRetries ?? 2;
this.retryBackoff = resolveRetryBackoff(options.retryBackoff, {"initialDelayMs":500,"maxDelayMs":8000,"maxElapsedMs":60000,"multiplier":2,"jitter":0.25});
this.defaultHeaders = options.defaultHeaders ?? {};
this.fetchImpl = options.fetch ?? globalThis.fetch;
this.accessTokenProvider = options.accessTokenProvider;
this.strictRequestValidation = options.strictRequestValidation ?? false;
this.strictResponseValidation = options.strictResponseValidation ?? false;
this.hooks = options.hooks ?? {};
this.idempotency =
options.idempotency === false
? falseProvider comparison
Generated TypeScript client
// This file was auto-generated by Fern from our API Definition.
import { ArtifactsClient } from "./api/resources/artifacts/client/Client.js";
import { CodeModeClient } from "./api/resources/codeMode/client/Client.js";
import { ConfigsClient } from "./api/resources/configs/client/Client.js";
import { DocsClient } from "./api/resources/docs/client/Client.js";
import { GeneratorJobsClient } from "./api/resources/generatorJobs/client/Client.js";
import { McpClient } from "./api/resources/mcp/client/Client.js";
import { MigrationClient } from "./api/resources/migration/client/Client.js";
import { OpenapiClient } from "./api/resources/openapi/client/Client.js";
import { PreviewBuildsClient } from "./api/resources/previewBuilds/client/Client.js";
import { ReleaseWorkflowsClient } from "./api/resources/releaseWorkflows/client/Client.js";
import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js";
import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js";
import * as core from "./core/index.js";
export declare namespace SdkparityApiClient {
export type Options = BaseClientOptions;
export interface RequestOptions extends BaseRequestOptions {}
}
export class SdkparityApiClient {
protected readonly _options: NormalizedClientOptionsWithAuth<SdkparityApiClient.Options>;
protected _configs: ConfigsClient | undefined;
protected _openapi: OpenapiClient | undefined;
protected _generatorJobs: GeneratorJobsClient | undefined;
protected _previewBuilds: PreviewBuildsClient | undefined;
protected _artifacts: ArtifactsClient | undefined;
protected _docs: DocsClient | undefined;
protected _mcp: McpClient | undefined;
protected _codeMode: CodeModeClient | undefined;
protected _migration: MigrationClient | undefined;
protected _releaseWorkflows: ReleaseWorkflowsClient | undefined;
constructor(options: SdkparityApiClient.Options) {
this._options = normalizeClientOptionsWithAuth(options);
}
public get configs(): ConfigsClient {
return (this._configs ??= new ConfigsClient(this._options));
}
public get openapi(): OpenapiClient {
return (this._openapi ??= new OpenapiClient(this._options));
}
public get generatorJobs(): GeneratorJobsClient {
return (this._generatorJobs ??= new GeneratorJobsClient(this._options));
}
public get previewBuilds(): PreviewBuildsClient {
return (this._previewBuilds ??= new PreviewBuildsClient(this._options));
}
public get artifacts(): ArtifactsClient {
return (this._artifacts ??= new ArtifactsClient(this._options));
}
public get docs(): DocsClient {
return (this._docs ??= new DocsClient(this._options));
}
public get mcp(): McpClient {