On this page

API

Meta operations

Index, health, contract, event catalogue and rate limit status.

Index, health, contract, event catalogue and rate limit status. Paths are relative to https://reuseforge.com/api/v1.

Operations in this area
OperationMethodPath
API indexGET/
Health checkGET/health
This contractGET/openapi.{format}
Webhook event catalogueGET/event-types
Rate limit statusGET/rate-limit

API index

GET / Enabled on reuseforge.com

Entry point with links to every top-level collection, the enabled payment rails, current limits and any announced deprecations. Safe to call without credentials.

API index: facts
PropertyValue
Operation IDget_api_index
AuthenticationNone required. A token raises your rate limits and shows your private items.
Rate tierread: 60/min per IP anonymous, 600/min per token with a token
Python SDKclient.get_api_index(...)
JavaScript SDKclient.getApiIndex(...)
CLIrf api index
MCP toolnot exposed as a tool
Deploymentsreuseforge.com: enabled. Python node: implemented.

Responses

API index: responses
StatusMeaningBody
200 OKThe index.application/json: ApiIndex
429Rate limit for the operation's tier exceeded. Wait Retry-After seconds.Problem. Codes: rate_limited
500Unexpected failure on our side. Safe to retry idempotent calls; quote request_id if it persists.Problem. Codes: internal

Example

curl

bash
curl 'https://reuseforge.com/api/v1'

Python

python
import reuseforge

client = reuseforge.Client()  # token from REUSEFORGE_TOKEN, or the file `rf login` wrote

result = client.get_api_index()
print(result["name"])

JavaScript

javascript
import { ReuseForge } from '@reuseforge/sdk';

const client = new ReuseForge({ token: process.env.REUSEFORGE_TOKEN });

const result = await client.getApiIndex();
console.log(result.name);

CLI

bash
rf api index

# rf api index
# all options: rf api index --help

Response 200 OK:

json
{
  "name": "ReuseForge API",
  "api_version": "1.1.0",
  "major": "v1",
  "documentation_url": "https://reuseforge.com/docs/api",
  "openapi_url": "https://reuseforge.com/api/v1/openapi.json",
  "links": {
    "items": "/api/v1/items",
    "plans": "/api/v1/plans",
    "orders": "/api/v1/orders",
    "projects": "/api/v1/projects",
    "webhooks": "/api/v1/webhooks",
    "tokens": "/api/v1/tokens",
    "ledger": "/api/v1/ledger/events",
    "mcp": "https://reuseforge.com/mcp"
  },
  "auth": {
    "type": "bearer",
    "token_prefix": "rf_",
    "scope_catalog_url": "https://reuseforge.com/docs/api#scopes"
  },
  "test_mode": true,
  "rails": [
    {
      "id": "simulated",
      "network": null,
      "enabled": true,
      "test_mode": true
    },
    {
      "id": "base-usdc",
      "network": "base-sepolia",
      "enabled": true,
      "test_mode": true
    },
    {
      "id": "base-usdt",
      "network": "base-sepolia",
      "enabled": false,
      "test_mode": true
    },
    {
      "id": "btc",
      "network": "testnet4",
      "enabled": false,
      "test_mode": true
    }
  ],
  "limits": {
    "page_max": 100,
    "max_files": 100,
    "max_file_bytes": 524288,
    "max_version_bytes": 2097152,
    "max_request_bytes": 3145728,
    "goal_max_chars": 4000,
    "plan_ttl_seconds": 86400,
    "idempotency_ttl_seconds": 86400,
    "webhook_endpoints_max": 20,
    "tokens_max": 50
  },
  "deprecations": []
}

Health check

GET /health Enabled on reuseforge.com

Cheap liveness and dependency check for monitors. Returns 200 when the API can serve requests and 503 when it cannot reach its database.

