Integrate emoji search, metadata, and intelligence into your apps. RESTful, fast, and free â 100 requests/day included.
Create a free account, grab your API key, and start building in minutes.
The free tier includes 100 requests/day. Need more? Upgrade to a paid plan for up to 250,000 requests/day, priority support, and higher rate limits. View Plans & Pricing â
| Feature | Free | Starter | Pro | Enterprise |
|---|---|---|---|---|
| Daily Requests | 100 | 1,000 | 25,000 | 250,000 |
| All Endpoints | â | â | â | â |
| Search + Packs | â | â | â | â |
| Priority Support | â | â | â | â |
| SLA Guarantee | â | â | â | â |
| Custom Integration | â | â | â | â |
Pass your API key via the x-api-key header on every request.
100 requests per day per key. Resets at midnight UTC.
https://api.emojidock.com/v1
All API requests require an x-api-key header.Get Free API Key from the API Dashboard.
# Include your API key in every request curl -H "x-api-key: fek_abc123def456..." \ https://api.emojidock.com/v1/emojis
The Emoji Dock API is a standalone public REST API that returns clean JSON. No special SDK or framework is required â any HTTP client (Bubble, Zapier, Make, Postman, cURL, fetch, etc.) can call it directly.
x-api-key header# Search emojis â works from any HTTP client
curl "https://api.emojidock.com/v1/emojis?q=happy&limit=10" \
-H "x-api-key: YOUR_API_KEY"
# Response (clean JSON):
{
"data": [{ "emoji": "đ", "name": "Grinning Face", ... }],
"total": 12,
"page": 1,
"limit": 10,
"pages": 2
}https://api.emojidock.com/v1x-api-key â your key/emojis, /categories, /packs, etc.Test the live external API directly from your browser â requests hit api.emojidock.com just like Postman or cURL.
This tester sends requests to the live external API at api.emojidock.com â exactly like Postman or cURL would.
Each API key is limited to 100 requests per day. The counter resets at midnight UTC.
| Plan | Daily Limit | Price | |
|---|---|---|---|
| Free | 100 / day | $0 | |
| Need higher limits? View pricing plans â | |||
When you exceed the limit, the API returns 429 Too Many Requests.
| Field | Type |
|---|---|
| emoji | string |
| name | string |
| slug | string |
| category | string |
| subcategory | string |
| codepoints | string[] |
| shortcode | string |
| description | string |
| keywords | string[] |
| unicode | string |
| introduced | string |
Public game leaderboards are served by the audited game_leaderboard RPC. It is the only supported way to read leaderboard data: the underlying game_scores table is owner-only, and the RPC never returns user_id, email, or any other identifier. Every call is recorded in the game data access audit log.
POST /rest/v1/rpc/game_leaderboard
Host: <your-project>.supabase.co
apikey: <publishable key>
Content-Type: application/json
{ "_game_type": "guess_movie", "_limit": 10 }const { data } = await supabase.rpc("game_leaderboard", {
_game_type: "guess_movie", // guess_movie | daily_challenge | emoji_charades
_limit: 10, // 1â50, defaults to 10
});| Field | Type |
|---|---|
| display_name | string |
| game_type | string |
| score | integer |
| best_streak | integer |
| total_games | integer |
[
{ "display_name": "emojifan", "game_type": "guess_movie", "score": 42, "best_streak": 9, "total_games": 51 },
{ "display_name": "Anonymous", "game_type": "guess_movie", "score": 31, "best_streak": 6, "total_games": 40 }
]Never expose user IDs in integrations: fields such as user_id are not returned by this endpoint and direct reads of game_scores are restricted to the score owner. Signed-in users can read their own rows with the my_game_scores RPC.
| Status | Meaning |
|---|---|
401 | Unauthorized |
404 | Not Found |
429 | Too Many Requests |
500 | Internal Server Error |
Drop a real-time emoji search box into any website with a single script tag. No frameworks required â works with vanilla HTML, React, Vue, Angular, and more.
512 default emojis included âĸ Like an iPhone emoji keyboard
<!-- 1. Add a container element -->
<div id="emoji-search"></div>
<!-- 2. Load the widget script -->
<script src="https://api.emojidock.com/v1/widget.js"></script>
<!-- 3. Initialize with your API key -->
<script>
new EmojiDockSearch({
apiKey: 'YOUR_API_KEY',
target: '#emoji-search',
showDefaults: true, // Show 350+ emojis like iPhone keyboard
onSelect: function(emoji) {
console.log('Selected:', emoji.emoji, emoji.name);
// Insert into your input, chat, etc.
}
});
</script>| Option | Type | Default |
|---|---|---|
| apiKey | string | â |
| target | string | Element | â |
| onSelect | function | noop |
| placeholder | string | "Search emojis..." |
| maxResults | number | 20 |
| theme | "light" | "dark" | "light" |
| debounceMs | number | 200 |
| showDefaults | boolean | true |
The onSelect callback receives the full emoji object:
onSelect: function(emoji) {
emoji.emoji // "đ"
emoji.name // "Grinning Face"
emoji.slug // "grinning-face"
emoji.category // "smileys"
emoji.keywords // ["happy", "smile", "joy"]
emoji.shortcode // ":grinning_face:"
emoji.codepoints // ["U+1F600"]
}import { useEffect, useRef } from 'react';
function EmojiPicker({ onSelect }) {
const ref = useRef(null);
useEffect(() => {
// Load the widget script dynamically
const script = document.createElement('script');
script.src = 'https://api.emojidock.com/v1/widget.js';
script.onload = () => {
const picker = new window.EmojiDockSearch({
apiKey: 'YOUR_API_KEY',
target: ref.current,
theme: 'dark',
onSelect: (emoji) => onSelect(emoji),
});
return () => picker.destroy();
};
document.body.appendChild(script);
}, []);
return <div ref={ref} />;
}Real-time search
Results as you type
Light & dark themes
Matches your app
Zero dependencies
< 4KB gzipped
API key auth
Your key, your limits
Use our lightweight npm package for type-safe emoji search with built-in caching, retry logic, and TypeScript support.
npm install @emojidock/sdk
import { EmojiDock } from '@emojidock/sdk';
const dock = new EmojiDock({ apiKey: 'YOUR_API_KEY' });
// Search emojis
const results = await dock.search('happy');
console.log(results);
// [{ emoji: "đ", name: "Grinning Face", ... }, ...]
// Get all emojis (paginated)
const page = await dock.list({ page: 1, limit: 50 });
// Get a single emoji by slug
const heart = await dock.get('red-heart');
// Get all categories
const categories = await dock.categories();
// List event/topic packs
const packs = await dock.packs({ month: 12 });
// Get a specific pack
const christmas = await dock.pack('christmas');| Method | Returns |
|---|---|
| search(query, opts?) | Promise<Emoji[]> |
| list(opts?) | Promise<PaginatedResult> |
| get(slug) | Promise<Emoji> |
| categories() | Promise<Category[]> |
| packs(opts?) | Promise<Pack[]> |
| pack(id) | Promise<Pack> |
| contributors() | Promise<Contributor[]> |
| contributor(handle) | Promise<ContributorWithEmojis> |
const dock = new EmojiDock({
apiKey: 'YOUR_API_KEY', // Required â get one free
baseUrl: 'https://api.emojidock.com/v1', // Optional â defaults to production
cache: true, // Optional â enable in-memory cache (default: true)
cacheTTL: 60000, // Optional â cache TTL in ms (default: 60s)
retries: 2, // Optional â auto-retry on failure (default: 2)
timeout: 5000, // Optional â request timeout in ms (default: 5s)
});import type { Emoji, Category, Pack, Contributor } from '@emojidock/sdk';
// Full type safety on all responses
const results: Emoji[] = await dock.search('fire');
interface Emoji {
emoji: string;
name: string;
slug: string;
category: string;
subcategory: string;
codepoints: string[];
shortcode: string;
description: string;
keywords: string[];
unicode: string;
introduced: string;
}React Hook
import { useState, useEffect } from 'react';
import { EmojiDock } from '@emojidock/sdk';
const dock = new EmojiDock({ apiKey: 'YOUR_API_KEY' });
function useEmojiSearch(query: string) {
const [results, setResults] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
if (!query.trim()) { setResults([]); return; }
setLoading(true);
dock.search(query)
.then(setResults)
.finally(() => setLoading(false));
}, [query]);
return { results, loading };
}Node.js / Express
const { EmojiDock } = require('@emojidock/sdk');
const dock = new EmojiDock({ apiKey: process.env.EMOJIDOCK_API_KEY });
app.get('/api/emojis', async (req, res) => {
const { q } = req.query;
const emojis = await dock.search(q);
res.json(emojis);
});Lightweight
< 3KB gzipped
TypeScript
Full type definitions
Auto-retry
Built-in retry logic
Caching
In-memory LRU cache