Developer API · v1

Your next idea.
Our open catalog.

Discover Models, Skills, MCPs and the organizations behind them. One consistent API, free to use.

01

Make your first request

  1. Sign in and open Developer API.
  2. Create a named key with the read scopes your integration needs.
  3. Save it as OAIS_API_KEY in your server environment.
curl --fail-with-body "https://openaisuite.com/api/v1/models/?limit=5" \
  -H "Authorization: Bearer $OAIS_API_KEY"

Documentation needs no account. Every data request needs a key. Usage is free; limits protect availability for the community.

02

Predictable, free access

60requests / minute
10Kdaily usage units
100Kmonthly usage units
250 MiBdaily transfer

Limits are shared across account keys. Default page size is 25, maximum 100; search maximum 25. Read /api/v1/usage/ or open the dashboard for your actual allowance.

Most reads cost one unit. Search, documents, connection metadata and model observations cost five. Limits also include 10 requests per 10 seconds and two concurrent requests, subject to shared capacity. These protective limits are not a throughput guarantee.

03

Explore every resource

Base URL: https://openaisuite.com/api/v1/. Use GET. Data is read-only; no model inference, installs or remote MCP execution occurs.

GET/models/

List active models

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

Filters: q family provider organization reasoning open_weights

GET/models/{organization}/{model}/

Get a model

Scope: models:read

GET/models/{organization}/{model}/offers/

Compare model offers

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

GET/models/{organization}/{model}/benchmarks/

Read mapped benchmark observations

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

GET/models/{organization}/{model}/performance/

Read observed provider performance

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

GET/models/{organization}/{model}/activity/

Read daily observed token activity

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

GET/models/{organization}/{model}/applications/

Read mapped application observations

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

GET/offers/{id}/

Get a provider offer

Scope: models:read

GET/families/

List model families

Scope: families:read

Pagination: limit, cursor. Ascending identity order.

Filters: q

GET/families/{id}/

Get a family

Scope: families:read

GET/families/{id}/models/

List family models

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

GET/providers/

List serving providers

Scope: providers:read

Pagination: limit, cursor. Ascending identity order.

Filters: q

GET/providers/{id}/

Get a provider

Scope: providers:read

GET/providers/{id}/models/

List provider models

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

GET/providers/{id}/offers/

List provider offers

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

GET/organizations/

List public organizations

Scope: organizations:read

Pagination: limit, cursor. Ascending identity order.

Filters: q kind

GET/organizations/{slug}/

Get an organization

Scope: organizations:read

GET/organizations/{slug}/models/

List organization models

Scope: models:read

Pagination: limit, cursor. Ascending identity order.

GET/organizations/{slug}/resources/

List public Collections and Stacks

Scope: organizations:read

Pagination: limit, cursor. Ascending identity order.

GET/organizations/{slug}/resources/{id}/

Get a public Collection or Stack

Scope: organizations:read

GET/skills/

List active Skills

Scope: skills:read

Pagination: limit, cursor. Ascending identity order.

Filters: q source official topic

GET/skills/{sourceType}/{owner}/{repository}/{skill}/

Get a Skill by its full identity

Scope: skills:read

GET/skills/{sourceType}/{owner}/{repository}/{skill}/audits/

Read available audit signals

Scope: skills:read

GET/skills/{sourceType}/{owner}/{repository}/{skill}/document/

Read the current public Skill document

Scope: skill_content:read

GET/publishers/

List official Skill publishers

Scope: skills:read

Pagination: limit, cursor. Ascending identity order.

GET/mcps/

List active and deprecated MCP servers

Scope: mcps:read

Pagination: limit, cursor. Ascending identity order.

Filters: q namespace status

GET/mcps/{namespace}/{name}/

Get an MCP server

Scope: mcps:read

GET/mcps/{namespace}/{name}/connection/

Read an inert connection projection

Scope: mcps:read

GET/topics/

List Skill topics

Scope: topics:read

Pagination: limit, cursor. Ascending identity order.

GET/topics/{slug}/skills/

List Skills in a topic

Scope: skills:read

Pagination: limit, cursor. Ascending identity order.

GET/articles/