Health check: facts
PropertyValue
Operation IDget_health
AuthenticationNone required. A token raises your rate limits and shows your private items.
Rate tierread: 60/min per IP anonymous, 600/min per token with a token
Python SDKclient.get_health(...)
JavaScript SDKclient.getHealth(...)
CLIrf api health
MCP toolnot exposed as a tool
Deploymentsreuseforge.com: enabled. Python node: implemented.

Responses

Health check: responses
StatusMeaningBody
200 OKHealthy or degraded (degraded still serves).application/json: Health
429Rate limit for the operation's tier exceeded. Wait Retry-After seconds.Problem. Codes: rate_limited
503Temporarily unable to serve (maintenance or a dependency is down). Honour Retry-After.Problem. Codes: unavailable

Example

curl

bash
curl 'https://reuseforge.com/api/v1/health'

Python

python
import reuseforge

client = reuseforge.Client()  # token from REUSEFORGE_TOKEN, or the file `rf login` wrote

result = client.get_health()
print(result)

JavaScript

javascript
import { ReuseForge } from '@reuseforge/sdk';

const client = new ReuseForge({ token: process.env.REUSEFORGE_TOKEN });

const result = await client.getHealth();
console.log(result);

CLI

bash
rf api health

# rf api health
# all options: rf api health --help

Response 200 OK:

json
{
  "status": "ok",
  "time": "2026-11-03T10:00:00Z",
  "version": "1.1.0",
  "components": {
    "database": "ok",
    "cache": "ok",
    "connectors": "ok"
  }
}

This contract

GET /openapi.{format} Enabled on reuseforge.com

The OpenAPI 3.1 document served by this deployment, as JSON or YAML. Cacheable; honours If-None-Match.

This contract: facts
PropertyValue
Operation IDget_openapi_document
AuthenticationNone required. A token raises your rate limits and shows your private items.
Rate tierread: 60/min per IP anonymous, 600/min per token with a token
CachingSends an ETag; repeat with If-None-Match to get 304 Not Modified
Python SDKclient.get_openapi_document(...)
JavaScript SDKclient.getOpenapiDocument(...)
CLIrf api openapi
MCP toolnot exposed as a tool
Deploymentsreuseforge.com: enabled. Python node: implemented.

Parameters

This contract: parameters
NameInTypeRequiredDescription
formatpathstring: json, yamlyes
If-None-MatchheaderstringnoETag from an earlier response; a match returns 304 without a body.

Responses

This contract: responses
StatusMeaningBody
200 OKThe OpenAPI document.application/json: OpenApiDocument
304 Not ModifiedNot modified.no body
404No such resource, or it is private and the caller may not know it exists.Problem. Codes: not_found
429Rate limit for the operation's tier exceeded. Wait Retry-After seconds.Problem. Codes: rate_limited

Example

curl

bash
curl 'https://reuseforge.com/api/v1/openapi.json'

Python

python
import reuseforge

client = reuseforge.Client()  # token from REUSEFORGE_TOKEN, or the file `rf login` wrote

result = client.get_openapi_document("json")
print(result)

JavaScript

javascript
import { ReuseForge } from '@reuseforge/sdk';

const client = new ReuseForge({ token: process.env.REUSEFORGE_TOKEN });

const result = await client.getOpenapiDocument("json");
console.log(result);

CLI

bash
rf api openapi

# rf api openapi [options]
# all options: rf api openapi --help

Response 200 OK:

json
{
  "openapi": "3.1.0",
  "info": {
    "title": "ReuseForge API",
    "version": "1.1.0"
  },
  "paths": {}
}

Webhook event catalogue

GET /event-types Enabled on reuseforge.com

Every event type that can be delivered to webhooks, with the resource carried in data.object.

Webhook event catalogue: facts
PropertyValue
Operation IDlist_event_types
AuthenticationNone required. A token raises your rate limits and shows your private items.
Rate tierread: 60/min per IP anonymous, 600/min per token with a token
Python SDKclient.list_event_types(...)
JavaScript SDKclient.listEventTypes(...)
CLIrf events types
MCP toollist_event_types
Deploymentsreuseforge.com: enabled. Python node: implemented.

