{"id":19223126,"url":"https://github.com/ghost-land/nlib-api","last_synced_at":"2026-06-14T18:37:36.760Z","repository":{"id":256263141,"uuid":"850030704","full_name":"ghost-land/Nlib-API","owner":"ghost-land","description":"API for Nintendo Library","archived":false,"fork":false,"pushed_at":"2024-11-10T23:05:01.000Z","size":106,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-04T20:47:47.576Z","etag":null,"topics":["api","nintendo","nintendo-switch","rest-api","restful-api"],"latest_commit_sha":null,"homepage":"https://api.nlib.cc","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ghost-land.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-30T18:27:00.000Z","updated_at":"2024-11-10T23:05:05.000Z","dependencies_parsed_at":"2024-09-09T22:57:51.212Z","dependency_job_id":"032fca8f-b34f-4e1c-a48c-cf5c039500ea","html_url":"https://github.com/ghost-land/Nlib-API","commit_stats":null,"previous_names":["ghost-land/nlib-api"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghost-land%2FNlib-API","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghost-land%2FNlib-API/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghost-land%2FNlib-API/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghost-land%2FNlib-API/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ghost-land","download_url":"https://codeload.github.com/ghost-land/Nlib-API/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240298400,"owners_count":19779281,"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","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":["api","nintendo","nintendo-switch","rest-api","restful-api"],"created_at":"2024-11-09T15:07:05.216Z","updated_at":"2026-06-14T18:37:36.753Z","avatar_url":"https://github.com/ghost-land.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nlib API\n\nA modern and performant REST API for Nintendo game library data. Access game information, media assets, screenshots, and comprehensive statistics across Nintendo platforms.\n\n[![License: GPL-3.0](https://img.shields.io/badge/License-GPL%203.0-blue.svg)](https://opensource.org/licenses/GPL-3.0)\n[![API Status](https://img.shields.io/badge/status-online-success.svg)](https://api.nlib.cc/uptime)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg?logo=node.js\u0026logoColor=white)](https://nodejs.org/)\n[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-%3E%3D12-316192.svg?logo=postgresql\u0026logoColor=white)](https://www.postgresql.org/)\n\n[![GitHub Stars](https://img.shields.io/github/stars/ghost-land/Nlib-API?style=flat)](https://github.com/ghost-land/Nlib-API/stargazers)\n[![GitHub Issues](https://img.shields.io/github/issues/ghost-land/Nlib-API?style=flat)](https://github.com/ghost-land/Nlib-API/issues)\n[![Last Commit](https://img.shields.io/github/last-commit/ghost-land/Nlib-API?style=flat)](https://github.com/ghost-land/Nlib-API/commits)\n\n## Features\n\n- 🎮 Complete Nintendo Switch game database\n- 🎮 Complete Nintendo 3DS game database\n- 🖼️ Game icons, banners, and screenshots\n- 🌍 Multi-language support (11 languages for Switch)\n- 📊 Comprehensive statistics\n- 🔄 Automatic daily synchronization with TitleDB\n- 🚀 Fast and lightweight\n\n## API Documentation\n\n### Base URL\n\nThe API is accessible at your deployment URL. All endpoints support trailing slashes.\n\n### Nintendo Switch Endpoints (`/nx`)\n\n#### Get Game Information\n\n```http\nGET /nx/:tid?lang=en\n```\n\n**Parameters:**\n- `tid` (required) - 16-character hexadecimal Title ID\n- `lang` (optional) - Language code, default: `en`\n  - Available: `en`, `ja`, `es`, `de`, `fr`, `nl`, `pt`, `it`, `zh`, `ko`, `ru`\n- `fields` (optional) - Comma-separated list of fields to include. Always includes `id`.\n  - Example: `name,description,publisher`\n\n**Example Requests:**\n```http\n# Full response\nGET /nx/01007EF00011E000?lang=fr\n\n# Only specific fields\nGET /nx/01007EF00011E000?fields=name,description\nGET /nx/01007EF00011E000?fields=description\nGET /nx/01007EF00011E000?fields=name,publisher,releaseDate,icon\n\n# Combine parameters\nGET /nx/01007EF00011E000?lang=fr\u0026fields=name,description,intro\n```\n\n**Example Response:**\n```json\n{\n  \"description\": \"Full game description...\",\n  \"id\": \"01007EF00011E000\",\n  \"name\": \"The Legend of Zelda™: Breath of the Wild\",\n  \"publisher\": \"Nintendo\",\n  \"releaseDate\": \"2017-03-03\",\n  \"version\": 196608,\n  \"category\": [\"Adventure\", \"Action\", \"RPG\"],\n  \"developer\": \"Nintendo EPD\",\n  \"intro\": \"Short introduction...\",\n  \"isDemo\": false,\n  \"languages\": [\"ja\", \"en\", \"es\", \"fr\", \"de\", \"it\", \"nl\", \"ru\", \"ko\", \"zh\"],\n  \"nsuId\": 70010000000025,\n  \"numberOfPlayers\": 1,\n  \"ratingContent\": [\"Fantasy Violence\", \"Mild Suggestive Themes\"],\n  \"region\": \"US\",\n  \"rightsId\": \"01007EF00011E0000000000000000000\",\n  \"console\": \"nx\",\n  \"type\": \"base\",\n  \"icon\": \"https://api.nlib.cc/nx/01007EF00011E000/icon\",\n  \"banner\": \"https://api.nlib.cc/nx/01007EF00011E000/banner\",\n  \"screens\": {\n    \"count\": 8,\n    \"screenshots\": [\n      \"https://api.nlib.cc/nx/01007EF00011E000/screen/1\",\n      \"https://api.nlib.cc/nx/01007EF00011E000/screen/2\",\n      \"https://api.nlib.cc/nx/01007EF00011E000/screen/3\"\n    ]\n  }\n}\n```\n\n**Example Filtered Response:**\n```http\nGET /nx/01007EF00011E000?fields=name,description\n```\n\n```json\n{\n  \"id\": \"01007EF00011E000\",\n  \"name\": \"The Legend of Zelda™: Breath of the Wild\",\n  \"description\": \"Full game description...\"\n}\n```\n\n**Notes:**\n- Media URLs (`icon`, `banner`, `screens`) are only included if the corresponding media files are available\n- Use the `fields` parameter to request only specific data and reduce response size\n- The `id` field is always included in the response\n- SQL queries are optimized to select only requested fields\n- Media checks (filesystem operations) are skipped if not requested\n\n**Performance Benefits:**\n\n| Request | Response Size | SQL Complexity | Media Checks |\n|---------|---------------|----------------|--------------|\n| Full response | 2-5 KB | All fields + JOIN | 3 file checks |\n| `?fields=name,publisher` | ~100 bytes | 2 fields only | None |\n| `?fields=description` | ~1-3 KB | 1 field + JOIN | None |\n| `?fields=name,icon` | ~200 bytes | 1 field only | Icon only |\n\n**Example optimization:**\n```http\n# Before: Full response (2.5 KB, 15ms)\nGET /nx/01007EF00011E000\n\n# After: Only what you need (150 bytes, 3ms)\nGET /nx/01007EF00011E000?fields=name,publisher\n```\n\n#### Get Game Icon\n\n```http\nGET /nx/:tid/icon/:width?/:height?\n```\n\n**Parameters:**\n- `width` (optional) - Size in pixels (30-4096). Automatically rounded to nearest 10.\n- `height` (optional) - Must equal width if provided. Icons are always square.\n\nReturns the game icon in JPEG format. If no size is specified, returns the original image.\n\n**Examples:**\n```http\nGET /nx/01007EF00011E000/icon              # Original size\nGET /nx/01007EF00011E000/icon/32           # 30x30 (rounded)\nGET /nx/01007EF00011E000/icon/64           # 60x60 (rounded)\nGET /nx/01007EF00011E000/icon/256          # 260x260 (rounded)\nGET /nx/01007EF00011E000/icon/256/256      # 260x260 (explicit)\nGET /nx/01007EF00011E000/icon/512/512      # 510x510 (rounded)\nGET /nx/01007EF00011E000/icon/1024         # 1020x1020 (rounded)\n```\n\n**Notes:**\n- Icons are always square\n- Sizes are automatically rounded to the nearest 10 pixels for cache optimization\n- Minimum size: 30 pixels\n- Both `/icon/256` and `/icon/256/256` produce identical results\n- Response header `X-Size-Rounded` shows the actual size served (e.g., `64-\u003e60`)\n\n#### Get Game Banner\n\n```http\nGET /nx/:tid/banner/:size?\nGET /nx/:tid/banner/:width/:height\n```\n\n**Parameters:**\n- `size` (optional) - Banner size shorthand\n  - Shortcuts: `240`/`240p`, `360`/`360p`, `480`/`480p`, `540`/`540p`, `720`/`720p`, `1080`/`1080p`\n  - Widths: `426`, `640`, `854`, `960`, `1280`, `1920`\n  - Default: 1920x1080 (1080p)\n- `width` (optional) - Custom width in pixels (100-1920)\n- `height` (optional) - Custom height in pixels (100-1080)\n\nReturns the game banner in JPEG format.\n\n**Examples (Shortcuts):**\n```http\nGET /nx/01007EF00011E000/banner         # 1920x1080 (default)\nGET /nx/01007EF00011E000/banner/1080p   # 1920x1080\nGET /nx/01007EF00011E000/banner/720p    # 1280x720\nGET /nx/01007EF00011E000/banner/540p    # 960x540\nGET /nx/01007EF00011E000/banner/480p    # 854x480\nGET /nx/01007EF00011E000/banner/360p    # 640x360\nGET /nx/01007EF00011E000/banner/240p    # 426x240\nGET /nx/01007EF00011E000/banner/1920    # 1920x1080\nGET /nx/01007EF00011E000/banner/426     # 426x240\n```\n\n**Examples (Custom dimensions):**\n```http\nGET /nx/01007EF00011E000/banner/1280/720   # Custom 1280x720\nGET /nx/01007EF00011E000/banner/1920/1080  # Custom 1920x1080\nGET /nx/01007EF00011E000/banner/800/450    # Custom 800x450\nGET /nx/01007EF00011E000/banner/640/360    # Custom 640x360\n```\n\n#### Get Screenshot\n\n```http\nGET /nx/:tid/screen/:index\n```\n\n**Parameters:**\n- `index` (required) - Screenshot index (starts at 1)\n\nReturns a specific screenshot in JPEG format.\n\n#### Get All Screenshots\n\n```http\nGET /nx/:tid/screens\n```\n\n**Example Response:**\n```json\n{\n  \"count\": 8,\n  \"screenshots\": [\n    \"https://api.nlib.cc/nx/0100ABC001234000/screen/1\",\n    \"https://api.nlib.cc/nx/0100ABC001234000/screen/2\",\n    \"https://api.nlib.cc/nx/0100ABC001234000/screen/3\"\n  ]\n}\n```\n\nNote: Screenshot URLs are dynamically generated based on the API domain.\n\n#### Get Statistics\n\n```http\nGET /nx/stats\n```\n\n### Nintendo 3DS Endpoints (`/ctr`)\n\n#### Get Statistics\n\n```http\nGET /ctr/stats\n```\n\n**Example Response:**\n```json\n{\n  \"total\": 5844,\n  \"categories\": {\n    \"base\": 3515,\n    \"dlc\": 0,\n    \"dsiware\": 1202,\n    \"updates\": 477,\n    \"videos\": 27,\n    \"virtual-console\": 623\n  }\n}\n```\n\n#### Get Category Titles\n\n```http\nGET /ctr/category/:category\n```\n\n**Parameters:**\n- `category` (required) - Category name: `base`, `dlc`, `dsiware`, `extras`, `themes`, `updates`, `videos`, `virtual-console`\n\n**Example Response:**\n```json\n{\n  \"category\": \"base\",\n  \"count\": 3515,\n  \"titles\": [\n    \"0004000000030000\",\n    \"0004000000030100\",\n    \"0004000000030200\"\n  ]\n}\n```\n\n#### Get Game Information\n\n```http\nGET /ctr/:tid?fields=name,description\n```\n\n**Parameters:**\n- `tid` (required) - 16-character hexadecimal Title ID\n- `fields` (optional) - Comma-separated list of fields to include\n\n**Example Response:**\n```json\n{\n  \"tid\": \"0004000000030000\",\n  \"uid\": \"50010000009504\",\n  \"name\": \"新･光神話 パルテナの鏡\",\n  \"formal_name\": \"新･光神話 パルテナの鏡\",\n  \"description\": \"冥府軍と、飛べない天使ピットの壮大な戦いを描いたシングルプレイ。\",\n  \"release_date_on_eshop\": \"2013-10-31\",\n  \"product_code\": \"CTR-N-AKDJ\",\n  \"platform_name\": \"3DSカード/ダウンロードソフト\",\n  \"region\": \"Japan\",\n  \"genres\": [\"アクション\", \"シューティング\"],\n  \"features\": [\"インターネット対応\", \"3D映像対応\"],\n  \"languages\": [\"日本語\"],\n  \"rating_system\": {\"name\": \"CERO\", \"age\": \"12\"},\n  \"version\": \"v0.2.0\",\n  \"media\": {\n    \"banner\": \"http://api.ghseshop.cc/ctr/0004000000030000/banner\",\n    \"icon\": \"http://api.ghseshop.cc/ctr/0004000000030000/icon\",\n    \"screenshots\": {\n      \"compiled\": [\"http://api.ghseshop.cc/ctr/0004000000030000/screen/1\"],\n      \"uncompiled\": {\n        \"upper\": [\"http://api.ghseshop.cc/ctr/0004000000030000/screen_u/1/u\"],\n        \"lower\": [\"http://api.ghseshop.cc/ctr/0004000000030000/screen_u/1/l\"]\n      }\n    },\n    \"thumbnails\": [\"http://api.ghseshop.cc/ctr/0004000000030000/thumb/1\"]\n  }\n}\n```\n\n#### Get Specific Metadata Field\n\n```http\nGET /ctr/:tid/meta/:meta\n```\n\n**Parameters:**\n- `tid` (required) - 16-character hexadecimal Title ID\n- `meta` (required) - Metadata field name (e.g., `name`, `description`, `release_date_on_eshop`)\n\n#### Get Media Assets\n\n```http\nGET /ctr/:tid/media          # All media URLs\nGET /ctr/:tid/icon           # Icon image\nGET /ctr/:tid/banner         # Banner image\nGET /ctr/:tid/screens        # List compiled screenshots\nGET /ctr/:tid/screen/:num    # Compiled screenshot\nGET /ctr/:tid/screen_u       # List uncompiled screenshots\nGET /ctr/:tid/screen_u/:num/:screen  # Uncompiled screenshot (u/l)\nGET /ctr/:tid/thumbs         # List thumbnails\nGET /ctr/:tid/thumb/:num     # Thumbnail image\n```\n\n**Notes:**\n- All images are served in JPEG format\n- Uncompiled screenshots use `u` for upper screen and `l` for lower screen\n- Media files are stored in `media/ctr/[category]/[tid]/` directory structure\n\n### System Endpoints\n\n#### Uptime Status\n\n```http\nGET /uptime\n```\n\nReturns server status and uptime information.\n\n## Database Schema\n\n### nx\n\nMain table storing game information.\n\n| Column | Type | Description |\n|--------|------|-------------|\n| tid | VARCHAR(16) | Title ID (Primary Key) |\n| name | TEXT | Game name |\n| publisher | TEXT | Publisher name |\n| developer | TEXT | Developer name |\n| release_date | VARCHAR(10) | Release date (YYYY-MM-DD) |\n| category | TEXT | Categories (JSON array) |\n| languages | TEXT | Supported languages (JSON array) |\n| nsu_id | BIGINT | Nintendo eShop ID |\n| number_of_players | INTEGER | Number of players |\n| rating_content | TEXT | Rating content (JSON array) |\n| rights_id | VARCHAR(32) | Rights ID |\n| region | VARCHAR(10) | Region code |\n| is_demo | INTEGER | Is demo (0/1) |\n| console | VARCHAR(10) | Console identifier (default: 'nx') |\n| type | VARCHAR(20) | Game type (base/update/dlc) |\n| version | INTEGER | Version number |\n| updated_at | TIMESTAMP | Last update timestamp |\n\n### nx_[lang]\n\nLanguage-specific tables for game descriptions (11 tables: en, ja, es, de, fr, nl, pt, it, zh, ko, ru).\n\n| Column | Type | Description |\n|--------|------|-------------|\n| tid | VARCHAR(16) | Title ID (Primary Key, Foreign Key) |\n| intro | TEXT | Short introduction |\n| description | TEXT | Full description |\n\n### ctr\n\nMain table storing Nintendo 3DS game information.\n\n| Column | Type | Description |\n|--------|------|-------------|\n| tid | VARCHAR(16) | Title ID (Primary Key) |\n| uid | VARCHAR(32) | Unique ID |\n| name | TEXT | Game name |\n| formal_name | TEXT | Formal game name |\n| description | TEXT | Game description |\n| release_date_on_eshop | VARCHAR(10) | Release date on eShop (YYYY-MM-DD) |\n| product_code | VARCHAR(32) | Product code |\n| platform_name | TEXT | Platform name |\n| region | VARCHAR(50) | Region |\n| genres | TEXT | Genres (JSON array) |\n| features | TEXT | Features (JSON array) |\n| languages | TEXT | Supported languages (JSON array) |\n| rating_system | TEXT | Rating system (JSON object) |\n| version | VARCHAR(20) | Version |\n| disclaimer | TEXT | Disclaimer text |\n| descriptors | TEXT | Descriptors (JSON array) |\n| category | VARCHAR(50) | Category (base/dlc/dsiware/etc.) |\n| updated_at | TIMESTAMP | Last update timestamp |\n\n### sync_log\n\nTracks synchronization history.\n\n| Column | Type | Description |\n|--------|------|-------------|\n| id | SERIAL | Auto-increment ID (Primary Key) |\n| synced_at | TIMESTAMP | Sync timestamp |\n| games_count | INTEGER | Number of games synced |\n| status | VARCHAR(50) | Sync status |\n| source | VARCHAR(100) | Sync source |\n\n## Automatic Synchronization\n\nThe API uses a two-stage synchronization system:\n\n### Stage 1: NX TIDs (Daily at 3:00 AM)\n\n**Source:** `https://nx-missing.ghostland.at/data/working.txt`\n\n- Downloads list of all Nintendo Switch Title IDs\n- Indexes base games (TIDs starting with `01` and ending with `000`)\n- Creates database entries with TID only\n\n### Stage 2: TitleDB (Every 12 hours at 3:00 AM \u0026 3:00 PM)\n\n**Source:** `https://raw.githubusercontent.com/blawar/titledb/refs/heads/master/`\n\n- Downloads game metadata from multiple regions\n- Enriches existing TIDs with detailed information\n- Supports 11 languages\n- **Never overwrites existing data** - preserves data quality\n\n### Data Priority Rules\n\n1. Existing (non-null) data is never overwritten\n2. US.en is processed first for English content\n3. Multiple regions provide data redundancy\n\n## Installation\n\n### Requirements\n\n- Node.js 18+\n- PostgreSQL 12+\n\n### Database Setup\n\n1. **Create PostgreSQL database:**\n\n```bash\n# Connect to PostgreSQL\npsql -U postgres\n\n# Create database and user\nCREATE DATABASE nlib_api;\nCREATE USER nlib_user WITH PASSWORD 'your_secure_password';\nGRANT ALL PRIVILEGES ON DATABASE nlib_api TO nlib_user;\n\\q\n```\n\n2. **Create tables:**\n\n```bash\n# Execute the schema file\npsql -h localhost -U nlib_user -d nlib_api -f database-schema.sql\n```\n\n### Application Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/ghost-land/Nlib-API.git\ncd Nlib-API\n\n# Install dependencies\nnpm install\n\n# Create .env file\ncp .env.example .env\n# Edit .env with your database credentials\n\n# Start the server\nnpm start\n```\n\nThe server will start on port 3000 by default (configurable via `PORT` environment variable).\n\n## Environment Variables\n\nCopy `.env.example` to `.env` and configure your database credentials:\n\n```bash\ncp .env.example .env\n```\n\nThen edit `.env` with your PostgreSQL connection details.\n\n## Development\n\n```bash\n# Run in development mode\nnpm start\n\n# Enable debug logs\n# Add DB_DEBUG=true to your .env file\n```\n\n## Media Storage Structure\n\nMedia files are organized by platform:\n\n```\nmedia/\n├── nx/\n│   └── [tid]/\n│       ├── icon\n│       ├── banner\n│       ├── screens/\n│       │   ├── screen_1\n│       │   ├── screen_2\n│       │   └── …\n│       └── cache/\n└── ctr/\n    └── [category]/\n        └── [tid]/\n            ├── icon\n            ├── banner\n            ├── top_image\n            ├── screen/\n            │   ├── 1\n            │   ├── 2\n            │   └── …\n            ├── screen_u/\n            │   ├── 1_u\n            │   ├── 1_l\n            │   ├── 2_u\n            │   ├── 2_l\n            │   └── …\n            └── thumb/\n                ├── 1\n                ├── 2\n                └── …\n```\n- All media assets must be stored without file extensions; only the base name described above should exist on disk.\n- Images are expected in JPEG format (original files can be JPEG; converted assets are served as JPEG by the API).\n\n- **Nintendo Switch**: Metadata in PostgreSQL, media in `media/nx/[tid]/`\n- **Nintendo 3DS**: Metadata in PostgreSQL (table `ctr`), media in `media/ctr/[category]/[tid]/`\n\n## Important Notes\n\n- All Title IDs are automatically converted to uppercase\n- Endpoints can be called with or without trailing slashes\n- All images are served in JPEG format\n- **Nintendo Switch**:\n  - Icons support optional resizing (30-4096 pixels, rounded to nearest 10) and are always square\n  - Banners support multiple sizes: 240p, 360p, 480p, 540p, 720p, 1080p\n  - Banners support custom dimensions: `/banner/:width/:height` (100-1920 x 100-1080)\n  - Resized images are cached on disk for optimal performance\n- **Nintendo 3DS**:\n  - Screenshots are available in compiled and uncompiled formats\n  - Uncompiled screenshots separate upper (`u`) and lower (`l`) screens\n- Screenshot URLs are generated dynamically based on the API domain\n- Database synchronization runs automatically\n- API responses use standard HTTP status codes (200, 404, 500)\n\n## License\n\nThis project is licensed under the GPL-3.0 License - see the LICENSE file for details.\n\n## Credits\n\n- Game data sourced from [TitleDB](https://github.com/blawar/titledb)\n- Nintendo Switch Title IDs from [nx-missing](https://nx-missing.ghostland.at/)\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fghost-land%2Fnlib-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fghost-land%2Fnlib-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fghost-land%2Fnlib-api/lists"}