Rumble Video API

Beta

Returns a public Rumble video, short or live stream: title, full description, publish time, duration, thumbnail, the channel with its avatar, badge and follower count, views, likes and dislikes, Rumble's categories and tags, every video and audio file with its size, the caption tracks, and for live streams whether they are on air, when they started or are scheduled, and how many people are watching. Accepts every Rumble video link form, embed links included, or a bare video ID.

Get 100 free creditsAPI referenceTry it

Price
From 1 credit per request$0.75–$1.45 per 1,000 requests
Request
GET /v1/rumble/postOne API key, one JSON schema
Input
urle.g. https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html
Failed requests
Free: 0 credits

Use cases

What teams build with it. From one request.

  • Track views, likes and dislikes on Rumble videos over time
  • Monitor live streams and their concurrent viewers
  • Collect caption files and media links for analysis
  • Enrich Rumble links with titles, channels and thumbnails

What you get

Posts in one schema. The same on every platform.

platformstring
Platform ID (tiktok, youtube, …).
idstring
Platform-native post ID (string; Instagram shortcode, Reddit without t3_).
urlstring
Canonical post URL.
typestring
Normalized content shape. New values may be added; treat unknown values as other.
platform_typestring
The platform's own product label, lowercase (reel, short, story, live, tweet, …).
titlestring
Headline (YouTube title, Reddit title); null on caption-only platforms.
textstring
Caption, description or body as plain text.
languagestring
BCP-47 language of text, when the platform states it.

Every field, its type and when it is null: the response reference and the post schema.

Example request

cURL
curl -G 'https://staging.socialtap.dev/v1/rumble/post' \
  --data-urlencode 'url=https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html' \
  -H "x-api-key: $SOCIALTAP_API_KEY"
Node.js
const params = new URLSearchParams({
  url: "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html",
});
const res = await fetch(`https://staging.socialtap.dev/v1/rumble/post?${params}`, {
  headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, meta } = body;
console.log(data, meta.credits_charged);
Python
import os

import requests

res = requests.get(
    "https://staging.socialtap.dev/v1/rumble/post",
    params={"url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"},
    headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
    raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, meta = body["data"], body["meta"]
print(data, meta["credits_charged"])
Go
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"net/url"
	"os"
)

func main() {
	q := url.Values{}
	q.Set("url", "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html")
	req, err := http.NewRequest("GET", "https://staging.socialtap.dev/v1/rumble/post?"+q.Encode(), nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	var body struct {
		Data  json.RawMessage `json:"data"`
		Meta  map[string]any  `json:"meta"`
		Error *struct {
			Code    string `json:"code"`
			Message string `json:"message"`
		} `json:"error"`
	}
	if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
		log.Fatal(err)
	}
	if body.Error != nil {
		log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
	}
	fmt.Println(string(body.Data), body.Meta["credits_charged"])
}
PHP
<?php

$query = http_build_query([
    'url' => 'https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html',
]);
$ch = curl_init('https://staging.socialtap.dev/v1/rumble/post?' . $query);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['x-api-key: ' . getenv('SOCIALTAP_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
    throw new RuntimeException($body['error']['code'] . ': ' . $body['error']['message']);
}
print_r($body['data']);
echo $body['meta']['credits_charged'], PHP_EOL;
Ruby
require "json"
require "net/http"

uri = URI("https://staging.socialtap.dev/v1/rumble/post")
uri.query = URI.encode_www_form('url' => 'https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html')
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("SOCIALTAP_API_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }
body = JSON.parse(res.body)
raise "#{body["error"]["code"]}: #{body["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
pp body["data"]
puts body["meta"]["credits_charged"]
Java
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) throws Exception {
        String query = "url=" + encode("https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html");
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://staging.socialtap.dev/v1/rumble/post?" + query))
            .header("x-api-key", System.getenv("SOCIALTAP_API_KEY"))
            .GET()
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        // An error is {"error": {"code", "message", ...}}; success is {data, meta}, meta.credits_charged its price.
        if (response.statusCode() >= 400) throw new RuntimeException(response.body());
        System.out.println(response.body());
    }

    static String encode(String value) {
        return URLEncoder.encode(value, StandardCharsets.UTF_8);
    }
}
.NET
using System.Text.Json;

using var http = new HttpClient();
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("SOCIALTAP_API_KEY"));

var query = string.Join("&",
    "url=" + Uri.EscapeDataString("https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"));