Responses

Webhook event catalogue: responses
StatusMeaningBody
200 OKThe catalogue.application/json: EventTypePage
429Rate limit for the operation's tier exceeded. Wait Retry-After seconds.Problem. Codes: rate_limited

Example

curl

bash
curl 'https://reuseforge.com/api/v1/event-types'

Python

python
import reuseforge

client = reuseforge.Client()  # token from REUSEFORGE_TOKEN, or the file `rf login` wrote

result = client.list_event_types()
print(result["type"])

JavaScript

javascript
import { ReuseForge } from '@reuseforge/sdk';

const client = new ReuseForge({ token: process.env.REUSEFORGE_TOKEN });

const result = await client.listEventTypes();
console.log(result.type);

CLI

bash
rf events types

# rf events types
# all options: rf events types --help

Response 200 OK:

json
{
  "data": [
    {
      "type": "item.published",
      "description": "A new item became publicly available.",
      "object": "item"
    },
    {
      "type": "item.version.published",
      "description": "A new version of an item was published.",
      "object": "item_version"
    },
    {
      "type": "order.funded",
      "description": "Escrow for an order was confirmed funded.",
      "object": "order"
    },
    {
      "type": "payout.sent",
      "description": "A payout to a seller, platform fee or refund was sent.",
      "object": "payout"
    }
  ],
  "next_cursor": null,
  "has_more": false
}

Rate limit status

GET /rate-limit Enabled on reuseforge.com

Your current allowance in every tier. Does not itself consume allowance.

Rate limit status: facts
PropertyValue
Operation IDget_rate_limits
AuthenticationNone required. A token raises your rate limits and shows your private items.
Rate tierread: 60/min per IP anonymous, 600/min per token with a token
Python SDKclient.get_rate_limits(...)
JavaScript SDKclient.getRateLimits(...)
CLIrf api rate-limit
MCP toolget_rate_limits
Deploymentsreuseforge.com: enabled. Python node: implemented.

Responses

Rate limit status: responses
StatusMeaningBody
200 OKAllowance per tier.application/json: RateLimitStatus
429Rate limit for the operation's tier exceeded. Wait Retry-After seconds.Problem. Codes: rate_limited

Example

curl

bash
curl 'https://reuseforge.com/api/v1/rate-limit'

Python

python
import reuseforge

client = reuseforge.Client()  # token from REUSEFORGE_TOKEN, or the file `rf login` wrote

result = client.get_rate_limits()
print(result)

JavaScript

javascript
import { ReuseForge } from '@reuseforge/sdk';

const client = new ReuseForge({ token: process.env.REUSEFORGE_TOKEN });

const result = await client.getRateLimits();
console.log(result);

CLI

bash
rf api rate-limit

# rf api rate-limit
# all options: rf api rate-limit --help

Response 200 OK:

json
{
  "principal": "token",
  "tiers": [
    {
      "tier": "read",
      "limit": 600,
      "remaining": 597,
      "reset_seconds": 41,
      "window_seconds": 60,
      "policy": "600;w=60"
    },
    {
      "tier": "write",
      "limit": 120,
      "remaining": 120,
      "reset_seconds": 60,
      "window_seconds": 60,
      "policy": "120;w=60"
    },
    {
      "tier": "plan",
      "limit": 20,
      "remaining": 19,
      "reset_seconds": 33,
      "window_seconds": 60,
      "policy": "20;w=60"
    },
    {
      "tier": "discover",
      "limit": 10,
      "remaining": 10,
      "reset_seconds": 60,
      "window_seconds": 60,
      "policy": "10;w=60"
    },
    {
      "tier": "payments",
      "limit": 30,
      "remaining": 30,
      "reset_seconds": 60,
      "window_seconds": 60,
      "policy": "30;w=60"
    }
  ]
}