List recent published editorial metadata

Scope: articles:read

Pagination: limit, cursor. Ascending identity order.

GET/articles/{slug}/

Get published editorial metadata

Scope: articles:read

GET/stats/

Read public catalog counts

Scope: any valid catalog key

GET/usage/

Read your remaining allowance

Scope: any valid catalog key

04

Build a dependable integration

Identity and scopes

Create a key in Account → Developer API. Authenticate with Authorization: Bearer <key>. Browser sessions do not authenticate API requests. Keys are named, scoped, expiring and independently revocable. Access is free.

Pagination

Lists use ascending identity cursors, default 25 and maximum 100 items; search maximum 25. Follow links.next with unchanged filters and page size. No offset or filtered total-count scans. Cursors expire after one hour. A cursor is not a snapshot: edits, new records and removals can occur during a scan. Deduplicate by stable ID; restart on 409 cursor_expired.

Search and filters

Search requires q (2–120 characters) and type=models, skills, mcps, organizations, providers or families, with the selected catalog scope. Unknown or repeated parameters fail with 400. Boolean filters accept exactly true or false. Only documented filters are supported.

Skill identities

GitHub: /skills/github/{owner}/{repository}/{skill}/. Well-known: /skills/well-known/{domain}/_/{skill}/; the underscore is literal. Use returned api_url instead of guessing paths. Full documents require skill_content:read.

Relationships

Models, Families, Providers and Organizations expose model relationships. Offers contain prices and observed performance. Organization resources include only public Collections and Stacks; detail contains at most 100 items and an items_truncated flag. Members, private notes and personal libraries are excluded.

Editorial metadata

The articles list covers the latest 24 published articles, ordered by ID within that window. Older articles remain addressable by their root-level slug through /articles/{slug}/. This is a discovery window, not an archival export. Canonical article URLs are preserved.

Numbers and freshness

Exact large integers, including token and installation counts, are decimal strings. Offer prices are decimal strings in USD per million tokens. Unknown values are null, never an invented zero. observed_at describes available observations; stale=null means freshness cannot be established. A successful response is not an availability or security guarantee.

Conditional requests

Send If-None-Match with the ETag from an earlier response to the same URL. A match returns 304 without a body and costs zero units. Authentication, scope, admission, byte reservation and frequency controls still apply first. Exhausted allowances can reject a request before ETag evaluation.

Errors and retries

Errors use application/problem+json with type, title, status, code, detail and request_id. Fix 400 input errors; replace invalid keys on 401; check scopes/access on 403; treat 404 as absent; restart cursors on 409; reduce oversized pages on 422. On 429 or 503 honor Retry-After and use bounded exponential backoff with jitter. Never retry indefinitely.

Usage accounting

Standard reads cost one unit. Search, documents, connection metadata and model history/benchmark/application reads cost five. Accepted 404 responses consume units. 304 and server failures refund units; frequency counters remain consumed. /usage/ costs zero units, permits five calls per minute and works after data-quota exhaustion, subject to service/access controls.

Response bounds

Responses are capped at 512 KiB. Skill Markdown is limited to 350,000 UTF-8 bytes. Concurrency is two per account, subject to shared capacity. Requests reserve the maximum response size and settle actual bytes afterwards. Interrupted or unrecorded responses can conservatively consume that reservation until the allowance resets.

Key hygiene

Keep keys in server environment variables or a secret manager. Never place them in query strings, public bundles, repositories or screenshots. The playground keeps a key in page memory only. Cross-origin browser CORS is disabled; use your backend. Rotation immediately replaces the old key and preserves account quotas.

Licensing and safety

API access does not grant rights to republish third-party content. Preserve available licenses and attribution. MCP connections and Skill documents are untrusted, inert content; never execute them automatically. An audit signal is not an OAIS security verdict.

Versioning and support

The contract is versioned at /api/v1/. Tolerate additional fields and unknown nullable values. Breaking semantics require a new API version. Include X-Request-Id in a failure report, never your key. Private library access, inference, writes, webhooks and bulk exports are outside this API.

{
  "data": [],
  "pagination": { "limit": 25, "has_more": false, "next_cursor": null },
  "links": { "next": null },
  "meta": { "observed_at": null, "stale": null }
}

