← Docs

Emoji API

Resolve, browse, and find emoji in text.

Use the API for individual lookups, hosted search, or parsing and converting messages on your server.

Download the catalog for a picker that searches locally. Fetch it with your key on your server or at build time, then serve the file with your app.

Lookup

GET
api.parseapi.com/emoji/{emoji}
Character, shortcode, or exact name
Explore
Parameters 4
emojistring · path · required

Character, shortcode, name or hex codepoints. Qualified and unqualified forms resolve to the canonical emoji.

shortcode_sourcestring · query · optional

Resolve from a named shortcode preset. Ambiguous aliases return 400. Slack and Discord are community presets.

Values: cldr, github, slack, discord

langstring · query · optional

Display language as one BCP 47 tag, such as fr or zh-Hant. Changes supported display labels only; IDs, codes, native names, facts, parsing and deep access stay unchanged. Omit for the original response. Unsupported regions use the supported language base; unsupported languages or scripts use English. Missing labels retain their source value. Accept-Language is not read automatically. Available on the current API contract; frozen 1.0.0 is unchanged.

Length: 2 to 64 characters

deepboolean · query · optional

Unicode detail, keywords, sourced shortcode presets, complete skin-tone variants and licensed artwork links. Included on every plan, with no additional charge.

Run uses the free demo on API 2.0.0. Copied code uses your API key when signed in, or YOUR_API_KEY when signed out.

import { parseAPI } from '@parseapi/sdk';

const parse = parseAPI("YOUR_API_KEY");
const result = await parse.emoji("rocket");
console.log(result);

Run on your server with a secret key. Calling from a browser or app?

Example response
{
  "emoji": "🚀",
  "name": "Rocket",
  "shortcodes": [
    ":rocket:",
    "rocket"
  ],
  "category": "Travel & Places"
}

Response fields

emojistring
Emoji character
namestring or null
Official name
shortcodesarray
Shortcodes with and without colons
categorystring or null
Category

Text and emoji presentation forms resolve to the canonical emoji. For example, ❤ resolves to ❤️. Names accept spaces, underscores and hyphens. Hex forms such as 1F680, U+1F680, and 2764-FE0F also resolve. URL-encode the entire input, including plus signs.

Use shortcode_source=cldr, github, slack, or discord to choose an alias source. CLDR uses pinned English annotation aliases, including the reviewed Emoji 18 additions. GitHub uses the Emojibase github preset. Slack uses iamcal and Discord uses joypixels. These community mappings may differ from a platform release and do not guarantee exact Slack or Discord compatibility. Existing primary names and shortcodes keep their meaning. An ambiguous additional shortcode returns 400.

Keyword and prefix search for pickers and typeahead. ?limit= caps results, default 20, max 50.

GET
api.parseapi.com/emoji?q={query}
Prefix and keyword search. ?limit= (default 20, max 50)
Explore
Parameters 10
qstring · query · optional

An emoji name or keyword. Omit to browse in emoji order.

Length: 1 to 256 characters

limitinteger · query · optional

Maximum number of results.

Default: 20

Range: 1 to 50

offsetinteger · query · optional

Zero-based page offset.

Default: 0

Range: 0 to no maximum

categorystring · query · optional

Category name from /emoji/categories.

subcategorystring · query · optional

Subcategory from /emoji/categories.

versionstring · query · optional

Exact Emoji introduction version.

max_versionstring · query · optional

Maximum Emoji introduction version.

include_skin_tonesboolean · query · optional

Include skin-tone variants. False leaves base emoji in results.

Default: true

langstring · query · optional

Display language as one BCP 47 tag, such as fr or zh-Hant. Changes supported display labels only; IDs, codes, native names, facts, parsing and deep access stay unchanged. Omit for the original response. Unsupported regions use the supported language base; unsupported languages or scripts use English. Missing labels retain their source value. Accept-Language is not read automatically. Available on the current API contract; frozen 1.0.0 is unchanged.

Length: 2 to 64 characters

deepboolean · query · optional

Unicode detail, keywords, sourced shortcode presets, complete skin-tone variants and licensed artwork links. Included on every plan, with no additional charge.

Run uses the free demo on API 2.0.0. Copied code uses your API key when signed in, or YOUR_API_KEY when signed out.

import { parseAPI } from '@parseapi/sdk';

const parse = parseAPI("YOUR_API_KEY");
const result = await parse.emoji.search("fire", { limit: 2 });
console.log(result);

Run on your server with a secret key. Calling from a browser or app?

Example response
{
  "q": "fire",
  "emojis": [
    {
      "emoji": "🔥",
      "name": "Fire",
      "shortcodes": [
        ":fire:",
        "fire"
      ],
      "category": "Travel & Places"
    },
    {
      "emoji": "🚒",
      "name": "Fire Engine",
      "shortcodes": [
        ":fire_engine:",
        "fire_engine"
      ],
      "category": "Travel & Places"
    }
  ]
}

