elonmu.sh Fork me, Daddy /s (source on GitHub, opens in a new tab)

API docs

Five endpoints. No key, no signup, no SDK, no parameters, no point. All GET, all JSON. /s

GET /api/news

Returns one random English-language news article about Elon Musk, picked from the latest page of NewsAPI results. No parameters, no headers, no API key.

Response fields

FieldTypeDescription
sourcestringPublication name
titlestringHeadline
descriptionstring | nullSummary from the publisher
urlstringLink to the full article
urlImagestring | nullLead image URL
publishDatestringISO 8601 timestamp
Request
curl https://elonmu.sh/api/news
Response · 200
{
  "source": "Business Insider",
  "title": "Wizards, horses, flip phones and AI: Elon Musk's 10 most colorful quotes from Tesla's investor day",
  "description": "Musk joked about charging mishaps, hailed the complexity of the human brain, and voiced his fears about the rise of artificial intelligence.",
  "url": "https://markets.businessinsider.com/news/stocks/elon-musk-tesla-investor-day-ai-electric-vehicles-self-driving-2023-3",
  "urlImage": "https://i.insider.com/64007dd7ce4a630019955630?width=1200&format=jpeg",
  "publishDate": "2023-03-02T11:37:41Z"
}

GET /api/jet/flights

Every private-jet flight this year, with the fuel bill. The flights come from the public posts of @elonjet.net by Jack Sweeney on Bluesky.

Response fields

FieldTypeDescription
yearnumberThe year the flights are from (UTC)
updatedAtstringWhen the flights were read, ISO 8601
attributionobjectlabel and url of the source
flightsarrayThis year's flights, newest first
flights[].idstringThe post the flight was read from
flights[].tailstringTail number, or "Unknown"
flights[].from, .toobject | nullPlace name, lat and lon
flights[].departedAt, .landedAtstring | nullISO 8601 timestamps
flights[].durationMinnumber | nullMinutes in the air
flights[].fuelobject | nullgallons, usd and co2Tons burned
flights[].statusstring"landed" or "airborne"
flights[].sourceUrlstring | nullLink to the post
totalsobjectThe year's flights, gallons, usd, co2Tons and hours
  • flights is newest first. The example is trimmed to one flight.
  • A field is null when the posts don't say: a flight still in the air has no to or landedAt, and fuel waits for the fuel reply.
Request
curl https://elonmu.sh/api/jet/flights
Response · 200
{
  "year": 2026,
  "updatedAt": "2026-10-28T09:12:44.000Z",
  "attribution": {
    "label": "@elonjet.net by Jack Sweeney",
    "url": "https://bsky.app/profile/elonjet.net"
  },
  "flights": [
    {
      "id": "3mxq2c7tluk2a",
      "tail": "N628TS",
      "from": {
        "name": "Austin, Texas, United States",
        "lat": 30.2672,
        "lon": -97.7431
      },
      "to": {
        "name": "San Jose, California, United States",
        "lat": 37.3362,
        "lon": -121.8906
      },
      "departedAt": "2026-10-27T15:02:11.000Z",
      "landedAt": "2026-10-27T18:21:40.000Z",
      "durationMin": 199,
      "fuel": {
        "gallons": 1032,
        "usd": 7276,
        "co2Tons": 9.86
      },
      "status": "landed",
      "sourceUrl": "https://bsky.app/profile/elonjet.net/post/3mxq2c7tluk2a"
    }
  ],
  "totals": {
    "flights": 324,
    "gallons": 157525,
    "usd": 1109406,
    "co2Tons": 1657.6,
    "hours": 529.1
  }
}

GET /api/hype

Daily views of the English Wikipedia article "Elon Musk" for the last year, with the biggest spikes named. The views come from Wikimedia's pageview API (users only, known bots excluded).

Response fields

