Skip to content
cresvaDevelopers

Generic HTML documentation, with {brandId} placeholders

GET/api/storefront/docs
No keyCallable anonymously. Rate limited by IP.10 requests a minute

Request

bash
curl "https://cresva.ai/api/storefront/docs"

Response

Captured from production on 2026-09-16: 200 in 271ms. This is what the endpoint returned, not an example of what it might.

JSON
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Cresva Storefront API Documentation</title>
  <style>
    * { margin: 0; padding: 0; box-sizing: border-box; }
    body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #0f172a; color: #e2e8f0; line-height: 1.7; }
    .container { max-width: 900px; margin: 0 auto; padding: 40px 24px; }
    h1 { font-size: 2rem; margin-bottom: 8px; color: #f8fafc; }
    h2 { font-size: 1.5rem; margin-top: 48px; margin-bottom: 16px; color: #f8fafc; border-bottom: 1px solid #334155; padding-bottom: 8px; }
    h3 { font-size: 1.1rem; margin-top: 32px; margin-bottom: 8px; color: #f8fafc; }
    p { margin-bottom: 16px; color: #cbd5e1; }
    pre { background: #1e293b; padding: 16px; border-radius: 8px; overflow-x: auto; margin-bottom: 16px; position: relative; }
    code { font-family: "SF Mono", Menlo, Consolas, monospace; font-size: 0.875rem; color: #a5f3fc; }
    p code { background: #1e293b; padding: 2px 6px; border-radius: 4px; }
    .badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; margin-right: 6px; }
    .get { background: #065f46; color: #6ee7b7; }
    .post { background: #1e40af; color: #93c5fd; }
    .copy-btn { position: absolute; top: 8px; right: 8px; background: #334155; border: none; color: #94a3b8; padding: 4px 8px; border-radius: 4px; cursor: pointer; font-size: 0.75rem; }
    .copy-btn:hover { background: #475569; color: #e2e8f0; }
    table { width: 100%; border-collapse: collapse; margin-bottom: 16px; }
    th, td { padding: 8px 12px; border: 1px solid #334155; text-align: left; font-size: 0.875rem; }
    th { background: #1e293b; color: #f8fafc; }
    td { color: #cbd5e1; }
    a { color: #38bdf8; text-decoration: none; }
    a:hover { text-decoration: underline; }
    .subtitle { color: #94a3b8; font-size: 1.1rem; margin-bottom: 32px; }
    .nav { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; margin-bottom: 32px; }
    .nav a { background: #1e293b; padding: 4px 12px; border-radius: 6px; font-size: 0.85rem; color: #94a3b8; }
    .nav a:hover { background: #334155; color: #e2e8f0; text-decoration: none; }
    .sdk-links { display: flex; gap: 12px; margin-bottom: 16px; }
    .sdk-links a { background: #1e293b; border: 1px solid #334155; padding: 8px 16px; border-radius: 6px; font-size: 0.875rem; }
  </style>
</head>
<body>
  <div class="container">
    <h1>Cresva Storefront API</h1>
    <p class="subtitle">Product data API for AI shopping agents, in an agent-optimized format.</p>

    <div class="nav">
      <a href="#auth">Authentication</a>
      <a href="#quickstart">Quickstart</a>
      <a href="#endpoints">Endpoints</a>
      <a href="#errors">Error Codes</a>
      <a href="#rate-limits">Rate Limits</a>
      <a href="#sdks">SDKs</a>
    </div>

    <h2 id="auth">Authentication</h2>
    <p>Include your API key in the <code>Authorization</code> header:</p>
    <pre><code>Authorization: Bearer pk_live_your_key_here</code><button class="copy-btn" onclick="copyCode(this)">Copy</button></pre>
    <p>Key types:</p>
    <table>
      <tr><th>Prefix</th><th>Type</th><th>Rate Limit</th><th>Use Case</th></tr>
      <tr><td><code>pk_live_</code></td><td>Public</td><td>60 req/min</td><td>Client-side, browser</td></tr>
      <tr><td><code>sk_live_</code></td><td>Secret</td><td>300 req/min</td><td>Server-to-server</td></tr>
      <tr><td><code>pk_test_</code></td><td>Public test</td><td>60 req/min</td><td>Development</td></tr>
      <tr><td><code>sk_test_</code></td><td>Secret test</td><td>300 req/min</td><td>Development</td></tr>
    </table>

    <h2 id="quickstart">Quickstart</h2>
    <h3>cURL</h3>
    <pre><code>curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://cresva.ai/api/storefront/{brandId}/search?q=organic+cotton+tshirt"</code><button class="copy-btn" onclick="cop
… truncated at 4000 characters

Response codes

200HTML documentation.

No body.

401The key does not match any active key.
erroranyTwo shapes exist across this API and that is deliberate rather than untidy. Each route kept the error shape it already used, so an existing client's error handling keeps working. See x-cresva-error-shapes.
403The key is valid but belongs to a different brand than the one in the path. Keys are scoped to one brand and do not travel.
erroranyTwo shapes exist across this API and that is deliberate rather than untidy. Each route kept the error shape it already used, so an existing client's error handling keeps working. See x-cresva-error-shapes.
404No such brand.
erroranyTwo shapes exist across this API and that is deliberate rather than untidy. Each route kept the error shape it already used, so an existing client's error handling keeps working. See x-cresva-error-shapes.
429Over the rate limit.
erroranyTwo shapes exist across this API and that is deliberate rather than untidy. Each route kept the error shape it already used, so an existing client's error handling keeps working. See x-cresva-error-shapes.
503The rate limiter could not be reached, so the request was refused rather than served unmetered. Deliberately not a 429: the caller has done nothing wrong and the fault is ours.
erroranyTwo shapes exist across this API and that is deliberate rather than untidy. Each route kept the error shape it already used, so an existing client's error handling keeps working. See x-cresva-error-shapes.

Generated from the storefront OpenAPI document at growthagents 269d7898b, sha256 047fe4d301258100. Nothing on this page was typed by hand.