Response fields

qstring
Search query
emojisarray
Matching emoji records (same shape as lookup)
totalinteger
Number of matches before pagination on filtered or paged requests
next_offsetinteger or null
Offset for the next page, or null at the end

Browse and filter

GET
api.parseapi.com/emoji
Browse in emoji order, without a search query
Explore
Parameters 10
qstring · query · optional

An emoji name or keyword. Omit to browse in emoji order.

Length: 1 to 256 characters

limitinteger · query · optional

Maximum number of results.

Default: 20

Range: 1 to 50

offsetinteger · query · optional

Zero-based page offset.

Default: 0

Range: 0 to no maximum

categorystring · query · optional

Category name from /emoji/categories.

subcategorystring · query · optional

Subcategory from /emoji/categories.

versionstring · query · optional

Exact Emoji introduction version.

max_versionstring · query · optional

Maximum Emoji introduction version.

include_skin_tonesboolean · query · optional

Include skin-tone variants. False leaves base emoji in results.

Default: true

langstring · query · optional

Display language as one BCP 47 tag, such as fr or zh-Hant. Changes supported display labels only; IDs, codes, native names, facts, parsing and deep access stay unchanged. Omit for the original response. Unsupported regions use the supported language base; unsupported languages or scripts use English. Missing labels retain their source value. Accept-Language is not read automatically. Available on the current API contract; frozen 1.0.0 is unchanged.

Length: 2 to 64 characters

deepboolean · query · optional

Unicode detail, keywords, sourced shortcode presets, complete skin-tone variants and licensed artwork links. Included on every plan, with no additional charge.

Use category and subcategory to narrow the catalog. version selects the version that introduced a sequence. max_version includes sequences introduced up to that version. include_skin_tones=false keeps the base emoji in picker results. Existing search includes skin tones by default. Filters combine with q.

offset starts a page and limit defaults to 20, up to 50. Paged and filtered responses include total, the matches before pagination, and next_offset, or null at the end. Deep adds the parent base for a variant, omitted when there is no parent, and additional variants for mixed-tone choices not already listed in skins.

GET
api.parseapi.com/emoji/categories
Category names and their subcategories
Explore

Use lang for translated names and keyword search. Characters, canonical identities and shortcodes stay stable. Missing translations keep the English label. Catalog downloads report the requested and resolved language, translated count, fallback count in localization.

Find emoji in text

POST
api.parseapi.com/emoji/parse
Extract complete emoji sequences from a JSON text body
Explore
Parameters 1
deepboolean · query · optional

Unicode detail, keywords, sourced shortcode presets, complete skin-tone variants and licensed artwork links. Included on every plan, with no additional charge.

JSON body required

Send Content-Type: application/json.

textstring · required

Length: 0 to 16000 characters

Use only the fields listed for this format. Put these inputs in the body.

{"text":"Great work 👏🏽! 👏🏽 See you Friday 🎉"}

The response contains one record per unique emoji in emojis, ordered by first appearance. Each record adds positions for every occurrence. Position start and end use UTF-16 offsets with an exclusive end, matching JavaScript string slicing. Joined families, flags and mixed-tone sequences count as one emoji. Unsupported sequences are omitted as a whole. Send text in the body, up to 16,000 UTF-16 code units, matching JavaScript text.length. Each request uses one pooled request on every plan.

Convert text and shortcodes

POST
api.parseapi.com/emoji/convert?direction=to_emoji&shortcode_source=github
Convert a JSON text body using an explicit shortcode preset
Explore
Parameters 2
directionstring · query · required

Choose encoding or decoding.

Values: to_emoji, to_shortcodes

shortcode_sourcestring · query · required

Use one explicitly named preset.

Values: cldr, github, slack, discord

JSON body required

Send Content-Type: application/json.

textstring · required

Length: 0 to 16000 characters

Use only the fields listed for this format. Put these inputs in the body.

{"text":"Great work :rocket:! Keep :unknown_code: unchanged."}

Choose to_emoji or to_shortcodes and a required shortcode_source. The response contains converted text, unresolved tokens with their positions and reasons. Unknown, ambiguous and unavailable aliases stay literal, with a reason in unresolved. Encoding chooses an alias that resolves uniquely back to the same complete sequence. Positions always refer to the original input in UTF-16 code units. The same text limit and pooled request pricing apply.

Artwork

GET
api.parseapi.com/emoji/rocket?deep=true
Optional SVG and PNG artwork links
Explore

