{"id":31647663,"url":"https://github.com/mixpeek/iab-mapper","last_synced_at":"2025-10-07T06:44:46.771Z","repository":{"id":314615705,"uuid":"1053720142","full_name":"mixpeek/iab-mapper","owner":"mixpeek","description":"Local IAB Content Taxonomy Mapper (2.x → 3.0). Deterministic → fuzzy → optional embeddings. Exports OpenRTB \u0026 VAST-ready category IDs with vector attributes and SCD awareness.","archived":false,"fork":false,"pushed_at":"2025-09-25T13:11:55.000Z","size":576,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-25T15:18:40.752Z","etag":null,"topics":["adtech","brand-safety","cli","content-taxonomy","contextual-targeting","iab","iab-taxonomy","local","multimodal","python"],"latest_commit_sha":null,"homepage":"https://mxp.co/taxonomy","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mixpeek.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-09T20:43:56.000Z","updated_at":"2025-09-25T13:11:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"8b095401-bf1d-48a3-948a-2562dcc71437","html_url":"https://github.com/mixpeek/iab-mapper","commit_stats":null,"previous_names":["mixpeek/iab-mapper"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mixpeek/iab-mapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mixpeek%2Fiab-mapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mixpeek%2Fiab-mapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mixpeek%2Fiab-mapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mixpeek%2Fiab-mapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mixpeek","download_url":"https://codeload.github.com/mixpeek/iab-mapper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mixpeek%2Fiab-mapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278734434,"owners_count":26036404,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adtech","brand-safety","cli","content-taxonomy","contextual-targeting","iab","iab-taxonomy","local","multimodal","python"],"created_at":"2025-10-07T06:44:41.513Z","updated_at":"2025-10-07T06:44:46.763Z","avatar_url":"https://github.com/mixpeek.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/header.png\" alt=\"IAB Taxonomy Mapper\" width=\"900\" /\u003e\n\u003c/p\u003e\n\n# IAB Content Taxonomy Mapper (Local CLI)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/mixpeek/iab-mapper\"\u003eView iab-mapper on GitHub\u003c/a\u003e\n  •\n  \u003ca href=\"https://mixpeek.com/tools/iab-taxonomy-mapper\"\u003eOpen Mixpeek — IAB Taxonomy Mapper\u003c/a\u003e\n  •\n  \u003ca href=\"#-quick-start\"\u003eQuick Start (5 min)\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.youtube.com/watch?v=wHLwfp8nKpc\"\u003e\n    \u003cimg src=\"https://img.youtube.com/vi/wHLwfp8nKpc/maxresdefault.jpg\" alt=\"IAB Mapper Walkthrough Video\" width=\"600\" /\u003e\n  \u003c/a\u003e\n  \u003cbr\u003e\n  \u003cstrong\u003e📺 Watch the 5-minute walkthrough\u003c/strong\u003e\n\u003c/p\u003e\n\nMap **IAB Content Taxonomy 2.x** labels/codes to **IAB 3.0** locally with a deterministic → fuzzy → (optional) semantic pipeline.\nOutputs are **IAB‑3.0–compatible IDs** for OpenRTB/VAST, with optional **vector attributes** (Channel, Type, Format, Language, Source, Environment) and **SCD** awareness.\n\n\u003e Local-first by default. No external APIs are required; LLM re‑rank is optional.\n\n## 🎯 What it does\n\nThe IAB Mapper helps you migrate from IAB Content Taxonomy 2.x to 3.0 by:\n\n1. **Input:** Your existing 2.x codes/labels (CSV or JSON)\n2. **Process:** Deterministic matching → fuzzy matching → optional semantic enhancement\n3. **Output:** Valid IAB 3.0 IDs ready for OpenRTB/VAST integration\n\n**Example:**\n```bash\n# Input: 2.x codes\n\"1-4\",\"Sports\"\n\"2-12\",\"Food \u0026 Drink\"\n\n# Output: 3.0 IDs\n\"483\",\"Sports\"\n\"3-5-2\",\"Food \u0026 Drink \u003e Cooking\"\n```\n\nPerfect for ad tech teams, content platforms, and anyone migrating to IAB 3.0.\n\n\u003e **💡 Try the official samples:** Use `demo/official_samples/sample_2x_codes_official.csv` for realistic testing with 60+ IAB categories.\n\n---\n\n## 📚 Table of Contents\n\n- [✨ Features](#-features)\n- [Why migrate to IAB 3.0?](#-why-migrate-to-iab-30)\n- [How it works](#-how-it-works)\n- [🔧 Install](#-install)\n- [🚀 Quick Start](#-quick-start)\n- [🐍 Python API](#-python-api-alternative-to-cli)\n- [📥 Input Formats](#-input-formats)\n- [📤 Output Formats](#-output-formats)\n- [⚙️ Useful Flags](#️-useful-flags)\n- [🧩 Vectors](#-vectors-orthogonal-attributes)\n- [✅ IAB 3.0 Conformance Notes](#-iab-30-conformance-notes)\n- [📎 Official IAB References](#-official-iab-references)\n- [🧯 Troubleshooting](#-troubleshooting)\n- [📦 Example Commands](#-example-commands)\n- [📜 License](#-license)\n\n---\n\n### Versioning snapshot\n\n| IAB 2.x supported | IAB 3.x supported | Updated       |\n|-------------------|-------------------|---------------|\n| 2.2               | 3.1               | 2025-09-12    |\n\n---\n\n### Update catalogs (fetch latest from IAB)\n\nUse the bundled fetcher to sync to the latest Content Taxonomy files from the official IAB GitHub repository. It will locate the latest 2.x and 3.x datasets and normalize them into this tool’s schemas.\n\n```bash\n# via Python script (direct)\npython scripts/update_catalogs.py\n\n# or via CLI command\nmixpeek-iab-mapper update-catalogs --exact3 \"3.1\" --exact2 \"2.2\"\n# Optional: use a GitHub token to raise rate limits\n# export GITHUB_TOKEN=ghp_...\n```\n\nOutputs:\n- `iab_mapper/data/iab_2x.json` → `[{\"code\",\"label\"}]`\n- `iab_mapper/data/iab_3x.json` → `[{\"id\",\"label\",\"path\":[],\"scd\":bool}]`\n\nReplace or extend `synonyms_*.json` and `vectors_*.json` as needed for your org.\n\n---\n\n## ✨ Features\n- Deterministic alias/exact matching → fuzzy string matching → **optional local embeddings** (Sentence-Transformers) for near-misses\n- Emits **IAB 3.0 IDs** (not just labels) and configurable **`cattax`** for OpenRTB conformance\n- Multi-category output per input; **vector attributes** support\n- **SCD (Sensitive Content) flag** visibility and optional exclusion (`--drop-scd`)\n- Exports **CSV or JSON**; includes **OpenRTB** and **VAST CONTENTCAT** helpers\n- Local-only, reproducible, versioned catalogs\n\n---\n\n## 🔎 Why migrate to IAB 3.0?\n\n- 3.0 introduces clearer separation of primary topic “aboutness” vs. orthogonal vectors (e.g., news vs. opinion, formats, channels).\n- Better support for CTV/video, podcasts, games, and app stores.\n- Non‑backwards compatible in areas like News/Opinion and entertainment genres; careful migration is required.\n\nThis tool makes migration practical: it emits valid 3.0 IDs and helps curate edge cases with overrides, synonyms, thresholds, and audit outputs.\n\n---\n\n## 🧠 How it works\n\n1) Normalize text and apply alias/exact matches via synonyms.\n2) Fuzzy retrieval (rapidfuzz | TF‑IDF | BM25) with configurable thresholds.\n3) Optional semantic augmentation with local embeddings (Sentence‑Transformers or TF‑IDF KNN).\n4) Optional local LLM re‑ranking (Ollama) for ordering only.\n5) Assemble outputs: topic IDs + vector IDs → OpenRTB `content.cat` with configurable `cattax`.\n6) SCD flags are surfaced and can be excluded with `--drop-scd`.\n\n---\n\n## 🔧 Install\n\n### From PyPI (recommended)\n```bash\npip install iab-mapper\n```\n\n### 1) Clone / unpack\n```bash\nunzip iab-mapper.zip \u0026\u0026 cd iab-mapper\n```\n\n### 2) Python env \u0026 install\n```bash\npython -m venv .venv \u0026\u0026 source .venv/bin/activate\npip install -e .\n# Optional (enable local embeddings / KNN search)\npip install -e \".[emb]\"\n```\n\n\u003e If you need fully offline installs, pre-bundle the Sentence-Transformers model in your image/host and point to it via `--emb-model` (local path).\n\n### 3) LLM Re-ranking (Ollama, optional)\nIf you intend to use the LLM re-ranking feature (available in the demo's \"Advanced options\"), you need to have Ollama installed and the `llama3.1:8b` model pulled locally.\n\n```bash\n# Install Ollama (if you haven't already)\n# Refer to the Ollama docs for installation instructions\n\n# Pull the required LLM model\nollama pull llama3.1:8b\n```\n\nAfter installing Ollama and pulling the model, ensure your Ollama server is running (it usually starts automatically after installation).\n\n---\n\n## 🖥️ Run the Web Demo (UI)\n\nThe repository includes a small Mixpeek‑styled web UI plus a FastAPI backend that exposes `POST /api/map`.\n\n```bash\n# 1) Create a virtual environment (recommended)\npython -m venv .venv \u0026\u0026 source .venv/bin/activate\n\n# 2) Install the library and demo server deps\npip install -e .\npip install -r requirements-dev.txt\n\n# 3) Start the local server (serves API and the UI)\nuvicorn scripts.web_server:app --port 8000 --reload\n\n# 4) Open the demo in your browser\n# → http://localhost:8000/\n```\n\nOptional features used by the UI (enable if you toggle them in “Advanced options”):\n\n- **Embeddings (KNN)**: `pip install -e \".[emb]\"` to enable local semantic candidates.\n- **LLM re‑rank (Ollama)**: install Ollama and pull a model you plan to use, e.g.:\n\n```bash\nollama pull llama3.1:8b   # or another model; set the name in the UI\n```\n\nThe server will be available at `http://localhost:8000`, serving both the static UI and the API.\n\n---\n\n## 📁 Project Layout\n```\niab-mapper/\n  pyproject.toml\n  sample_2x_codes.csv\n  iab_mapper/\n    __init__.py\n    cli.py\n    pipeline.py\n    matching.py\n    normalize.py\n    embeddings.py\n    io_utils.py\n    data/\n      iab_2x.json\n      iab_3x.json\n      synonyms_2x.json\n      synonyms_3x.json\n      vectors_channel.json\n      vectors_type.json\n      vectors_format.json\n      vectors_language.json\n      vectors_source.json\n      vectors_environment.json\n```\n\nReplace the stub `data/*.json` with your **full IAB catalogs** (include `id`, `label`, `path`, and `scd` on 3.0 nodes).\n\n---\n\n## 🚀 Quick Start\n\n```bash\n# simplest path: fuzzy only, CSV in → JSON out\niab-mapper sample_2x_codes.csv -o mapped.json\n\n# enable local embeddings (improves recall on free‑text labels)\niab-mapper sample_2x_codes.csv -o mapped.json --use-embeddings\n\n# try with official IAB sample data (recommended)\niab-mapper demo/official_samples/sample_2x_codes_official.csv -o mapped_official.json\n```\n\nOpenRTB and VAST helpers (example output):\n\n```json\n{\"content\":{\"cat\":[\"3-5-2\",\"1026\",\"1068\"],\"cattax\":\"2\"}}\n```\n\n```text\n\"3-5-2\",\"1026\",\"1068\"\n```\n\nThe output contains for each input row:\n- `out_ids` → **IAB 3.0 IDs** (topics + any vector IDs)\n- `openrtb` → `{\"content\":{\"cat\":[...],\"cattax\":\"\u003cenum\u003e\"}}` (configurable via `--cattax`)\n- `vast_contentcat` → `\"id1\",\"id2\",...`\n- Topic confidences, sources (`\"exact\"/\"fuzzy\"/\"embed\"/\"override\"), SCD flags, and chosen vectors.\n\n---\n\n## 🐍 Python API (alternative to CLI)\n\nInstall:\n```bash\npip install iab-mapper\n```\n\nBasic usage:\n```python\nfrom pathlib import Path\nfrom iab_mapper.pipeline import Mapper, MapConfig\nimport iab_mapper as pkg\n\n# Use packaged stub catalogs or point data_dir to your own\ndata_dir = Path(pkg.__file__).parent / \"data\"\n\ncfg = MapConfig(\n    fuzzy_method=\"bm25\",   # rapidfuzz|tfidf|bm25\n    fuzzy_cut=0.92,\n    use_embeddings=False,   # set True and choose emb_model to enable\n    max_topics=3,\n    drop_scd=False,\n    cattax=\"2\",            # OpenRTB content.cattax enum\n    overrides_path=None     # path to JSON overrides if desired\n)\n\nmapper = Mapper(cfg, str(data_dir))\n\n# Single record with optional vectors\nrec = {\n    \"code\": \"2-12\",\n    \"label\": \"Food \u0026 Drink\",\n    \"channel\": \"editorial\",\n    \"type\": \"article\",\n    \"format\": \"video\",\n    \"language\": \"en\",\n    \"source\": \"professional\",\n    \"environment\": \"ctv\",\n}\n\nout = mapper.map_record(rec)\nprint(out[\"out_ids\"])         # topic + vector IDs\nprint(out[\"openrtb\"])         # {\"content\": {\"cat\": [...], \"cattax\": \"2\"}}\nprint(out[\"vast_contentcat\"]) # \"id1\",\"id2\",...\n\n# Or just map topics\ntopics = mapper.map_topics(\"Cooking how-to\")\n\n# Batch over a list of dicts\nrows = [rec, {\"label\": \"Sports\"}]\nmapped = [mapper.map_record(r) for r in rows]\n```\n\nEnable local embeddings (optional):\n```python\ncfg = MapConfig(fuzzy_method=\"rapidfuzz\", use_embeddings=True, emb_model=\"tfidf\", emb_cut=0.8)\nmapper = Mapper(cfg, str(data_dir))\nout = mapper.map_record({\"label\": \"Cooking how-to\"})\n```\n\nUse overrides (force mapping before matching):\n```python\ncfg = MapConfig(overrides_path=\"overrides.json\")  # [{\"code\":\"1-4\",\"label\":null,\"ids\":[\"2-3-18\"]}]\nmapper = Mapper(cfg, str(data_dir))\n```\n\n---\n\n## 📥 Input Formats\n\n### CSV\n- Required columns: `label`\n- Optional columns: `code` (2.x), `channel`, `type`, `format`, `language`, `source`, `environment`\n\nExample:\n```csv\ncode,label,channel,type,format,language,source,environment\n1-4,Sports,editorial,article,video,en,professional,ctv\n, Cooking how-to ,editorial,article,video,en,professional,web\n```\n\n### JSON\n- List of objects with the same fields as CSV.\n\n---\n\n## 📤 Output Formats\n\n### CSV\n- Includes compact JSON strings for complex fields (e.g., `topic_ids`, `openrtb`).\n\n### JSON\n- List of records. Example snippet:\n```json\n{\n  \"in_code\": \"2-12\",\n  \"in_label\": \"Food \u0026 Drink\",\n  \"out_ids\": [\"3-5-2\", \"1026\", \"1068\"],\n  \"out_labels\": [\"Food \u0026 Drink \u003e Cooking\"],\n  \"topic_ids\": [\"3-5-2\"],\n  \"topic_confidence\": [0.89],\n  \"topic_sources\": [\"fuzzy\"],\n  \"topic_scd\": [false],\n  \"vectors\": {\"channel\":\"editorial\",\"type\":\"article\",\"format\":\"video\",\"language\":\"en\",\"source\":\"professional\",\"environment\":\"ctv\"},\n  \"cattax\": \"2\",\n  \"openrtb\": {\"content\":{\"cat\":[\"3-5-2\",\"1026\",\"1068\"],\"cattax\":\"2\"}},\n  \"vast_contentcat\": \"\"3-5-2\",\"1026\",\"1068\"\"\n}\n```\n\n---\n\n## ⚙️ Useful Flags\n\n| Flag | Default | What it does |\n|------|---------|--------------|\n| `--fuzzy-cut` | `0.92` | Stricter = fewer, higher-confidence matches |\n| `--use-embeddings` | off | Enable local embeddings for near-miss labels |\n| `--emb-model` | `all-MiniLM-L6-v2` | Sentence-Transformers model or `tfidf` |\n| `--emb-cut` | `0.80` | Cosine similarity threshold for embeddings |\n| `--max-topics` | `3` | Cap topic IDs per row |\n| `--drop-scd` | off | Exclude Sensitive Content nodes |\n| `--cattax` | `2` | OpenRTB `content.cattax` enum |\n| `--unmapped-out` | — | Write misses to file for audit |\n| `--overrides` | — | Force mappings before match |\n\n---\n\n## 🧩 Vectors (Orthogonal Attributes)\nPass via columns or pre-fill in your CSV:\n- **Channel** (`vectors_channel.json`): e.g., `editorial`, `ugc`\n- **Type** (`vectors_type.json`): e.g., `article`, `podcast`, `livestream`\n- **Format** (`vectors_format.json`): e.g., `video`, `text`, `audio`\n- **Language** (`vectors_language.json`): e.g., `en`, `es`, `de`\n- **Source** (`vectors_source.json`): e.g., `professional`, `brand`, `news`\n- **Environment** (`vectors_environment.json`): e.g., `ctv`, `web`, `app`\n\nEach value maps to a **stable IAB 3.0 ID** that is appended to the `cat` array.\n\n---\n\n## ✅ IAB 3.0 Conformance Notes\n- Emits **IDs** for `content.cat` and sets **`\"cattax\":\"\u003cenum\u003e\"`**.  \n- Supports **multiple categories per content** (topic IDs + vectors).  \n- **Strict ID validation**: only IDs present in your 3.0 catalog are emitted.  \n- **SCD-aware**: show SCD flags and optionally exclude (`--drop-scd`).\n\n\u003e This tool is **not affiliated with IAB**. It is an independent utility for compatibility with IAB Content Taxonomy.\n\n---\n\n## 📎 Official IAB References\n\nSee also: `https://github.com/mixpeek/iab-mapper` and `https://mixpeek.com/tools/iab-taxonomy-mapper`.\n\n---\n\n## 🔬 Evaluation (recommended)\nCreate a small gold set for your domain and run periodic checks:\n```bash\n# (pseudo) compare mapped.json to gold.json for accuracy \u0026 unmapped rates\npython scripts/eval.py mapped.json gold.json\n```\nGate releases on accuracy deltas so behavior stays stable for audits.\n\nMinimal starter:\n\n```json\n// scripts/gold.json\n[{\"in_label\":\"Sports\",\"topic_ids\":[\"483\"]}]\n```\n\n```python\n# scripts/eval.py (toy example)\nimport json, sys\npred = { (r.get('in_label')): set(r.get('topic_ids',[])) for r in json.load(open(sys.argv[1])) }\ngold = { (r.get('in_label')): set(r.get('topic_ids',[])) for r in json.load(open(sys.argv[2])) }\ntp=fp=fn=0\nfor k in gold:\n    g=gold[k]; p=pred.get(k,set())\n    tp += len(g \u0026 p); fp += len(p - g); fn += len(g - p)\nprint({'tp':tp,'fp':fp,'fn':fn})\n```\n\n---\n\n## 🛠️ Updating Catalogs\nReplace the stub JSONs in `iab_mapper/data/` with your official datasets:\n- `iab_2x.json` → include `code`, `label`\n- `iab_3x.json` → include `id`, `label`, `path[]`, `scd`\n- `synonyms_*.json` → org-specific aliases\n - `vectors_*.json` → official vector catalogs mapping values to stable 3.0 IDs\n\nCommit with a version bump and note `taxonomy_version` in your release notes.\n\n---\n\n## 🔐 Security \u0026 operations\n\n- Local-first: processing happens on your machine; no external APIs needed.\n- No PII required; CSV/JSON processed in-memory.\n- Air‑gapped: prebundle ST model and run `iab-mapper` fully offline.\n\n---\n\n## 🤝 Using Mixpeek API (optional)\n\nIf you prefer managing catalogs, outputs, and audits centrally, you can run mapping locally and then persist results via Mixpeek for auditability.\n\n```http\n# 1) create collection\nPOST /collections { \"name\": \"iab-taxonomy\" }\n\n# 2) create 'document' with 2.x codes\nPOST /collections/{id}/documents { \"document_id\":\"iab-2x\", \"properties\": { ... } }\n\n# 3) run taxonomy feature extractor (2.x → 3.0)\nPOST /collections/{id}/documents/{doc}/features { \"extractor\":\"taxonomy\", \"params\":{\"target_version\":\"3.0\"} }\n\n# 4) fetch enriched doc\nGET /collections/{id}/documents/{doc}\n```\n\nSee also: `https://mixpeek.com/tools/iab-taxonomy-mapper`.\n\n## 🧯 Troubleshooting\n- **No matches:** lower `--fuzzy-cut` or enable `--use-embeddings`.\n- **Weird matches:** raise thresholds; add synonyms into `synonyms_*.json`.\n- **Offline:** pre-bundle ST model; set `--emb-model` to a local folder path.\n- **CSV issues:** ensure UTF-8 and header row (`label` required).\n - **Unmapped:** inspect `--unmapped-out` and add overrides/synonyms as needed.\n\n---\n\n## 📦 Example Commands\n```bash\n# Strict fuzzy only\niab-mapper sample_2x_codes.csv -o mapped.csv --fuzzy-cut 0.95\n\n# Embeddings on, drop SCD, max 2 topics, custom cattax, collect unmapped\niab-mapper sample_2x_codes.csv -o mapped.json --use-embeddings --drop-scd --max-topics 2 --cattax 2 --unmapped-out misses.json\n```\n\n---\n\n## 📜 License\nBSD 2-Clause. See [LICENSE](LICENSE).\n\nInclude IAB attribution in your deployed UI/footer:\n\u003e \"IAB is a registered trademark of the Interactive Advertising Bureau. This tool is an independent utility built by Mixpeek for interoperability with IAB Content Taxonomy standards.\"\n\n---\n\n## 📞 Support \u0026 Contact\n\n- **Issues:** [GitHub Issues](https://github.com/mixpeek/iab-mapper/issues)\n- **Documentation:** [Mixpeek IAB Mapper](https://mixpeek.com/tools/iab-taxonomy-mapper)\n- **Questions:** [Open an issue](https://github.com/mixpeek/iab-mapper/issues/new) or contact [Mixpeek](https://mixpeek.com)\n\nFor enterprise support, custom integrations, or questions about multimodal classification extensions, reach out to the Mixpeek team.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmixpeek%2Fiab-mapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmixpeek%2Fiab-mapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmixpeek%2Fiab-mapper/lists"}