var res = await http.GetAsync("https://staging.socialtap.dev/v1/rumble/post?" + query);
using var body = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
if (!res.IsSuccessStatusCode)
{
    var error = body.RootElement.GetProperty("error");
    throw new Exception($"{error.GetProperty("code")}: {error.GetProperty("message")}");
}
Console.WriteLine(body.RootElement.GetProperty("data"));
Console.WriteLine(body.RootElement.GetProperty("meta").GetProperty("credits_charged"));
Rust
// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use std::env;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let res = reqwest::blocking::Client::new()
        .get("https://staging.socialtap.dev/v1/rumble/post")
        .query(&[("url", "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html")])
        .header("x-api-key", env::var("SOCIALTAP_API_KEY")?)
        .send()?;
    let ok = res.status().is_success();
    let body: serde_json::Value = res.json()?;
    if !ok {
        return Err(format!("{}: {}", body["error"]["code"], body["error"]["message"]).into());
    }
    println!("{} {}", body["data"], body["meta"]["credits_charged"]);
    Ok(())
}
200 OK
{
  "data": {
    "approximate_fields": [
      "platform_specific.rumble.author_follower_count"
    ],
    "author": {
      "avatar_url": "https://hugh.cdn.rumble.cloud/video/z8/g/D/5/d/gD5da.baa.2-GGreenwald-rml416.png",
      "display_name": "Glenn Greenwald",
      "id": "_c1021766",
      "is_verified": true,
      "url": "https://rumble.com/c/GGreenwald",
      "username": "GGreenwald"
    },
    "coauthors": [],
    "duration_ms": 1678000,
    "hashtags": [],
    "id": "v79xhhm",
    "is_nsfw": null,
    "is_pinned": null,
    "is_sponsored": null,
    "language": null,
    "media": [
      {
        "alt_text": null,
        "duration_ms": 1678000,
        "expires_at": null,
        "height": 1080,
        "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/1/k/V/p/o/kVpoA.qR4e-small-DISCOVERY-Why-Glenn-WANTS-I..jpg",
        "type": "video",
        "url": "https://rumble.com/hls-vod/vjXafkcCce8/playlist.m3u8",
        "width": 1920
      }
    ],
    "mentions": [],
    "metrics": {
      "comment_count": 22,
      "like_count": 209,
      "quote_count": null,
      "repost_count": null,
      "save_count": null,
      "share_count": null,
      "view_count": 25366
    },
    "platform": "rumble",
    "platform_specific": {
      "rumble": {
        "author_follower_count": 584000,
        "caption_tracks": [
          {
            "is_auto_generated": true,
            "label": "English (auto)",
            "language": "en",
            "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/11/k/V/p/o/kVpoA.fn8Si.1.vtt"
          }
        ],
        "category": "News",
        "concurrent_viewer_count": null,
        "dislike_count": 4,
        "embed_id": "v77qthe",
        "embed_url": "https://rumble.com/embed/v77qthe/",
        "files": [
          {
            "bitrate_kbps": 2142,
            "format": "tar",
            "height": 720,
            "kind": "video",
            "size_bytes": 449566720,
            "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/2/k/V/p/o/kVpoA.gaa.tar?r_file=chunklist.m3u8&r_type=application%2Fvnd.apple.mpegurl&r_range=449539072-449555872",
            "width": 1280
          },
          {
            "bitrate_kbps": 1059,
            "format": "tar",
            "height": 480,
            "kind": "video",
            "size_bytes": 222300160,
            "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/2/k/V/p/o/kVpoA.caa.tar?r_file=chunklist.m3u8&r_type=application%2Fvnd.apple.mpegurl&r_range=222280704-222297420",
            "width": 854
          },
          {
            "bitrate_kbps": 679,
            "format": "tar",
            "height": 360,
            "kind": "video",
            "size_bytes": 142510080,
            "url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/2/k/V/p/o/kVpoA.baa.tar?r_file=chunklist.m3u8&r_type=application%2Fvnd.apple.mpegurl&r_range=142485504-142502129",
            "width": 640
          }
        ],
        "is_age_restricted": null,
        "is_live_now": false,
        "keywords": [],
        "live_started_at": null,
        "numeric_id": "436271810",
        "scheduled_start_at": null,
        "secondary_category": "Politics"
      }
    },
    "platform_type": "video",
    "published_at": "2026-05-16T11:31:27Z",
    "text": "Follow Glenn Greenwald's writing and other journalism at Substack, where you can become a member: https://greenwald.substack.com/\n\nAll videos now available as a podcast! Find full episodes here: https://linktr.ee/systemupdate_\n\nFollow Glenn:\nTwitter: https://twitter.com/ggreenwal…",
    "thumbnail_url": "https://hugh.cdn.rumble.cloud/video/fwe2/2f/s8/1/k/V/p/o/kVpoA.qR4e-small-DISCOVERY-Why-Glenn-WANTS-I..jpg",
    "title": "DISCOVERY: Why Glenn WANTS Israel to Sue The New York Times",
    "type": "video",
    "unknown_fields": [],
    "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
  },
  "meta": {
    "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
    "platform": "rumble",
    "source": "page",
    "is_cached": false,
    "credits_charged": 1,
    "latency_ms": 0,
    "fetched_at": "2026-10-25T12:00:00Z",
    "input": {
      "kind": "video",
      "id": "v79xhhm",
      "url": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
    },
    "credits_remaining": 9999,
    "client_request_id": null,
    "warnings": [],
    "mode": "live"
  }
}

Long arrays and strings are shortened for display; real responses are complete.

Pricing

Pay per request. Only when it succeeds.

SourcePrice per successful requestPer 1,000 requests
Public page page1 credit$0.75–$1.45
  • Failed requests are free: errors cost 0 credits.
  • Cache hits are free: responses served from the cache cost 0 credits.
  • Credits never expire.
  • One credit balance for every endpoint and platform.

Credit packs · How this endpoint is priced · How credits work

FAQ

Questions, answered.

How much does the Rumble Video API cost?
1 credit for public page results (meta.source = page), charged only for successful requests. SocialTap credits cost $0.75–$1.45 per 1,000 depending on the pack.
Am I charged for failed requests?
No. Requests that return an error cost 0 credits. Responses served from the cache are free too.

Start with 100 free credits. No card required.

Test keys answer every endpoint from recorded responses, free, so you can build before you spend. Failed requests are always free.

Get your API keyRead the API reference