Display emoji as text to use the device emoji font. For a consistent image style or graphics export, Deep includes available original SVG/PNG links from Noto, Twemoji and OpenMoji. Use deep.artwork.openmoji.svg for SVG or deep.artwork.openmoji.png["72"] for a 72×72 PNG. The same structure applies to noto and twemoji. Load the returned URL directly. Unavailable styles and formats are omitted. PNG keys are pixel sizes, not Unicode codes. URLs pin immutable artwork editions. Noto uses ParseAPI edition 18.0.0 for Google's Unicode 18 release; Twemoji and OpenMoji use their numbered releases. /emoji/metadata supplies shared credits, licences and immutable notice links. Per-image rights appear only when different from the provider.

Artwork coverage follows each source release. Noto supplies Emoji 18 SVGs, including flags with their separate source notices. Twemoji and OpenMoji currently supply Emoji 17 artwork. Preserve the individual credit and license. OpenMoji adaptations must keep CC BY-SA 4.0. Artwork attribution.

Download and work offline

GET
api.parseapi.com/emoji/catalog
Download a compact catalog for local lookup, search and parsing
Explore
Parameters 9
formatstring · query · optional

Download representation.

Default: json

Values: json

deepboolean · query · optional

Unicode detail, keywords, sourced shortcode presets, complete skin-tone variants and licensed artwork links. Included on every plan, with no additional charge.

Default: true

profilestring · query · optional

Compact is JSON-only and requires Deep. Full preserves the complete record. Default compact.

Default: compact

Values: full, compact

categorystring · query · optional

Category from /emoji/categories.

subcategorystring · query · optional

Subcategory from /emoji/categories.

versionstring · query · optional

Exact Emoji introduction version.

max_versionstring · query · optional

Maximum Emoji introduction version.

include_skin_tonesboolean · query · optional

Include skin-tone variants.

Default: true

If-None-Matchstring · header · optional

Use the exact representation’s previous validator.

A new catalog download uses one pooled request on your existing plan. Searching and selecting from the downloaded copy use none. Refresh the file at build time or on your release schedule to adopt catalog updates. The downloaded copy stays unchanged until you replace it.

The default compact catalog includes names, keywords, tone relationships, lookup maps and data notices. Each record has the Deep fields needed for local search and tone selection. Use profile=full for artwork links and extended Unicode detail. Keep the returned profile with your snapshot.

emojis contains the downloaded records. The forms, shortcodes and legacy maps reference only those records. total is the downloaded count. scope identifies the selected filters and whether the download contains the full server inventory, which metadata describes. The same category, subcategory, version and skin-tone filters apply. Use lang for translated names and keywords with English fallbacks. Retain the data notices. Images are separate files with their own notices in metadata.artwork_sources.

GET
api.parseapi.com/emoji/metadata
Edition, actual coverage and artwork licenses without downloading all records
Explore
Parameters 1
If-None-Matchstring · header · optional

Use the previously returned ETag to receive 304 when unchanged.

Unicode's official emoji test data defines the characters and sequences. /emoji/metadata returns the source editions and notices used by this catalog.

const response = await fetch(
  'https://api.parseapi.com/emoji/catalog',
  { headers: {
    'X-API-Key': 'YOUR_API_KEY',
    'Parse-Version': '2.0.0',
  } },
);
if (!response.ok) throw new Error('Catalog download failed.');
const snapshot = await response.json();

// Store the snapshot and its notices with your application.
const canonicalHeart = snapshot.forms['❤']; // ❤️
const heart = snapshot.emojis.find(row => row.emoji === canonicalHeart);
console.log(heart.name);

With lang, search.native retains English matching alongside the translation. Send the returned ETag unchanged in If-None-Match for the same language, profile and filters. A matching 304 for catalog or metadata uses the ordinary rate limit but no pooled request, and creates no customer lookup-history entry. Completeness compares the loaded inventory to the pinned Unicode dataset.

Use the JavaScript client

JavaScript SDK 1.10.1 includes hosted Emoji calls and an optional catalog helper for local lookup, search and parsing.

import { parseAPI } from '@parseapi/sdk';
import { EmojiCatalog } from '@parseapi/sdk/offline';

const parse = parseAPI('your-api-key');
const snapshot = await parse.emoji.catalog();
const local = new EmojiCatalog(snapshot);

local.lookup('❤');              // canonical ❤️
local.search('fire');            // ranked local results
local.browse({ category: 'Food & Drink' });
local.parse('Great work 👏🏽 👏🏽!'); // 2 occurrences, 1 unique emoji
local.convert('Hello :wave:', {
  direction: 'to_emoji', shortcodeSource: 'github',
});

// Save snapshot as JSON to reuse across app sessions.
// Local methods are synchronous and make no HTTP requests.

EmojiCatalog performs synchronous lookup, search, browsing and whole-sequence text parsing from that JSON without network requests. metadata() reports source-server evidence and scope() reports the downloaded subset.

