🎨 TapColor Developer https://api.tapcolor.app GitHub Main site β†—

TapColor Developer API

Browse TapColor coloring categories and collections over a simple REST API. Data is returned as JSON at the collection level. Authenticate with an api-key issued by TapColor.

Base URL

https://api.tapcolor.app

Authentication

Every request must include the api-key header. Requests without a valid key return 401. Keys can be revoked at any time.

api-key: YOUR_API_KEY
Need an API key? Request access and we'll get you set up β€” usually within one business day.
Request a key β†’

Official SDKs

Prefer a typed client over raw HTTP? Use the official library β€” zero dependencies, with full TypeScript types and auto-pagination.

JavaScript / TypeScript

npm install @tapcolorapp/api
deno add jsr:@tapcolorapp/api
import { TapColor } from "@tapcolorapp/api";

const tc = new TapColor({ apiKey: "YOUR_API_KEY" });

const { items } = await tc.coloringPages({ category: "animals", limit: 20 });
items.forEach((c) => console.log(c.subtopic, c.url));

// Or iterate EVERY collection, auto-paginated:
for await (const c of tc.allColoringPages({ category: "animals" })) {
  console.log(c.subtopicSlug);
}

npm β†— Β· JSR β†— Β· works in Node 18+, Deno, Bun & modern browsers.

Python

pip install tapcolor
from tapcolor import TapColor

tc = TapColor("YOUR_API_KEY")

page = tc.coloring_pages(category="animals", limit=20)
for c in page["items"]:
    print(c["subtopic"], "->", c["url"])

# Or iterate EVERY collection, auto-paginated:
for c in tc.all_coloring_pages(category="animals"):
    print(c["subtopicSlug"])

PyPI β†— Β· requires Python 3.8+.

AI assistants (MCP)

Let Claude, Cursor and other Model Context Protocol clients browse the catalog. Add this to your client config (e.g. claude_desktop_config.json):

{
  "mcpServers": {
    "tapcolor": {
      "command": "npx",
      "args": ["-y", "@tapcolorapp/mcp"],
      "env": { "TAPCOLOR_API_KEY": "YOUR_API_KEY" }
    }
  }
}

npm β†— Β· exposes list_categories and list_coloring_pages as tools.

Try it live

Run a real request straight from your browser β€” no setup. Paste an api-key, pick an endpoint, and hit Run.

Runs in your browser only β€” never sent to TapColor servers other than the API. Don't paste a production key on a shared machine.

Rate limits & errors

  • Rate limit: 120 requests per 10 minutes per key β€” exceeding it returns 429.
  • 401 β€” missing / invalid api-key, or the key has been revoked.
  • 404 β€” endpoint not found.
  • All responses are UTF-8 JSON; errors look like { "error": "..." }.

List collections

GET /v1/coloring-pages

Returns a list of collections with filtering, search and pagination.

Query parameters

ParameterTypeDescription
categorystringoptionalCategory slug (e.g. animals, disney). Omit for all categories.
qstringoptionalSearch collection names (partial match, case-insensitive).
limitintegeroptionalNumber of items to return, 1–100. Defaults to 20.
offsetintegeroptionalSkip the first N items for pagination. Defaults to 0.

Example request

curl "https://api.tapcolor.app/v1/coloring-pages?category=animals&limit=20" \
  -H "api-key: YOUR_API_KEY"
import requests

resp = requests.get(
    "https://api.tapcolor.app/v1/coloring-pages",
    params={"category": "animals", "limit": 20},
    headers={"api-key": "YOUR_API_KEY"},
)
data = resp.json()
print(data["total"], "collections")
for item in data["items"]:
    print(item["subtopic"], "->", item["url"])
const res = await fetch(
  "https://api.tapcolor.app/v1/coloring-pages?category=animals&limit=20",
  { headers: { "api-key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.total, "collections");
data.items.forEach((it) => console.log(it.subtopic, it.url));

Example response

{
  "total": 95,
  "limit": 20,
  "offset": 0,
  "count": 20,
  "items": [
    {
      "category": "Animals",
      "categorySlug": "animals",
      "subtopic": "Arctic Animals",
      "subtopicSlug": "arctic-animals",
      "count": 35,
      "url": "https://tapcolor.app/coloring-pages/animals/arctic-animals/",
      "image": "https://img.tapcolor.app/images/animals/arctic-animals/seal.jpg"
    }
  ]
}

Response fields

FieldTypeDescription
totalintegerTotal collections matching the filter (before pagination).
limitintegerPage size actually applied (1–100).
offsetintegerNumber of items skipped.
countintegerNumber of items in items for this page.
items[]arrayCollection objects β€” fields below.
items[].categorystringHuman-readable category name (e.g. Animals).
items[].categorySlugstringCategory slug β€” use it in the category filter.
items[].subtopicstringCollection (subtopic) name.
items[].subtopicSlugstringCollection slug used in url.
items[].countintegerNumber of coloring pages in the collection.
items[].urlstring (uri)Public collection page on tapcolor.app.
items[].imagestring (uri) Β· nullCover thumbnail URL. May be null when no cover is set.

Pagination

Page through results with limit + offset; stop once offset + count β‰₯ total.

offset = 0
while True:
    r = requests.get(URL, params={"category": "animals", "limit": 100, "offset": offset},
                     headers={"api-key": KEY}).json()
    for item in r["items"]:
        ...                      # process each collection
    offset += r["count"]
    if offset >= r["total"]:
        break

List categories

GET /v1/categories

Returns all 25 categories with the number of collections and pages in each.

Example request

curl "https://api.tapcolor.app/v1/categories" \
  -H "api-key: YOUR_API_KEY"
import requests

resp = requests.get(
    "https://api.tapcolor.app/v1/categories",
    headers={"api-key": "YOUR_API_KEY"},
)
for c in resp.json()["items"]:
    print(c["slug"], "->", c["pages"], "pages")
const res = await fetch(
  "https://api.tapcolor.app/v1/categories",
  { headers: { "api-key": "YOUR_API_KEY" } }
);
const data = await res.json();
data.items.forEach((c) => console.log(c.slug, c.pages));

Example response

{
  "total": 25,
  "items": [
    {
      "name": "Animals",
      "slug": "animals",
      "subtopics": 95,
      "pages": 3324,
      "url": "https://tapcolor.app/coloring-pages/animals/"
    }
  ]
}

Response fields

FieldTypeDescription
totalintegerNumber of categories (always 25).
items[].namestringHuman-readable category name.
items[].slugstringCategory slug β€” use it in the category filter.
items[].subtopicsintegerNumber of collections in the category.
items[].pagesintegerTotal coloring pages across the category.
items[].urlstring (uri)Public category page on tapcolor.app.

Category slugs

All 25 valid values for the category parameter, straight from the live catalog.

SlugCategoryCollectionsPages
animalsAnimals953,324
disneyDisney882,459
video-gamesVideo Games892,316
for-girlsFor Girls622,313
kids-tv-showsKids TV Shows841,991
halloweenHalloween451,559
for-boysFor Boys471,451
for-adultsFor Adults401,252
christmasChristmas331,135
superheroesSuperheroes38949
kids-moviesKids Movies25638
fallFall11515
dinosaursDinosaurs17439
kawaiiKawaii16414
unicornsUnicorns8353
foodFood9310
back-to-schoolBack To School10289
holidaysHolidays6258
easterEaster8243
for-toddlersFor Toddlers5211
race-carrace car8187
religiousReligious3177
princessesPrincesses5116
summerSummer3115
community-helperscommunity helpers383