Developer portal

API docs, without the signup.

The public HTTP surface at raftlabs.com, described in full: OpenAPI 3.1, an endpoint reference, the error catalog, rate-limit headers, and the versioning policy. No keys to request, nothing to bill.

Start here

Three files, then the endpoints

Read the machine-readable description before scraping anything. It carries the schemas, the error codes, and the versioning policy.

  • application/json

    OpenAPI 3.1 description

    Every public endpoint, its request and response schemas, error codes, and the versioning policy under `x-api-lifecycle`.

  • application/linkset+json

    API catalog

    RFC 9727 linkset pointing at every agent-facing resource on this site.

  • application/json

    Agent Skills index

    Task-oriented guides: browse the portfolio, request a quote, understand the services.

Authentication

There are no API keys

  • There are no API keys. Every endpoint in the OpenAPI document is public, unauthenticated, and read-only.
  • Nothing on this API creates, changes, or bills anything, so there is no credential to issue and no key rotation to manage.
  • There is no API for starting a project or requesting a quote. Those go through a human — the contact form or [email protected].

Reference

Endpoints

Generated from the OpenAPI document, so this list cannot describe an endpoint the API does not serve. Current version 1, at /api/v1.

GET/api/health

Service health

Confirms the site is reachable. Permanent unversioned alias of /api/v1/health, kept because /.well-known/api-catalog, /llms.txt and external monitors already reference it. Not deprecated; it always mirrors the current version. Requires no authentication. Reports reachability only — no dependency values are returned.

GET/api/v1/health

Service health

Confirms the site is reachable. This is the canonical, versioned path. Requires no authentication. Reports reachability only — no dependency values are returned.

Quickstart

Copy, paste, run

Every command below works against production as-is. Nothing here needs a credential.

Check the service is reachable

The one endpoint that is safe to call as often as you like. No side effects, no credential, no cost.

curl -i https://www.raftlabs.com/api/v1/health

Read the API description

Start here in a client generator. The document carries the schemas, the error catalog, and the versioning policy.

curl -s https://www.raftlabs.com/openapi.json | jq '.paths | keys'

See the rate-limit budget

Every response reports the remaining budget, on success as well as on refusal, so a client can pace itself before it is ever throttled.

curl -sI https://www.raftlabs.com/api/v1/health | grep -i ratelimit

Inspect an error

Every failure is RFC 9457 problem details with a stable `code` and an actionable `hint`. No route under /api returns an HTML error page.

curl -s https://www.raftlabs.com/api/does-not-exist | jq

Get a page as markdown

Content is published for agents as well as browsers. Unknown paths answer 404 with a markdown recovery body listing the site's own indexes.

curl -s -H "Accept: text/markdown" https://www.raftlabs.com/

Sandbox

Test against the health endpoint

  • There is no separate sandbox host. `/api/v1/health` is the sandbox: it is idempotent, free, side-effect free, and served from the same infrastructure as everything else, so a client validated against it is validated against production.
  • Point a generated client at it, confirm you parse the rate-limit headers and the RFC 9457 problem body, then move on.
  • Request an unregistered path such as `/api/does-not-exist` to exercise your error handling against a real problem+json response.

Rate limits

Every response reports its budget

On success as well as on refusal, so a client can pace itself before it is ever throttled.

Policies

PolicyLimitWindow
health120 requests60s per client
not-found60 requests60s per client

Headers

HeaderMeaning
RateLimit-LimitRequests permitted in the current window.
RateLimit-RemainingRequests left in the current window.
RateLimit-ResetSeconds until the window resets.
RateLimit-PolicyStructured field naming the policy, its quota and its window: `"health";q=120;w=60`.
RateLimitStructured field carrying the live state: `"health";r=119;t=60`.
Retry-AfterSeconds to wait. Sent only with a 429, where RFC 9110 gives it meaning.

Quotas are counted per serverless instance and per client IP, so the reported budget is a floor rather than a global guarantee. Treat a 429 as authoritative and honour `Retry-After`.

Versioning

The major version is in the path

/api/v1 is current, and every response carries the version header. A breaking change ships under a new prefix; it never lands on an existing one.

Responses carry API-Version: 1.

Breaking, needs a new version

  • Removing an endpoint, or removing a field from a response.
  • Renaming a field, or changing its type.
  • Adding a required request field, or tightening validation on an existing one.
  • Changing the HTTP status or the `code` returned for an existing condition.

Non-breaking, ships any time

  • Adding an endpoint.
  • Adding an optional request field.
  • Adding a field to a response — parse defensively and ignore what you do not use.
  • Adding a new `code` value for a condition that previously had none.

Unversioned aliases

Permanent aliases of the current version, kept because external monitors and machine-readable indexes already reference them. Not deprecated.

  • /api/health mirrors /api/v1/health

Deprecation policy

An endpoint gets at least 180 days between the deprecation notice and the sunset date, and keeps answering normally for the whole notice period. A retirement is signalled in all of these places at once:

  • Deprecation response header (RFC 9745) carrying the date the deprecation took effect, as a structured-field date: Deprecation: @1780272000.
  • Sunset response header (RFC 8594) carrying the date the endpoint stops answering, as an HTTP-date.
  • Link response header with rel="successor-version" pointing at the replacement.
  • deprecated: true on the operation in /openapi.json, with the successor named in its description.
  • An entry in the deprecations table on /developers, listing the sunset date.

Active deprecations

None. No endpoint on this API is scheduled for retirement.

Errors

RFC 9457 problem details, everywhere

Every failure returns application/problem+json with a stable code and an actionable hint. No route under /api returns an HTML error page.

codeStatusMeaning
invalid_request_body400Invalid request body
missing_required_field400Missing required field
captcha_verification_failed403Captcha verification failed
not_found404Endpoint not found
method_not_allowed405Method not allowed
rate_limit_exceeded429Rate limit exceeded
server_misconfigured500Server misconfigured
upstream_error502Upstream service failed
internal_error500Internal server error

Discovery

Machine-readable resources

Also advertised in the site-wide Link header and the RFC 9727 catalog at /.well-known/api-catalog.

Support

Something wrong, or need more headroom?

Email [email protected] with the request path, the code you received, and the time. There is no API for starting a project: use the contact form.

Contact RaftLabs · This page as markdown