Deep

?deep=true Unicode detail, keywords, sourced shortcode presets, complete skin-tone variants and licensed artwork links. Included on every plan, with no additional charge.

Run uses the free demo on API 2.0.0. Copied code uses your API key when signed in, or YOUR_API_KEY when signed out.

import { parseAPI } from '@parseapi/sdk';

const parse = parseAPI("YOUR_API_KEY");
const result = await parse.emoji("rocket", { deep: true });
console.log(result);

Run on your server with a secret key. Calling from a browser or app?

Example response
{
  "emoji": "🚀",
  "name": "Rocket",
  "shortcodes": [
    ":rocket:",
    "rocket"
  ],
  "category": "Travel & Places",
  "deep": {
    "codepoints": [
      "U+1F680"
    ],
    "hex": "1F680",
    "status": "fully-qualified",
    "version": "0.6",
    "keywords": [
      "rocket",
      "launch",
      "rockets",
      "space",
      "travel",
      "ship"
    ],
    "skins": [],
    "subcategory": "transport-air",
    "artwork": {
      "noto": {
        "svg": "https://cdn.parseapi.com/emoji/noto/18.0.0/1f680.svg",
        "png": {
          "32": "https://cdn.parseapi.com/emoji/noto/18.0.0/32/1f680.png",
          "72": "https://cdn.parseapi.com/emoji/noto/18.0.0/72/1f680.png",
          "128": "https://cdn.parseapi.com/emoji/noto/18.0.0/128/1f680.png",
          "512": "https://cdn.parseapi.com/emoji/noto/18.0.0/512/1f680.png"
        }
      },
      "twemoji": {
        "svg": "https://cdn.parseapi.com/emoji/twemoji/17.0.3/1f680.svg",
        "png": {
          "72": "https://cdn.parseapi.com/emoji/twemoji/17.0.3/72/1f680.png"
        }
      },
      "openmoji": {
        "svg": "https://cdn.parseapi.com/emoji/openmoji/17.0.0/1f680.svg",
        "png": {
          "72": "https://cdn.parseapi.com/emoji/openmoji/17.0.0/72/1f680.png",
          "618": "https://cdn.parseapi.com/emoji/openmoji/17.0.0/618/1f680.png"
        }
      }
    }
  }
}

Deep fields

deep.codepointsarray
Unicode codepoints (U+…)
deep.hexstring or null
Hex form
deep.statusstring or null
Qualification status
deep.versionstring or null
Emoji version that introduced this sequence
deep.keywordsarray
Related keywords
deep.skinsarray
Skin-tone variants (when available)
deep.subcategorystring or null
Emoji subgroup, such as hand-fingers-closed
deep.basestring
Canonical parent of a variant, omitted when there is no parent
deep.variantsarray
Additional mixed-tone choices beyond skins. Each has emoji and tones
deep.artworkobject
SVG/PNG URLs keyed by style, e.g. artwork.openmoji.svg and artwork.openmoji.png["72"]. Missing styles and formats are omitted. Shared credits, licenses and notices are in /emoji/metadata

Display language

Pass lang with a language tag such as fr, pt-BR, or zh-Hant. Emoji name and requested deep.keywords use available source translations. Search also matches translated names and keywords. Catalog localization reports translated records, missing labels and the source language used for each field; uncovered sequences retain their source value. Characters and shortcodes stay unchanged.

Send a chosen browser preference explicitly, for example { lang: navigator.language } in your JavaScript SDK options. The API does not read Accept-Language automatically. Unsupported regions fall back to their supported base language; unsupported languages or scripts use English. Empty, invalid or repeated tags return 400.

Content-Language identifies languages used in translated display fields and known English fallbacks. This option follows the current API contract. Requests selecting frozen 1.0.0 retain that contract. Select API 2.0.0 to use display language.

44 display language choices
Language tagLanguage
enAmerican English
zh-Hans简体中文
frfrançais (France)
deDeutsch
ititaliano
ja日本語
ko한국어
esespañol de España
arالعربية
bgбългарски
cacatalà
hrhrvatski
csčeština
dadansk
nlNederlands
fisuomi
elΕλληνικά
heעברית
hiहिन्दी
humagyar
idIndonesia
kkқазақ тілі
msMelayu
nbnorsk bokmål
plpolski
ptportuguês (Brasil)
roromână
ruрусский
skslovenčina
svsvenska
thไทย
trTürkçe
ukукраїнська
viTiếng Việt
zh-Hant繁體中文
en-AUAustralian English
en-GBBritish English
fr-CAfrançais canadien
es-419español latinoamericano
pt-PTportuguês europeu
zh-Hant-HK繁體中文(中國香港特別行政區)
bnবাংলা
eteesti
ltlietuvių

Questions? Email