New Emojis Coming!
    🎉
    🔌

    Emoji Dock API

    Integrate emoji search, metadata, and intelligence into your apps. RESTful, fast, and free — 100 requests/day included.

    v1 — Live
    REST API
    JSON

    Ready to integrate?

    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 →

    FeatureFreeStarterProEnterprise
    Daily Requests1001,00025,000250,000
    All Endpoints✅✅✅✅
    Search + Packs✅✅✅✅
    Priority Support—✅✅✅
    SLA Guarantee——✅✅
    Custom Integration———✅

    Authentication

    Pass your API key via the x-api-key header on every request.

    Rate Limit

    100 requests per day per key. Resets at midnight UTC.

    Base URL

    https://api.emojidock.com/v1

    Authentication

    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

    External Integration Guide

    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.

    What you need

    • Your API key (get one free from your Dashboard)
    • Send it as the x-api-key header
    • That's it — no other auth headers, tokens, or SDKs required

    Quick example

    # 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
    }

    Bubble / No-Code Setup

    1. Add an API Connector plugin with the base URL: https://api.emojidock.com/v1
    2. Add a shared header: x-api-key → your key
    3. Create GET calls to /emojis, /categories, /packs, etc.

    API Tester
    Like Postman

    Test the live external API directly from your browser — requests hit api.emojidock.com just like Postman or cURL.

    API Tester

    External
    https://api.emojidock.com/v1/emojis/search?q=

    This tester sends requests to the live external API at api.emojidock.com — exactly like Postman or cURL would.

    Rate Limiting

    Each API key is limited to 100 requests per day. The counter resets at midnight UTC.

    PlanDaily LimitPrice
    Free100 / day$0
    Need higher limits? View pricing plans →

    When you exceed the limit, the API returns 429 Too Many Requests.

    Endpoints

    Emoji Object Schema

    FieldType
    emojistring
    namestring
    slugstring
    categorystring
    subcategorystring
    codepointsstring[]
    shortcodestring
    descriptionstring
    keywordsstring[]
    unicodestring
    introducedstring

    Leaderboard Data Endpoint

    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.

    Request

    POST /rest/v1/rpc/game_leaderboard
    Host: <your-project>.supabase.co
    apikey: <publishable key>
    Content-Type: application/json
    
    { "_game_type": "guess_movie", "_limit": 10 }

    JavaScript

    const { data } = await supabase.rpc("game_leaderboard", {
      _game_type: "guess_movie", // guess_movie | daily_challenge | emoji_charades
      _limit: 10,                // 1–50, defaults to 10
    });

    Safe fields returned

    FieldType
    display_namestring
    game_typestring
    scoreinteger
    best_streakinteger
    total_gamesinteger

    Example response

    [
      { "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.

    Error Codes

    StatusMeaning
    401
    Unauthorized
    404
    Not Found
    429
    Too Many Requests
    500
    Internal Server Error

    Embeddable Search Widget

    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.

    Try the Widget Live

    Interactive Demo

    512 default emojis included â€ĸ Like an iPhone emoji keyboard

    Quick Start

    <!-- 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>

    Configuration Options

    OptionTypeDefault
    apiKeystring—
    targetstring | Element—
    onSelectfunctionnoop
    placeholderstring"Search emojis..."
    maxResultsnumber20
    theme"light" | "dark""light"
    debounceMsnumber200
    showDefaultsbooleantrue

    onSelect Callback

    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"]
    }

    React Integration

    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

    JavaScript / TypeScript SDK

    Use our lightweight npm package for type-safe emoji search with built-in caching, retry logic, and TypeScript support.

    Installation

    npm install @emojidock/sdk

    Quick Start

    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');

    SDK Methods

    MethodReturns
    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>

    Configuration

    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)
    });

    TypeScript Types

    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;
    }

    Framework Examples

    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

    Coming Soon
    The npm package is being published. In the meantime, use the REST API directly.Get Free API Key

    Need help integrating?

    Check our documentation above or reach out — we're here to help.