v1.0 • REST API

Minerva Public REST API

Free, open, real-time API for Discord bots, web apps, and Fallout 76 community tools.

Base URLhttps://whereisminerva.info
AuthNone (100% Free)
CORSEnabled (*)
FormatJSON (UTF-8)
GET

/api/v1/minerva

Status & Stock

Returns Minerva's live status in Fallout 76: whether she is currently present, her exact Appalachia location, startsAt and endsAt reset timestamps, item inventory, and next visit info.

Test Endpoint

GEThttps://whereisminerva.info/api/v1/minerva

Code Examples

curl -X GET "https://whereisminerva.info/api/v1/minerva" \
  -H "Accept: application/json"
🤖

Building a Discord Bot?

The API is 100% public, CORS-enabled, and requires no API key or token. Timestamps include Unix epoch seconds (startsAtUnix, endsAtUnix) for instant native Discord countdowns. (<t:TIMESTAMP:R>).

// Slash Command: /minerva (Discord.js v14)
import { SlashCommandBuilder, EmbedBuilder } from 'discord.js';

export const data = new SlashCommandBuilder()
  .setName('minerva')
  .setDescription('Check Minerva live location, countdown, and stock in Fallout 76');

export async function execute(interaction) {
  const res = await fetch('https://whereisminerva.info/api/v1/minerva');
  const { data } = await res.json();

  const embed = new EmbedBuilder()
    .setTitle(data.isActive ? `Minerva is at ${data.location.nameEn}!` : 'Minerva is currently away')
    .setColor(data.isActive ? 0x8ba358 : 0x555555);

  if (data.isActive) {
    embed
      .setDescription(`📍 **Location:** ${data.location.nameEn} (${data.location.coordinates})\n⏳ **Leaves:** <t:${data.endsAtUnix}:R> (<t:${data.endsAtUnix}:f>)`)
      .setImage(data.location.imageUrl)
      .addFields({
        name: `Featured Plans (${data.inventory.totalItems} total)`,
        value: data.inventory.preview.map(i => `• **${i.name}** — ${i.priceGold} Gold`).join('\n') || 'None'
      });
  } else if (data.nextVisit) {
    embed.setDescription(`📍 **Next Visit:** ${data.nextVisit.location.nameEn}\n⏳ **Arrives:** <t:${data.nextVisit.startsAtUnix}:R> (<t:${data.nextVisit.startsAtUnix}:f>)`);
  }

  await interaction.reply({ embeds: [embed] });
}