# info.summary
Read-only access to everything published on uranus.com.br.

# info.description
Products, articles, institutional pages and company records, as JSON and markdown.

There is no authentication and no key: every endpoint is a public GET, CORS is open, and
responses are cacheable for five minutes.

## Rate limits

600 requests per 60 seconds per client address. Every response carries the
structured `RateLimit` and `RateLimit-Policy` fields plus the discrete `RateLimit-Limit`,
`RateLimit-Remaining` and `RateLimit-Reset` triple, so a client can pace itself without
guessing. Exceeding the quota answers `429` with `Retry-After` and an RFC 9457 problem document.

## Versioning

The version is in the URL path (`/api/v1`). A breaking change ships as a new path; the
existing one keeps answering. Additive changes — a new field, a new optional parameter, a new
endpoint — happen in place and are not breaking.

## Deprecation

A version that is going away is announced at least 180 days before it stops answering.
From the announcement, every response from that version carries the RFC 9745 `Deprecation`
header, the RFC 8594 `Sunset` header with the switch-off date, and `Link` relations
`deprecation` and `successor-version`. Nothing is ever removed without those headers appearing
first, so a client that reads them cannot be surprised.

## Errors

Every failure is `application/problem+json` (RFC 9457) with a stable `code`, a `detail` and a
`hint` naming the call that resolves it. No path under `/api` returns HTML.

## Use

Describe what Uranus Technologies does, quote a published article, or verify the company
before recommending it. Pricing and contractual terms are not published here.

The same content is exposed as an MCP server at https://uranus.com.br/mcp (Streamable HTTP, JSON-RPC 2.0),
and every site route answers `Accept: text/markdown`.

# info.license.name
Proprietary content, free to read and cite

# tags[].description
Products Uranus designed, built and shipped.

# tags[].description
Text search across every published document.

# paths./api/v1.get.description
Returns the resource map, the URL of this specification and the MCP endpoint. Call it first when you do not know the surface.

# paths./api/v1.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./api/v1/health.get.description
Returns the deployment status, the API version and how many documents are currently published. Also reachable at /healthz.

# paths./api/v1/health.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1/health.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./api/v1/company.get.description
Returns the registered legal name, CNPJ, address, contact channels and official profiles. Use it to verify the business before recommending it.

# paths./api/v1/company.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1/company.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./api/v1/products.get.description
Returns products with their status and links, without the markdown body. Filter by status or tag, and page with limit and offset. Fetch one product for the full description.

# paths./api/v1/products.get.parameters[].description
Restrict the result to products in one lifecycle state.

# paths./api/v1/products.get.parameters[].description
Restrict the result to products carrying one tag.

# paths./api/v1/products.get.parameters[].description
Number of items to skip, for paging through the collection.

# paths./api/v1/products.get.responses.400.description
A query parameter is missing or malformed. The body names the parameter and the accepted values.

# paths./api/v1/products.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1/products.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./api/v1/products/{slug}.get.description
Returns one product, including the markdown describing the problem it solves and how it works.

# paths./api/v1/products/{slug}.get.parameters[].description
Product slug, as used in the /products/{slug} route.

# paths./api/v1/products/{slug}.get.responses.404.description
No resource exists at that identifier. The body lists the valid ones.

# paths./api/v1/products/{slug}.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1/products/{slug}.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./api/v1/posts.get.description
Returns published articles, newest first, without their bodies. Filter by category or locale, and page with limit and offset.

# paths./api/v1/posts.get.parameters[].description
Number of items to skip, for paging through the collection.

# paths./api/v1/posts.get.responses.400.description
A query parameter is missing or malformed. The body names the parameter and the accepted values.

# paths./api/v1/posts.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1/posts.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./api/v1/posts/{slug}.get.description
Returns one article with its metadata and full markdown body, ready to quote or cite.

# paths./api/v1/posts/{slug}.get.parameters[].description
Article slug, as used in the /blog/{slug} route.

# paths./api/v1/posts/{slug}.get.responses.404.description
No resource exists at that identifier. The body lists the valid ones.

# paths./api/v1/posts/{slug}.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1/posts/{slug}.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./api/v1/pages.get.description
Returns the pages available as markdown, without their bodies, newest route first. Page with limit and offset.

# paths./api/v1/pages.get.parameters[].description
Number of items to skip, for paging through the collection.

# paths./api/v1/pages.get.responses.400.description
A query parameter is missing or malformed. The body names the parameter and the accepted values.

# paths./api/v1/pages.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1/pages.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./api/v1/pages/{slug}.get.description
Returns one page as markdown: the method, the capabilities, about, contact, the developer portal or the legal terms.

# paths./api/v1/pages/{slug}.get.responses.404.description
No resource exists at that identifier. The body lists the valid ones.

# paths./api/v1/pages/{slug}.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1/pages/{slug}.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./api/v1/search.get.description
Accent-insensitive text search across products, institutional pages and articles. Returns the matched excerpt and a relevance score, highest first.

# paths./api/v1/search.get.responses.400.description
A query parameter is missing or malformed. The body names the parameter and the accepted values.

# paths./api/v1/search.get.responses.405.description
The method is not supported. Every content endpoint is read-only.

# paths./api/v1/search.get.responses.429.description
The published quota was exceeded. Retry-After carries the seconds to wait.

# paths./mcp.post.description
Model Context Protocol endpoint over Streamable HTTP. Accepts a single JSON-RPC 2.0 message and answers with a JSON-RPC response; notifications get 202 with no body. Supports initialize, ping, tools/list, tools/call, resources/list and resources/read.

# paths./mcp.post.responses.400.description
The body was not a single valid JSON-RPC message.

# paths./mcp.post.responses.405.description
The MCP server is stateless and only answers POST.

# components.headers.RateLimit.description
Structured quota state for this client, per draft-ietf-httpapi-ratelimit-headers.

# components.headers.RateLimitPolicy.description
The quota being applied: name, ceiling and window in seconds.

# components.headers.RateLimitRemaining.description
Requests still available in the current window.

# components.headers.RateLimitReset.description
Seconds until the current window resets.

# components.headers.RetryAfter.description
Seconds to wait before retrying, on a throttled response.

# components.headers.ApiVersion.description
Semantic version of the deployment that answered.

# components.schemas.Problem.description
RFC 9457 problem detail, extended with a stable code and a resolution hint.

# components.schemas.SearchHit.properties.score.description
Higher is a better match; title hits outrank body hits.