ReadMe - manage your API documentation hub: docs, categories, changelogs, and API definitions.
Bring your own key. This API needs your own ReadMe API key - get one from the provider, add it once below, and the proxy injects it on every call. Your OmniStream plan covers the unified SDK, key storage, and proxy - the provider's own rate limits still apply to your key.
This is a community listing. If you own this API, you can request ownership.
npm install omnistream-sdkimport { OmniClient } from "omnistream-sdk";
const omni = new OmniClient({ token: process.env.OMNI_KEY! });
// One key reaches every API on the marketplace.
const data = await omni.call("readme/getProject");One install, one key - the same client calls every API on the marketplace.
Get metadata about the current project
Get API specification metadata
Upload an API specification to ReadMe. Or, to use a newer solution see https://docs.readme.com/guides/docs/automatically-sync-api-specification-with-github
Update an API specification in ReadMe
Delete an API specification in ReadMe
Get category
/**
* ReadMeAPI - generated by OmniStream from ReadMe API's OpenAPI spec.
* One typed method per endpoint. A single Omni key reaches the API.
*/
const DEFAULT_BASE = "https://grid.skinvaults.online/v1/proxy/readme";
export class ReadMeAPIError extends Error {
status: number;
code?: string;
constructor(status: number, code: string | undefined, message?: string) {
super(message || `ReadMeAPI error ${status}`);
this.name = "ReadMeAPIError";
this.status = status;
this.code = code;
}
}
export interface ReadMeAPIOptions {
baseUrl?: string;
fetch?: typeof fetch;
timeoutMs?: number;
}
export class ReadMeAPI {
/** @param token Your OmniStream key (one key for every API). */
constructor(private token: string, private opts: ReadMeAPIOptions = {}) {
if (!token) throw new Error("ReadMeAPI: token is required");
}
rateLimit: { remainingMinute?: number; remainingDay?: number } | null = null;
private async _request(method: string, path: string, { params, body }: { params?: Record<string, unknown>; body?: unknown } = {}): Promise<any> {
const f = this.opts.fetch ?? globalThis.fetch;
const url = new URL((this.opts.baseUrl ?? DEFAULT_BASE).replace(/\/+$/, "") + path);
if (params) for (const [k, v] of Object.entries(params)) if (v != null) url.searchParams.set(k, String(v));
const headers: Record<string, string> = { "x-omni-key": this.token };
if (body !== undefined) headers["content-type"] = "application/json";
const res = await f(url, { method, headers, body: body !== undefined ? JSON.stringify(body) : undefined });
this.rateLimit = {
remainingMinute: Number(res.headers.get("x-ratelimit-remaining-minute")) || undefined,
remainingDay: Number(res.headers.get("x-ratelimit-remaining-day")) || undefined,
};
const data = await res.json().catch(() => ({}));
if (!res.ok) throw new ReadMeAPIError(res.status, data?.error?.code, data?.error?.message);
return data.data ?? data;
}
/** Get metadata about the current project */
getProject(): Promise<any> {
return this._request("GET", "/", {});
}
/** Get API specification metadata */
getAPISpecification(params: { "x-readme-version": string; "perPage"?: number; "page"?: number }): Promise<any> {
return this._request("GET", "/api-specification", { params });
}
/** Upload an API specification to ReadMe. Or, to use a newer solution see https://docs.readme.com/guides/docs/automatically-sync-api-specification-with-github */
uploadAPISpecification(params: { "x-readme-version": string }): Promise<any> {
return this._request("POST", "/api-specification", { params });
}
/** Update an API specification in ReadMe */
updateAPISpecification(params: { "id": string }): Promise<any> {
return this._request("PUT", "/api-specification/{id}", { params });
}
/** Delete an API specification in ReadMe */
deleteAPISpecification(params: { "id": string }): Promise<any> {
return this._request("DELETE", "/api-specification/{id}", { params });
}
/** Get category */
getCategory(params: { "slug": string; "x-readme-version": string }): Promise<any> {
return this._request("GET", "/categories/{slug}", { params });
}
/** Get docs for category */
getCategoryDocs(params: { "slug": string; "x-readme-version": string }): Promise<any> {
return this._request("GET", "/categories/{slug}/docs", { params });
}
/** Get changelogs */
getChangelogs(params: { "perPage"?: number; "page"?: number }): Promise<any> {
return this._request("GET", "/changelogs", { params });
}
/** Create changelog */
createChangelog(body: unknown): Promise<any> {
return this._request("POST", "/changelogs", { body });
}
/** Get changelog */
getChangelog(params: { "slug": string }): Promise<any> {
return this._request("GET", "/changelogs/{slug}", { params });
}
/** Update changelog */
updateChangelog(body: unknown, params: { "slug": string }): Promise<any> {
return this._request("PUT", "/changelogs/{slug}", { body, params });
}
/** Delete changelog */
deleteChangelog(params: { "slug": string }): Promise<any> {
return this._request("DELETE", "/changelogs/{slug}", { params });
}
/** Get custom pages */
getCustomPages(params: { "perPage"?: number; "page"?: number }): Promise<any> {
return this._request("GET", "/custompages", { params });
}
/** Create custom page */
createCustomPage(body: unknown): Promise<any> {
return this._request("POST", "/custompages", { body });
}
/** Get custom page */
getCustomPage(params: { "slug": string }): Promise<any> {
return this._request("GET", "/custompages/{slug}", { params });
}
/** Update custom page */
updateCustomPage(body: unknown, params: { "slug": string }): Promise<any> {
return this._request("PUT", "/custompages/{slug}", { body, params });
}
/** Delete custom page */
deleteCustomPage(params: { "slug": string }): Promise<any> {
return this._request("DELETE", "/custompages/{slug}", { params });
}
/** Create doc */
createDoc(body: unknown, params: { "x-readme-version": string }): Promise<any> {
return this._request("POST", "/docs", { body, params });
}
/** Search docs */
searchDocs(params: { "search": string; "x-readme-version": string }): Promise<any> {
return this._request("POST", "/docs/search", { params });
}
/** Get doc */
getDoc(params: { "slug": string; "x-readme-version": string }): Promise<any> {
return this._request("GET", "/docs/{slug}", { params });
}
/** Update doc */
updateDoc(body: unknown, params: { "slug": string; "x-readme-version": string }): Promise<any> {
return this._request("PUT", "/docs/{slug}", { body, params });
}
/** Delete doc */
deleteDoc(params: { "slug": string; "x-readme-version": string }): Promise<any> {
return this._request("DELETE", "/docs/{slug}", { params });
}
/** Get errors */
getErrors(): Promise<any> {
return this._request("GET", "/errors", {});
}
/** Get versions */
getVersions(): Promise<any> {
return this._request("GET", "/version", {});
}
/** Create version */
createVersion(body: unknown): Promise<any> {
return this._request("POST", "/version", { body });
}
/** Get version */
getVersion(params: { "versionId": string }): Promise<any> {
return this._request("GET", "/version/{versionId}", { params });
}
/** Update version */
updateVersion(body: unknown, params: { "versionId": string }): Promise<any> {
return this._request("PUT", "/version/{versionId}", { body, params });
}
/** Delete version */
deleteVersion(params: { "versionId": string }): Promise<any> {
return this._request("DELETE", "/version/{versionId}", { params });
}
}
export default ReadMeAPI;
No reviews yet. Be the first to rate this API.
Yes. ReadMe API uses basic authentication, so you bring your own key from the provider. You store it once on OmniStream and the proxy injects it into every call, so your code only ever sends your Omni key.
ReadMe - manage your API documentation hub: docs, categories, changelogs, and API definitions. It exposes 28 endpoints over GET, POST, PUT, DELETE, including GET /, GET /api-specification, POST /api-specification.
Install the OmniStream SDK for your language and call ReadMe API through it. The client is generated from this API's OpenAPI spec, so parameters and responses are fully typed, and the same client also calls every other API in the marketplace.
You can start on the free plan. OmniStream charges for the unified SDK, key storage and proxy rather than for ReadMe API itself, and ReadMe API's own rate limits still apply to your provider key.
QuickChart: An API to generate charts and QR codes using QuickChart services.
Get docs for category
Get changelogs
Create changelog
Get changelog
Update changelog
Delete changelog
Get custom pages
Create custom page
Get custom page
Update custom page
Delete custom page
Create doc
Search docs
Get doc
Update doc
Delete doc
Get errors
Get versions
Create version
Get version
Update version
Delete version