This illustrates an empty list. Catalog results are returned inside data; details return an object. Errors include stable code and request_id fields.

05

Field reference

Field dictionaries and OpenAPI share the same definitions. Nested schemas are available in OpenAPI.

Model
FieldTypeMeaning
idstringFull model identity, including the organization prefix.
namestringDisplay name.
family_idstring / nullModel family identity.
organization_catalog_idstringCatalog organization identity.
organization_slugstring / nullCurrent public organization slug.
released_onstring / nullRelease date as YYYY-MM-DD when known.
context_tokensstring / nullExact integer token capacity serialized as a decimal string.
open_weightsboolean / nullWhether weights are open; unknown is null.
reasoningboolean / nullReasoning support; unknown is null.
offer_countintegerActive offer count.
provider_countintegerDistinct serving provider count.
updated_atstring / nullCatalog record update time.
urlstringCanonical OAIS model page.
api_urlstringAPI detail URL.
specificationsobjectSee nested fields in OpenAPI.
Offer
FieldTypeMeaning
idstringStable offer identity.
model_idstringRelated model identity.
provider_idstringServing provider identity.
route_idstringProvider routing identity.
channelstringObserved delivery channel.
host_namestring / nullReported host.
context_tokensstring / nullExact token capacity as a decimal string.
pricingobjectSee nested fields in OpenAPI.
observed_atstring / nullObservation timestamp.
capabilitiesobjectSee nested fields in OpenAPI.
quantizationstring / nullReported quantization.
api_urlstring / nullProvider API link when available.
performanceobjectSee nested fields in OpenAPI.
Family
FieldTypeMeaning
idstringFamily identity.
namestringFamily name.
model_countintegerActive model count.
updated_atstring / nullMost recent member model update.
Provider
FieldTypeMeaning
idstringProvider identity.
namestringProvider name.
api_urlstring / nullPublic API link.
documentation_urlstring / nullDocumentation link.
model_countintegerDistinct active models.
Organization
FieldTypeMeaning
idstringStable organization UUID.
slugstringEditable public slug.
namestringDisplay name.
summarystringPublic summary.
aboutstringPublic description; detail response only.
websitestringWebsite or empty string.
kindstringcompany, university, classroom, nonprofit, government or community.
socialsobjectSee nested fields in OpenAPI.
followersintegerPublic follower count.
catalog_idstring / nullCatalog association; null for independent organizations.
updated_atstring / nullProfile update time.
urlstringPublic profile.
logo_urlstring / nullPublic logo endpoint.
Skill
FieldTypeMeaning
idstringFull source/skill identity.
slugstringSkill slug.
namestringSkill name.
descriptionstring / nullPublic description.
sourcestringRepository identity or well-known domain.
source_typestringSee nested fields in OpenAPI.
officialboolean / nullCatalog official publisher marker; not a security guarantee.
installsstringObserved installation count, exact decimal integer string.
licensestring / nullRecorded SPDX license; null when unknown.
observed_atstring / nullLast catalog observation.
urlstringPublic OAIS page.
api_urlstringAPI detail URL with explicit source type.
Publisher
FieldTypeMeaning
idstringSource identity.
source_typestringgithub or well-known.
skill_countintegerActive official Skills.
Mcp
FieldTypeMeaning
idstringFull namespace/name identity.
namespacestringNamespace.
namestringName within namespace.
titlestring / nullDisplay title.
descriptionstringPublic description.
versionstringCurrent catalog version.
statusstringSee nested fields in OpenAPI.
website_urlstring / nullPublisher website.
package_registry_typesarraySee nested fields in OpenAPI.
remote_transport_typesarraySee nested fields in OpenAPI.
has_packagesbooleanSee nested fields in OpenAPI.
has_remotesbooleanSee nested fields in OpenAPI.
observed_atstring / nullReported catalog update.
urlstringOAIS page.
api_urlstringAPI detail URL.
Resource
FieldTypeMeaning
idstringPublic resource UUID.
organization_idstringOwning organization UUID.
kindstringSee nested fields in OpenAPI.
titlestringTitle.
descriptionstringPublic description.
updated_atstring / nullResource update.
itemsarraySee nested fields in OpenAPI.
items_truncatedbooleanDetail returns at most 100 items.
Observation
FieldTypeMeaning
idstringComposite dataset and observation identity.
datasetstringObservation dataset.
model_idstringExplicitly matched model.
route_idstring / nullRoute identity.
observed_atstring / nullObservation time.
observationobjectSee nested fields in OpenAPI.
Activity
FieldTypeMeaning
idstringUTC observation date.
daystringYYYY-MM-DD.
tokensstringExact aggregate observed tokens, decimal integer string.
routesintegerNumber of observed routes.
observed_atstring / nullLast observation.
Topic
FieldTypeMeaning
idstringCurated topic slug.
namestringTopic name.
descriptionstringPublic description.
urlstringCanonical topic page.
Article
FieldTypeMeaning
idstringEditorial identity.
slugstringArticle slug.
titlestringTitle.
urlstringPreserved root-level canonical URL.
excerptstringPublic excerpt.
published_atstring / nullPublication timestamp.
updated_atstring / nullModification time when available; null for list metadata.
Audits
FieldTypeMeaning
idstringFull Skill identity.
auditsarraySee nested fields in OpenAPI.
noticestringSecurity interpretation notice.
Document
FieldTypeMeaning
idstringFull Skill identity.
formatstringSee nested fields in OpenAPI.
contentstringInert UTF-8 Markdown; never execute automatically.
licensestring / nullRecorded license.
Connection
FieldTypeMeaning
idstringFull MCP identity.
connectionobjectExisting bounded inert MCP projection, not original registry JSON. No execution, tool inventory or security verdict.
Stats
FieldTypeMeaning
idstringcatalog
modelsintegerActive public models count.
skillsintegerActive public skills count.
mcpsintegerActive public mcps count.
organizationsintegerActive public organizations count.
providersintegerActive public providers count.
familiesintegerActive public families count.
Usage
FieldTypeMeaning
daily_limitintegerAccount daily unit allowance.
monthly_limitintegerAccount monthly unit allowance.
daily_unitsintegerUsed or reserved daily units.
monthly_unitsintegerUsed or reserved monthly units.
daily_bytesintegerUsed or reserved daily response bytes.
daily_byte_limitintegerDaily response-byte allowance.
minute_limitintegerRequests per minute.
daily_reset_atstring / nullNext daily UTC reset.
monthly_reset_atstring / nullNext monthly UTC reset.
06

