Compute Comparison
Back to Compare
Public API

GPU & LLM Inference Pricing API — Live Rates for 94+ Cloud Providers & 33+ LLM Providers

Embed live GPU compute and LLM inference pricing from 94+ GPU providers and 33+ LLM providers directly into your website, dashboard, or application. GPU data refreshes every 15 minutes. LLM prices updated daily. Free to use — no API key required.

94+ GPU Cloud Providers

live data

33+ LLM Providers

262+ models

No auth needed

open API

CORS enabled

any origin

Base URL

https://computecomparison.com/api/v1

Authentication

No key required

All endpoints are publicly accessible — no API key needed. Just call the URL directly.

GPU Compute Endpoints

CORS

All /api/v1/* endpoints include Access-Control-Allow-Origin: * headers, so you can call them directly from browser JavaScript on any domain — no proxy needed.

Data Freshness

Prices are fetched from each provider's public API and refreshed every 15 minutes. Each listing includes a source field:live (fetched this cycle),cached (from previous cycle), orfallback (static rates used when provider API is unavailable). Responses include Cache-Control: public, max-age=60.

Live API Status

Check provider health and uptime in real time

View Status

GPU HTML Embed Widgets

Copy and paste any widget below directly into your website's HTML. No build tools or frameworks required.

Note: These widgets fetch data client-side directly from the public API — no key required. For production use on your own site, request a standard key and replace cc_live_demo0000000000000000000000 in the snippet. The demo key is rate-limited to 500 req / 15 min and should not be used in production.

Price Ticker

Scrolling marquee showing every provider's best price per hour, right-to-left. Drop it into any page header or sidebar.

Preview (loading…)

Loading live data…
HTML + JavaScript
<!-- GPU Price Ticker — computecomparison.com -->
<div id="cc-ticker-wrap" style="font-family:ui-monospace,monospace;background:#0a0a0f;border:1px solid #1e1e2e;border-radius:8px;overflow:hidden;display:flex;align-items:center;height:38px">
  <a href="https://computecomparison.com" target="_blank" rel="noopener noreferrer"
     style="shrink:0;padding:0 14px;border-right:1px solid #1e1e2e;font-size:10px;font-weight:700;color:#00ff88;letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;height:100%;display:flex;align-items:center;text-decoration:none">
    LIVE GPU PRICES
  </a>
  <div style="flex:1;overflow:hidden;position:relative">
    <div id="cc-ticker-track" style="display:inline-flex;gap:0;white-space:nowrap;will-change:transform">
      <span id="cc-ticker-inner" style="display:inline-flex;align-items:center;gap:0"></span>
      <span id="cc-ticker-clone"  style="display:inline-flex;align-items:center;gap:0"></span>
    </div>
  </div>
  <a href="https://computecomparison.com" target="_blank" rel="noopener"
     style="shrink:0;padding:0 12px;border-left:1px solid #1e1e2e;font-size:9px;color:#333;text-decoration:none;height:100%;display:flex;align-items:center;white-space:nowrap">
    CC ↗
  </a>
</div>
<script>
(function () {
  var API_KEY = 'YOUR_API_KEY';
  var SPEED = 60; // pixels per second — increase to scroll faster

  // Uses JSONP via <script> tag — works cross-origin with no CORS headers needed
  var cbName = '__ccTicker_' + Math.random().toString(36).slice(2);
  var done = false;

  window[cbName] = function (json) {
    done = true;
    delete window[cbName];
    var items = (json.data || [])
      .filter(function (p) { return p.best_price_per_hour != null; })
      .sort(function (a, b) { return a.best_price_per_hour - b.best_price_per_hour; });

    function makeItems(container) {
      container.innerHTML = '';
      items.forEach(function (p) {
        var sep = document.createElement('span');
        sep.style.cssText = 'color:#1e1e2e;padding:0 10px;font-size:14px;user-select:none';
        sep.textContent = '|';
        var item = document.createElement('a');
        item.href = p.profile_url || ('https://computecomparison.com/provider/' + p.name.toLowerCase().replace(/[^a-z0-9]+/g, '-'));
        item.target = '_blank';
        item.rel = 'noopener noreferrer';
        item.style.cssText = 'display:inline-flex;align-items:center;gap:6px;padding:0 6px;text-decoration:none;cursor:pointer;border-radius:3px;transition:background 0.15s';
        item.onmouseover = function() { this.style.background = 'rgba(0,246,255,0.07)'; };
        item.onmouseout  = function() { this.style.background = 'transparent'; };
        item.innerHTML =
          '<span style="color:#00f6ff;font-size:11px">' + p.name + '</span>' +
          '<span style="color:#00ff88;font-size:12px;font-weight:700">$' + p.best_price_per_hour.toFixed(4) + '</span>' +
          '<span style="color:#555;font-size:10px">/hr</span>';
        container.appendChild(sep);
        container.appendChild(item);
      });
    }

    var inner = document.getElementById('cc-ticker-inner');
    var clone  = document.getElementById('cc-ticker-clone');
    var track  = document.getElementById('cc-ticker-track');
    if (!inner || !clone || !track) return;

    makeItems(inner);
    makeItems(clone);

    var offset = 0;
    var last = null;
    function tick(ts) {
      if (!last) last = ts;
      var dt = (ts - last) / 1000;
      last = ts;
      var width = inner.scrollWidth;
      if (width > 0) {
        offset += SPEED * dt;
        if (offset >= width) offset -= width;
        track.style.transform = 'translateX(-' + offset + 'px)';
      }
      requestAnimationFrame(tick);
    }
    requestAnimationFrame(tick);
  };

  var s = document.createElement('script');
  s.src = 'https://computecomparison.com/api/v1/prices/providers?api_key=' + encodeURIComponent(API_KEY) + '&callback=' + cbName;
  s.onerror = function () {
    delete window[cbName];
    var inner = document.getElementById('cc-ticker-inner');
    if (inner) inner.innerHTML = '<span style="color:#555;font-size:11px;padding:0 14px">Could not load prices — check API_KEY</span>';
  };
  // Timeout fallback in case script loads but callback never fires (bad key returns non-JS)
  setTimeout(function () {
    if (!done) {
      delete window[cbName];
      var inner = document.getElementById('cc-ticker-inner');
      if (inner && !inner.children.length) inner.innerHTML = '<span style="color:#555;font-size:11px;padding:0 14px">Could not load prices — check API_KEY</span>';
    }
  }, 5000);
  document.head.appendChild(s);
})();
</script>

Pricing Table

Full sortable table of live GPU listings. Configurable GPU filter and row count.

Preview (loading…)

Loading live data…
HTML + JavaScript
<!-- GPU Pricing Table — computecomparison.com -->
<div id="cc-gpu-table" style="font-family:ui-monospace,monospace;background:#0a0a0f;border:1px solid #1e1e2e;border-radius:10px;overflow:hidden;max-width:100%">
  <div style="padding:12px 16px;border-bottom:1px solid #1e1e2e;display:flex;align-items:center;justify-content:space-between">
    <span style="color:#00ff88;font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase">Live GPU Prices</span>
    <a href="https://computecomparison.com" target="_blank" rel="noopener" style="color:#555;font-size:10px;text-decoration:none">computecomparison.com ↗</a>
  </div>
  <div style="overflow-x:auto">
    <table id="cc-gpu-table-body" style="width:100%;border-collapse:collapse;font-size:12px">
      <thead>
        <tr style="border-bottom:1px solid #1e1e2e">
          <th style="text-align:left;padding:8px 14px;color:#555;font-weight:500">Cloud Provider</th>
          <th style="text-align:left;padding:8px 14px;color:#555;font-weight:500">GPU</th>
          <th style="text-align:right;padding:8px 14px;color:#555;font-weight:500">On-Demand</th>
          <th style="text-align:right;padding:8px 14px;color:#555;font-weight:500">Spot</th>
          <th style="text-align:left;padding:8px 14px;color:#555;font-weight:500">Region</th>
        </tr>
      </thead>
      <tbody id="cc-rows"></tbody>
    </table>
  </div>
  <div style="padding:8px 16px;border-top:1px solid #1e1e2e;font-size:10px;color:#333">
    Powered by <a href="https://computecomparison.com" target="_blank" rel="noopener" style="color:#00ff88;text-decoration:none">ComputeComparison</a>
  </div>
</div>
<script>
(function() {
  var API_KEY = 'YOUR_API_KEY';
  var GPU_FILTER = 'H100'; // change or remove
  var MAX_ROWS = 10;
  var done = false;
  var cbName = '__ccTable_' + Math.random().toString(36).slice(2);

  window[cbName] = function(json) {
    done = true;
    delete window[cbName];
    var tbody = document.getElementById('cc-rows');
    if (!tbody || !json.data) return;
    json.data.forEach(function(r) {
      var tr = document.createElement('tr');
      tr.style.borderBottom = '1px solid #111118';
      tr.innerHTML =
        '<td style="padding:8px 14px;color:#00f6ff">' + r.provider + '</td>' +
        '<td style="padding:8px 14px;color:#c9d1d9">' + r.gpu_model + '</td>' +
        '<td style="padding:8px 14px;color:#00ff88;text-align:right">$' + r.price_per_hour.toFixed(4) + '/hr</td>' +
        '<td style="padding:8px 14px;color:#555;text-align:right">' + (r.spot_price_per_hour ? '$' + r.spot_price_per_hour.toFixed(4) + '/hr' : '—') + '</td>' +
        '<td style="padding:8px 14px;color:#555">' + r.region + '</td>';
      tbody.appendChild(tr);
    });
  };

  setTimeout(function() {
    if (!done) {
      delete window[cbName];
      var tbody = document.getElementById('cc-rows');
      if (tbody && !tbody.children.length) tbody.innerHTML = '<tr><td colspan="5" style="padding:12px 14px;color:#555;text-align:center">Could not load prices — check API_KEY</td></tr>';
    }
  }, 5000);

  var s = document.createElement('script');
  s.onerror = function() {
    delete window[cbName];
    var tbody = document.getElementById('cc-rows');
    if (tbody) tbody.innerHTML = '<tr><td colspan="5" style="padding:12px 14px;color:#555;text-align:center">Could not load prices — check API_KEY</td></tr>';
  };
  var url = 'https://computecomparison.com/api/v1/prices?sort=price&per_page=' + MAX_ROWS
    + (GPU_FILTER ? '&gpu=' + encodeURIComponent(GPU_FILTER) : '')
    + '&api_key=' + encodeURIComponent(API_KEY)
    + '&callback=' + cbName;
  s.src = url;
  document.head.appendChild(s);
})();
</script>

Price Badge

Inline badge showing the best current price for a single GPU model.

Preview (loading…)

Loading live data…
HTML + JavaScript
<!-- Best GPU Price Badge — computecomparison.com -->
<div id="cc-badge" style="display:inline-flex;align-items:center;gap:10px;font-family:ui-monospace,monospace;background:#0a0a0f;border:1px solid #1e1e2e;border-radius:8px;padding:10px 16px">
  <span style="font-size:11px;color:#555" id="cc-badge-gpu">H100 80GB</span>
  <span style="font-size:18px;font-weight:700;color:#00ff88" id="cc-badge-price">—</span>
  <span style="font-size:10px;color:#555">/hr</span>
  <span style="font-size:10px;color:#333">·</span>
  <span style="font-size:10px;color:#555" id="cc-badge-provider">—</span>
  <a href="https://computecomparison.com" target="_blank" rel="noopener" style="font-size:9px;color:#333;text-decoration:none;margin-left:4px">CC ↗</a>
</div>
<script>
(function() {
  var API_KEY = 'YOUR_API_KEY';
  var GPU = 'H100 80GB'; // exact model name
  var done = false;
  var cbName = '__ccBadge_' + Math.random().toString(36).slice(2);

  window[cbName] = function(json) {
    done = true;
    delete window[cbName];
    var match = (json.data || []).find(function(g) {
      return g.gpu_model.toLowerCase() === GPU.toLowerCase();
    });
    if (!match) return;
    var el = document.getElementById('cc-badge-price');
    var prov = document.getElementById('cc-badge-provider');
    var gpuEl = document.getElementById('cc-badge-gpu');
    if (el) el.textContent = '$' + match.best_price_per_hour.toFixed(4);
    if (prov) prov.textContent = match.best_provider || '';
    if (gpuEl) gpuEl.textContent = match.gpu_model;
  };

  setTimeout(function() { if (!done) delete window[cbName]; }, 5000);

  var s = document.createElement('script');
  s.src = 'https://computecomparison.com/api/v1/prices/gpus?api_key=' + encodeURIComponent(API_KEY) + '&callback=' + cbName;
  s.onerror = function() { delete window[cbName]; };
  document.head.appendChild(s);
})();
</script>

Compact List

Compact card showing best prices for a configurable list of GPU models.

Preview (loading…)

Loading live data…
HTML + JavaScript
<!-- Compact GPU Price List — computecomparison.com -->
<div id="cc-compact" style="font-family:ui-monospace,monospace;background:#0a0a0f;border:1px solid #1e1e2e;border-radius:10px;padding:16px;max-width:340px">
  <div style="font-size:11px;color:#00ff88;font-weight:700;letter-spacing:.08em;text-transform:uppercase;margin-bottom:12px">Best GPU Prices</div>
  <div id="cc-compact-list" style="display:flex;flex-direction:column;gap:8px"></div>
  <div style="margin-top:12px;font-size:10px;color:#333">
    <a href="https://computecomparison.com" target="_blank" rel="noopener" style="color:#00ff88;text-decoration:none">View all on ComputeComparison ↗</a>
  </div>
</div>
<script>
(function() {
  var API_KEY = 'YOUR_API_KEY';
  var GPUS = ['H100 80GB', 'A100 80GB', 'RTX 4090', 'A10G']; // models to show
  var done = false;
  var cbName = '__ccCompact_' + Math.random().toString(36).slice(2);

  window[cbName] = function(json) {
    done = true;
    delete window[cbName];
    var list = document.getElementById('cc-compact-list');
    if (!list) return;
    (json.data || [])
      .filter(function(g) { return GPUS.indexOf(g.gpu_model) !== -1; })
      .sort(function(a, b) { return GPUS.indexOf(a.gpu_model) - GPUS.indexOf(b.gpu_model); })
      .forEach(function(g) {
        var row = document.createElement('div');
        row.style.cssText = 'display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#111118;border-radius:6px';
        row.innerHTML =
          '<span style="color:#c9d1d9;font-size:12px">' + g.gpu_model + '</span>' +
          '<div style="text-align:right">' +
            '<span style="color:#00ff88;font-size:13px;font-weight:700">$' + g.best_price_per_hour.toFixed(4) + '</span>' +
            '<span style="color:#555;font-size:10px">/hr</span>' +
            '<div style="color:#555;font-size:10px">' + (g.best_provider || '') + '</div>' +
          '</div>';
        list.appendChild(row);
      });
  };

  setTimeout(function() {
    if (!done) {
      delete window[cbName];
      var list = document.getElementById('cc-compact-list');
      if (list && !list.children.length) list.innerHTML = '<div style="color:#555;font-size:11px;padding:6px 0">Could not load prices — check API_KEY</div>';
    }
  }, 5000);

  var s = document.createElement('script');
  s.src = 'https://computecomparison.com/api/v1/prices/gpus?api_key=' + encodeURIComponent(API_KEY) + '&callback=' + cbName;
  s.onerror = function() {
    delete window[cbName];
    var list = document.getElementById('cc-compact-list');
    if (list) list.innerHTML = '<div style="color:#555;font-size:11px;padding:6px 0">Could not load prices — check API_KEY</div>';
  };
  document.head.appendChild(s);
})();
</script>

GPU Webhooks

Subscribe to real-time GPU price change events. When GPU prices shift, ComputeComparison POSTs a signed JSON payload to your URL — no polling required.

Event Types

EventFires when
price.updatedAny GPU price changes (up or down). Default.
price.dropOne or more GPU prices decrease.
price.spikeOne or more GPU prices increase.

Payload Shape

JSON — POST body sent to your URL
{
  "event": "price.drop",
  "api_version": "v1",
  "fired_at": "2025-01-15T12:15:00.000Z",
  "changes": [
    {
      "provider": "RunPod",
      "gpu_model": "H100 80GB",
      "region": "US-TX-3",
      "old_price": 2.99,
      "new_price": 2.49,
      "change_pct": -16.72,
      "availability": "high"
    }
  ]
}

Verifying Signatures

Every delivery includes an X-CC-Signature header. Verify it to confirm the request came from ComputeComparison and wasn't tampered with.

Node.js verification
const crypto = require('crypto');

function verifySignature(secret, rawBody, signatureHeader) {
  const expected = 'sha256=' +
    crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signatureHeader)
  );
}

// Express example
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const sig = req.headers['x-cc-signature'];
  if (!verifySignature(process.env.WEBHOOK_SECRET, req.body, sig)) {
    return res.status(401).send('Invalid signature');
  }
  const payload = JSON.parse(req.body);
  console.log(payload.event, payload.changes.length, 'changes');
  res.sendStatus(200);
});
Python verification
import hmac, hashlib

def verify_signature(secret: str, raw_body: bytes, signature_header: str) -> bool:
    expected = 'sha256=' + hmac.new(
        secret.encode(), raw_body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature_header)

# Flask example
from flask import Flask, request
app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    sig = request.headers.get('X-CC-Signature', '')
    if not verify_signature(WEBHOOK_SECRET, request.get_data(), sig):
        return 'Invalid signature', 401
    payload = request.get_json()
    print(payload['event'], len(payload['changes']), 'changes')
    return '', 200

Limits & Behaviour

  • 10 active webhooks per API key
  • Delivery timeout: 10 seconds per attempt
  • No automatic retries — use the delivery log to detect failures
  • Price changes are checked every 60 seconds
  • Delivery log retains the last 50 attempts per webhook
  • Demo key webhooks are registered but never fired