FieldTypeDescription
articlestringThe article, "Elon Musk"
fromstringFirst day returned, YYYY-MM-DD
tostringLast day returned, YYYY-MM-DD
updatedAtstringWhen the views were read, ISO 8601
attributionobjectlabel and url of the source
daysarraydate and views for each day, oldest first
statsobjecttotal, median and the peak day
spikesarrayThe five busiest days, with timesMedian
  • days is oldest first, in chart order. The example is trimmed to one day and one spike.
  • The window ends yesterday (UTC). Days Wikimedia has no data for are left out, not zero-filled.
  • stats.median is the middle day's views, a whole number. With an even number of days it is the mean of the two middle days, rounded.
  • spikes is highest first, each at least 7 days from any busier one. timesMedian is that day's views over the median, to one decimal.
Request
curl https://elonmu.sh/api/hype
Response · 200
{
  "article": "Elon Musk",
  "from": "2025-10-27",
  "to": "2026-10-26",
  "updatedAt": "2026-10-27T09:12:44.000Z",
  "attribution": {
    "label": "Wikimedia pageviews (en.wikipedia, users only)",
    "url": "https://pageviews.wmcloud.org/?project=en.wikipedia.org&pages=Elon_Musk"
  },
  "days": [
    {
      "date": "2025-10-27",
      "views": 19194
    }
  ],
  "stats": {
    "total": 8678483,
    "median": 20803,
    "peak": {
      "date": "2026-06-12",
      "views": 194434
    }
  },
  "spikes": [
    {
      "date": "2026-06-12",
      "views": 194434,
      "timesMedian": 9.3
    }
  ]
}

GET /api/doge

Dogecoin's price now against the minute he went on air hosting Saturday Night Live, 8 May 2021. The live price comes from CoinGecko.

Response fields

FieldTypeDescription
coinstring"Dogecoin"
snlobjectat, usd and source of the price at showtime
nowobjectat and usd of the live price
changePercentnumber(now ÷ SNL − 1) × 100, to one decimal
thousandDollarsNownumberWhat $1,000 of DOGE bought at showtime is worth now, to the cent
attributionobjectlabel and url of the live price
  • snl never changes. CoinGecko's free history only goes back 365 days, so the SNL price is a constant: the open of Binance's DOGE/USDT 1-minute candle at 11:30 pm EDT on 8 May 2021. snl.source.url returns that candle. USDT is taken as USD.
  • now.at is when CoinGecko last updated its price, not when you asked.
  • Both figures are computed from the unrounded prices.
Request
curl https://elonmu.sh/api/doge
Response · 200
{
  "coin": "Dogecoin",
  "snl": {
    "at": "2021-05-09T03:30:00.000Z",
    "usd": 0.67343,
    "source": {
      "label": "Binance DOGE/USDT, 1-minute open at showtime",
      "url": "https://data-api.binance.vision/api/v3/klines?symbol=DOGEUSDT&interval=1m&startTime=1620531000000&limit=1"
    }
  },
  "now": {
    "at": "2026-10-28T04:30:56.000Z",
    "usd": 0.079484
  },
  "changePercent": -88.2,
  "thousandDollarsNow": 118.03,
  "attribution": {
    "label": "Data provided by CoinGecko",
    "url": "https://www.coingecko.com/en/coins/dogecoin"
  }
}

Errors

Errors come back as JSON with a single error message. When an upstream (NewsAPI, Bluesky, Wikimedia, CoinGecko, CelesTrak) is down, the status is still 200: we are fine, it is the world that failed. Our own mistakes are a 500.

StatusWhen
200An upstream returned an error or never answered
500Something broke on our side
404Any other path. The body is plain text: does not compute...

Caching

Each endpoint keeps its last good answer. When the upstream fails after one good load, you get that answer instead of an error.

EndpointRefreshed everyWhen the upstream fails
/api/news15 minPicks from the last good articles, asks again after a minute
/api/jet/flights5 minServes this year's last good flights
/api/hype4 hServes the last good year, asks again after a minute
/api/doge5 minServes the last good price, asks again after a minute
/api/starlink6 h orbits, 12 h re-entriesServes the last good orbits and re-entries, asks again after a minute, or after 2 hours if CelesTrak refused
Response · 200
{
  "error": "There was an error with NewsAPI. Please try again later."
}
A rocket breaking apart mid-flight
Fig. 1: a 500, in production.