diff --git a/package.json b/package.json
index e29fc03..2ba2f75 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "alphaday",
"private": true,
- "version": "1.3.12",
+ "version": "1.3.13",
"homepage": ".",
"scripts": {
"dev": "vite",
@@ -10,6 +10,7 @@
"build-sitemap": "node scripts/build-sitemap.js"
},
"dependencies": {
+ "lucide-react": "^0.400.0",
"node-fetch": "2",
"react": "^18.0.0",
"react-dom": "^18.0.0",
diff --git a/src/App.jsx b/src/App.jsx
index 869d63e..6c34715 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -6,6 +6,7 @@ import HomeContainer from "./containers/HomeContainer";
import { CookieProvider } from "./utils/CookieContext";
import PrivacyPolicyPage from "./pages/privacy-policy";
import MobilePage from "./pages/mobile-app";
+import ApiPage from "./pages/api";
import { useEffect } from "react";
import { navigateToHash } from "./utils/navigateToHash";
@@ -16,6 +17,7 @@ function removeTrailingBackSlash(site) {
const otherPages = {
[CONFIG.privacyPolicy]: ,
[CONFIG.mobile]: ,
+ [CONFIG.api]: ,
};
function App() {
diff --git a/src/assets/css/alphaday.css b/src/assets/css/alphaday.css
index 3ef7dd2..1c09aa7 100644
--- a/src/assets/css/alphaday.css
+++ b/src/assets/css/alphaday.css
@@ -17,6 +17,54 @@
@tailwind components;
@tailwind utilities;
+@layer components {
+ .btn-primary {
+ background-color: #faa202;
+ color: #121212;
+ font-weight: 600;
+ transition:
+ transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94),
+ background-color 0.2s ease;
+ }
+ .btn-primary:hover {
+ transform: translateY(-1px);
+ background-color: #ffb84d;
+ }
+}
+
+@layer utilities {
+ .hide-scrollbar::-webkit-scrollbar {
+ display: none;
+ }
+ .hide-scrollbar {
+ -ms-overflow-style: none;
+ scrollbar-width: none;
+ }
+}
+
+/* ---- API landing page scoped styles ---- */
+.api-root {
+ position: relative;
+}
+
+/* Noise overlay — scoped to .api-root so it doesn't affect other pages */
+.api-root::before {
+ content: "";
+ position: fixed;
+ inset: 0;
+ z-index: 9999;
+ pointer-events: none;
+ opacity: 0.04;
+ background: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E");
+}
+
+.api-root .interactive-element {
+ transition: transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+}
+.api-root .interactive-element:hover {
+ transform: translateY(-1px);
+}
+
@font-face {
font-family: titling;
font-weight: 400;
diff --git a/src/components/navbar/Navbar.jsx b/src/components/navbar/Navbar.jsx
index f1af669..bd93566 100644
--- a/src/components/navbar/Navbar.jsx
+++ b/src/components/navbar/Navbar.jsx
@@ -89,10 +89,10 @@ function Navbar({ isPrivacyPolicy, isMobile }) {
diff --git a/src/components/ui/CodeBlock.jsx b/src/components/ui/CodeBlock.jsx
new file mode 100644
index 0000000..a890501
--- /dev/null
+++ b/src/components/ui/CodeBlock.jsx
@@ -0,0 +1,93 @@
+import { useState } from "react";
+import { Check, Copy } from "lucide-react";
+
+export function CodeBlock({
+ code,
+ language = "bash",
+ className = "",
+ annotated = false,
+}) {
+ const [copied, setCopied] = useState(false);
+
+ const handleCopy = async () => {
+ try {
+ await navigator.clipboard.writeText(code);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ } catch (err) {
+ // no-op
+ }
+ };
+
+ const getHighlightedContent = () => {
+ if (language === "bash") {
+ return code.split("\n").map((line, i) => {
+ const parts = line.split(/(curl|https:\/\/[^\s"'<]+)/g);
+ return (
+
+ {line.startsWith("$") && (
+ $
+ )}
+ {parts.map((part, j) => {
+ if (part === "curl")
+ return (
+
+ {part}
+
+ );
+ if (part.startsWith("https://"))
+ return (
+
+ {part}
+
+ );
+ return {part.replace(/^\$ /, "")} ;
+ })}
+
+ );
+ });
+ }
+
+ if (language === "json") {
+ const formatted = code
+ .replace(/"([^"]+)":/g, '"$1" :')
+ .replace(/: ("[^"]+")/g, ': $1 ')
+ .replace(/(true|false|null)/g, '$1 ')
+ .replace(/: ([0-9]+)/g, ': $1 ');
+
+ return
;
+ }
+
+ return {code}
;
+ };
+
+ return (
+
+
+
+ {copied ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+ {getHighlightedContent()}
+
+
+
+
+
+ );
+}
diff --git a/src/config.js b/src/config.js
index 9e99a73..ebc7e4a 100644
--- a/src/config.js
+++ b/src/config.js
@@ -9,6 +9,7 @@ const CONFIG = {
link: "https://www.youtube.com/embed/ThCd_W3rK_8",
},
mobile: "/mobile",
+ api: "/api",
appStore: {
apple: "https://apps.apple.com/us/app/alphaday/id1581443943",
google: "https://play.google.com/store/apps/details?id=com.alphaday",
diff --git a/src/images/logo-notext.png b/src/images/logo-notext.png
new file mode 100644
index 0000000..a929c8b
Binary files /dev/null and b/src/images/logo-notext.png differ
diff --git a/src/logo.svg b/src/logo.svg
deleted file mode 100644
index 6b60c10..0000000
--- a/src/logo.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/pages/api.jsx b/src/pages/api.jsx
new file mode 100644
index 0000000..411292f
--- /dev/null
+++ b/src/pages/api.jsx
@@ -0,0 +1,630 @@
+import { useEffect, useState } from "react";
+import {
+ ArrowRight,
+ Terminal,
+ Copy,
+ Check,
+ Blocks,
+ Search,
+ Bot,
+} from "lucide-react";
+import alphaday from "../images/logo-notext.png";
+import { CodeBlock } from "../components/ui/CodeBlock";
+import Seo from "../components/seo";
+
+const heroCurl = "curl https://api.alphaday.com/search?project=arbitrum";
+const trendingCurl = "curl https://api.alphaday.com/news/trending?limit=3";
+const trendingJson = `{
+ "trending": [
+ {
+ "title": "Arbitrum DAO Passes $120M Incentive Proposal",
+ "source": "The Block",
+ "published_at": "2026-04-07T06:42:00Z",
+ "url": "https://..."
+ },
+ {
+ "title": "Ethereum Pectra Upgrade Goes Live on Testnet",
+ "source": "CoinDesk",
+ "published_at": "2026-04-07T05:18:00Z",
+ "url": "https://..."
+ },
+ {
+ "title": "Uniswap v4 Hooks Launch on Mainnet",
+ "source": "Decrypt",
+ "published_at": "2026-04-07T04:55:00Z",
+ "url": "https://..."
+ }
+ ]
+}`;
+const mcpConfig = `{
+ "mcpServers": {
+ "alphaday": {
+ "url": "https://api.alphaday.com/mcp"
+ }
+ }
+}`;
+const restCurl = "curl https://api.alphaday.com/news?tags=arbitrum";
+const finalCurl = "curl https://api.alphaday.com/news/summary";
+const docsUrl = "https://api.alphaday.com/docs";
+const githubUrl = "https://github.com/AlphadayHQ/";
+
+const tools = [
+ { name: "get_news", desc: "Real-time news from 49 crypto outlets" },
+ { name: "get_trending_news", desc: "What the crypto media is buzzing about" },
+ { name: "get_news_summary", desc: "AI-generated daily crypto briefing" },
+ { name: "get_blogs", desc: "133 project blogs, one feed" },
+ { name: "get_podcasts", desc: "118 podcast feeds, latest episodes" },
+ { name: "get_videos", desc: "121 YouTube channels, timestamped" },
+ { name: "get_events", desc: "Conferences, meetups, side events" },
+ { name: "get_dao", desc: "Live Snapshot votes across 51 DAOs" },
+ { name: "get_forum_posts", desc: "59 governance forums, one endpoint" },
+ {
+ name: "get_trending_keywords",
+ desc: "What crypto is talking about, right now",
+ },
+ { name: "search_projects", desc: "Discover tags for any project" },
+];
+
+const ApiPage = () => {
+ const [copied, setCopied] = useState(false);
+ const [isScrolled, setIsScrolled] = useState(false);
+
+ useEffect(() => {
+ const handleScroll = () => {
+ setIsScrolled(window.scrollY > 50);
+ };
+ window.addEventListener("scroll", handleScroll);
+ return () => window.removeEventListener("scroll", handleScroll);
+ }, []);
+
+ const handleHeroCopy = async () => {
+ try {
+ await navigator.clipboard.writeText(heroCurl);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ } catch (err) {
+ // no-op
+ }
+ };
+
+ return (
+
+
+
+ {/* 1. Minimal Nav */}
+
+
+
+
+
+ Alphaday API
+
+
+
+
+
+
+
+ {/* 2. Hero */}
+
+
+
+
+ All of Crypto.
+
+
+ One API.
+
+
+
+
+ 1,000+ crypto data sources. One integration. Query news, podcasts,
+ videos, DAO proposals, events, and more — filtered by project
+ or keyword.
+ Available as an MCP server or REST API.
+
+
+
+
+
+
+ {heroCurl}
+
+
+
+ {heroCurl.slice(0, Math.floor(heroCurl.length / 2) + 4)}
+
+
+ {heroCurl.slice(Math.floor(heroCurl.length / 2) + 4)}
+
+
+
+ {copied ? (
+
+ ) : (
+
+ )}
+
+
+
+ Read the docs{" "}
+
+
+
+
+
+ Returns: news,
+ blogs, podcasts, videos, DAO proposals, events, and forum posts
+ — all tagged{" "}
+
+ Arbitrum
+
+ , in one call.
+
+
+
+ {/* 3. Logo Strip */}
+
+
+
+ Built by the team behind Alphaday, trusted by
+
+
+
+ AAVE
+
+
+ AVALANCHE
+
+
+ POLYGON
+
+
+ Sui
+
+
+
+
+
+ {/* 4 & 5. The Problem & Solution */}
+
+
+
+
+ Crypto data lives across 50 different sites.
+
+
+ Your agent shouldn't have to.
+
+
+
+
+
+
+ The Solution
+
+
+ One API. Every source. Every format.
+
+
+
+
+
+
+
+
+
+
+ 1,000+ curated sources
+
+
+ News outlets, project blogs, podcasts, YouTube channels,
+ governance forums, DAO proposals, event calendars — all
+ aggregated, deduped, and tagged.
+
+
+
+
+
+
+
+
+
+ Ask by project, not endpoint
+
+
+ Want everything about Uniswap? One call. Filter across every
+ content type by project, keyword, or time range instantly.
+
+
+
+
+
+
+
+
+
MCP out of the box
+
+ Drop our MCP server into Claude Desktop, Cursor, or your own
+ agent. Tools come pre-described for LLM consumption.
+
+
+
+
+
+
+ {/* 6. Hero Demo Section */}
+
+
+
+
+
+ What's trending in crypto right now?
+
+
+ One call. Real-time. Aggregated from 49 news sources.
+
+
+
+
+
+ Agent MCP tool:{" "}
+
+ alphaday.get_trending_news()
+
+
+
+
+
+
+
+
+
+ $ curl
+ https://api.alphaday.com/news/trending?limit=3
+
+
+
+ $ {" "}
+ {trendingCurl.slice(
+ 0,
+ Math.floor(trendingCurl.length / 2) + 5,
+ )}
+
+
+ {trendingCurl.slice(
+ Math.floor(trendingCurl.length / 2) + 5,
+ )}
+
+
+
+
+
+
+
+
+ {/* 7. Tools Grid */}
+
+
+
+
+ 11 tools. Zero setup.
+
+
+ Every endpoint is also a pre-described MCP tool. Your agent
+ knows exactly what to do.
+
+
+
+
+ {tools.map((tool, i) => (
+
+
+
+ f(x)
+
+ {tool.name}
+
+
+ {tool.desc}
+
+
+ ))}
+
+
+
+
+ {/* 8. Stat Band */}
+
+
+
+
+ 1,000+
+
+
+ Data Sources
+
+
+
+
+ 500k+
+
+
+ Indexed Items
+
+
+
+
+ 11
+
+
+ Tools at Launch
+
+
+
+
+
+ {/* 9. MCP + REST */}
+
+
+
+
+ Two ways in. Same data.
+
+
+ Use our MCP server if your agent speaks MCP. Use REST if it
+ doesn't. Same endpoints, same data, same rate limits.
+
+
+
+
+
+
+
+ 1
+
+
MCP Server
+
+ claude_config.json
+
+
+
+
+
+
+
+ 2
+
+
REST API
+
+ Terminal
+
+
+
+
+
+
+
+
+ {/* 10. Pricing */}
+
+
+
+
+
+ Free. Forever-ish.
+
+
+ $0
+
+
+
+
+ All 1,000+ data
+ sources
+
+
+ All 11 tools
+
+
+ MCP and REST access
+
+
+ No API key required
+
+
+
+
+ Start building
+
+
+
+ Fair-use rate limits apply.
+
+ We'll always tell you before anything changes.
+
+
+
+
+
+ {/* 11. Final CTA */}
+
+
+
+
+ Start building. No signup.
+
+
+ Copy the command. Paste it in your terminal. That's
+ onboarding.
+
+
+
+
+
+
+
+ Read the full docs
+
+
+
+
+
+ {/* 12. Footer */}
+
+
+
+
+
+
+ Alphaday API
+
+
+
A product of Alphaday.
+
+
+
+
+
+
+ );
+};
+
+export default ApiPage;
diff --git a/tailwind.config.js b/tailwind.config.js
index 53adccf..57b9260 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -10,11 +10,35 @@ module.exports = {
platinum: "var(--color-platinum)",
aluminium: "var(--color-aluminium)",
shark: "var(--color-shark)",
- blue: "var(--color-palatinate-blue)",
+ blue: {
+ DEFAULT: "var(--color-palatinate-blue)",
+ 400: "#60a5fa",
+ },
eerie: "var(--color-eerie-black)",
white: "var(--color-white)",
black: "var(--color-black)",
lightblue: "var(--color-lightblue)",
+ // Semantic tokens for the API landing page
+ background: "#121212",
+ surface: {
+ DEFAULT: "#191919",
+ light: "#242424",
+ border: "#3b3a3a",
+ },
+ text: {
+ DEFAULT: "#f2f2f2",
+ muted: "#849399",
+ },
+ primary: {
+ DEFAULT: "#faa202",
+ hover: "#ffb84d",
+ },
+ success: "#6dd230",
+ danger: "#f45532",
+ warning: "#faa202",
+ orange: {
+ 400: "#fb923c",
+ },
},
extend: {
@@ -42,6 +66,11 @@ module.exports = {
titling: ["titling", defaultTheme.fontFamily.sans],
sans: ["titling", defaultTheme.fontFamily.sans],
montserrat: ["Montserrat", defaultTheme.fontFamily.sans],
+ display: ["titling", defaultTheme.fontFamily.sans],
+ mono: defaultTheme.fontFamily.mono,
+ },
+ boxShadow: {
+ "primary-glow": "0 0 40px -10px rgba(250,162,2,0.3)",
},
},
},
diff --git a/yarn.lock b/yarn.lock
index d6c9bd7..af4e84f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -866,6 +866,11 @@ loose-envify@^1.1.0, loose-envify@^1.4.0:
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
+lucide-react@^0.400.0:
+ version "0.400.0"
+ resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.400.0.tgz#8dc044bc1ace05fde5bdd4a8a7ad35c9e69ca575"
+ integrity sha512-rpp7pFHh3Xd93KHixNgB0SqThMHpYNzsGUu69UaQbSZ75Q/J3m5t6EhKyMT3m4w2WOxmJ2mY0tD3vebnXqQryQ==
+
merge2@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"