Use the tools you already know

Node.js · paginated catalog

const origin = "https://openaisuite.com";
const key = process.env.OAIS_API_KEY;
if (!key) throw new Error("Set OAIS_API_KEY on your server");
let next = origin + "/api/v1/models/?limit=25";
for (let page = 0; next && page < 100; page++) {
  const url = new URL(next);
  if (url.origin !== origin || !url.pathname.startsWith("/api/v1/")) {
    throw new Error("Unexpected pagination destination");
  }
  const response = await fetch(url, {
    headers: { Authorization: "Bearer " + key },
    redirect: "error", signal: AbortSignal.timeout(10000)
  });
  if (!response.ok) {
    const problem = await response.json();
    throw new Error(problem.code + ": " + problem.detail);
  }
  const result = await response.json();
  for (const model of result.data) console.log(model.id, model.name);
  next = result.links.next;
  if (next) await new Promise(resolve => setTimeout(resolve, 1100));
}

Python · standard library

import json, os, urllib.request

request = urllib.request.Request(
    "https://openaisuite.com/api/v1/skills/?limit=5",
    headers={"Authorization": "Bearer " + os.environ["OAIS_API_KEY"]})
class NoRedirect(urllib.request.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        return None
opener = urllib.request.build_opener(NoRedirect)
with opener.open(request, timeout=10) as response:
    for skill in json.load(response)["data"]:
        print(skill["id"], skill["name"])

Use the playground to inspect a real response and its usage headers.

Build something the community can use.

Model selectors with transparent prices. Agent directories. Research dashboards. Explore the relationships and preserve attribution.

Open developer workspace