CUBSOFTWARE// CUB // CORRUPTED
Public API — Free to Use
← All APIs

Meme API

A random meme by category. Free, no key, no account.

52
Meme Categories
FREE
No API Key Needed
JSON
Response Format
Base URL
Base https://cubsoftware.site
Authentication
No API key required — all listed endpoints are publicly accessible.
Please include a descriptive User-Agent header identifying your app.
Meme API
GET /api/memes/{category} Fetch a random meme

Returns a random meme from the specified category. Results are always SFW and non-spoiler filtered.

ParameterTypeRequiredDescription
category string optional Meme category (see list below). Defaults to random if omitted.
Example Response
"url":      "https://i.redd.it/abc123.jpg",
"title":    "When the code works first try",
"text":     null,
"type":     "image",  // "image" | "text"
"category": "programmer",
"author":   "CUBSOFTWARE"
curl https://cubsoftware.site/api/memes/dank
GET /api/memes/categories List all categories

Returns a sorted list of all valid category names.

Example Response
"categories": [
  "animals", "anime", "based", "boomer", "car", "cat", 
  "chess", "cringe", "cursed", "dad", "dank", "dark", 
  "deep-fried", "dog", "engineering", "fallout", "food", "gaming", 
  "genshin", "genz", "gif", "history", "irl", "linux", 
  "lotr", "math", "medical", "minecraft", "music", "npc", 
  "office", "pokemon", "programmer", "pun", "random", "reaction", 
  "roblox", "science", "shitpost", "skull", "skyrim", "space", 
  "spongebob", "sports", "starwars", "superhero", "surreal", "trending", 
  "twitter", "valorant", "vibe", "wholesome"
]
GET /api/memes Random meme (no category)

Shorthand for /api/memes/random — picks from the best subreddits automatically.

Discord Bot Examples

Drop-in examples for adding a /meme slash command to your Discord bot using the CUB SOFTWARE API. Each example registers the command and sends the image — copy, paste, add your token.

// npm install discord.js const { Client, GatewayIntentBits, SlashCommandBuilder, EmbedBuilder } = require('discord.js'); const client = new Client({ intents: [GatewayIntentBits.Guilds] }); client.once('ready', async () => { await client.application.commands.create( new SlashCommandBuilder() .setName('meme') .setDescription('Get a random meme') .addStringOption(o => o .setName('category') .setDescription('Meme category (optional)') .setRequired(false)) ); console.log('Ready!'); }); client.on('interactionCreate', async interaction => { if (!interaction.isChatInputCommand() || interaction.commandName !== 'meme') return; await interaction.deferReply(); const category = interaction.options.getString('category') || 'random'; const res = await fetch(`https://cubsoftware.site/api/memes/${category}`); const meme = await res.json(); if (meme.type === 'text') { const embed = new EmbedBuilder() .setTitle(meme.title) .setDescription(meme.text) .setColor(0x5865F2); return interaction.editReply({ embeds: [embed] }); } const embed = new EmbedBuilder() .setImage(meme.url) .setColor(0x5865F2); return interaction.editReply({ embeds: [embed] }); }); client.login('YOUR_BOT_TOKEN');

Want /meme dank, /meme cat etc. as separate subcommands?

Instead of a string option, register each category as its own subcommand. Replace the command registration in the examples above with the snippet below, then read getSubcommand() / interaction.data.options[0].name in your handler instead of getString('category').

const CATEGORIES = [ 'random', 'dank', 'dark', 'wholesome', 'cursed', 'gaming', 'programmer', 'genz', 'surreal', 'anime', 'cat', 'dog', 'shitpost', 'deep-fried', 'pun', 'dad', 'twitter', 'vibe', 'based', 'skull', 'cringe', 'boomer', 'npc', 'trending', 'irl' ]; // Replace the commands.create() call with this: const cmd = new SlashCommandBuilder().setName('meme').setDescription('Get a meme'); for (const cat of CATEGORIES) { cmd.addSubcommand(sub => sub.setName(cat).setDescription(`Get a ${cat} meme`)); } await client.application.commands.create(cmd); // In your handler, replace getString('category') with: const category = interaction.options.getSubcommand();
CATEGORIES = [ 'random', 'dank', 'dark', 'wholesome', 'cursed', 'gaming', 'programmer', 'genz', 'surreal', 'anime', 'cat', 'dog', 'shitpost', 'deep-fried', 'pun', 'dad', 'twitter', 'vibe', 'based', 'skull', 'cringe', 'boomer', 'npc', 'trending', 'irl' ] # Replace the @tree.command block with a group + loop: meme_group = app_commands.Group(name="meme", description="Get a meme") def _register(cat): @meme_group.command(name=cat, description=f"Get a {cat} meme") async def _cmd(interaction: discord.Interaction): await meme(interaction, cat) # reuse your existing handler for cat in CATEGORIES: _register(cat) tree.add_command(meme_group)
import net.dv8tion.jda.api.interactions.commands.build.*; import java.util.List; static final List<String> CATS = List.of( "random", "dank", "dark", "wholesome", "cursed", "gaming", "programmer", "genz", "surreal", "anime", "cat", "dog", "shitpost", "deep-fried", "pun", "dad", "twitter", "vibe", "based", "skull", "cringe", "boomer", "npc", "trending", "irl" ); // Replace upsertCommand("meme", ...) with: var cmd = Commands.slash("meme", "Get a meme"); for (String cat : CATS) { cmd.addSubcommands(new SubcommandData(cat, "Get a " + cat + " meme")); } jda.upsertCommand(cmd).queue(); // In your handler, replace getOption("category") with: String cat = e.getSubcommandName();
var CATS = new[] { "random", "dank", "dark", "wholesome", "cursed", "gaming", "programmer", "genz", "surreal", "anime", "cat", "dog", "shitpost", "deep-fried", "pun", "dad", "twitter", "vibe", "based", "skull", "cringe", "boomer", "npc", "trending", "irl" }; // Replace CreateGlobalApplicationCommandAsync with: var cmd = new SlashCommandBuilder().WithName("meme").WithDescription("Get a meme"); foreach (var cat in CATS) { cmd.AddOption(new SlashCommandOptionBuilder() .WithName(cat).WithDescription($"Get a {cat} meme") .WithType(ApplicationCommandOptionType.SubCommand)); } await client.CreateGlobalApplicationCommandAsync(cmd.Build()); // In your handler, replace the Options lookup with: var cat = ((SocketSlashCommandDataOption)cmd.Data.Options.First()).Name;
Categories
🎲random
🐾animals
🎌anime
📗based
🧓boomer
🚗car
🐱cat
♟️chess
😬cringe
😱cursed
👨dad
🔥dank
🖤dark
🍳deep-fried
🐶dog
⚙️engineering
☢️fallout
🍔food
🎮gaming
🌸genshin
✨genz
🎞️gif
📜history
🤓irl
🐧linux
💍lotr
➗math
🩺medical
⛏️minecraft
🎵music
🤖npc
🏢office
⚡pokemon
💻programmer
😄pun
😮reaction
🧱roblox
🔬science
💩shitpost
💀skull
🐉skyrim
🚀space
🧽spongebob
🏀sports
🌌starwars
🦸superhero
🌀surreal
📈trending
🐦twitter
🎯valorant
😎vibe
💛wholesome
Try it Live

Playground

Pick a category and fetch a real meme right now.

Fair Use
10 requests / second per IP. Exceeding this returns HTTP 429.
All results are SFW and non-spoiler filtered.
Coming Soon

More APIs are planned. Check back — we'll document everything here as it ships.