skills/sink/SKILL.md
Sink short link API operations via OpenAPI. Use when managing short links: creating, querying, updating, deleting, listing, importing, exporting links, configuring smart routing, password protection, unsafe-link warnings, and analytics exports. Also covers AI-powered slug and OpenGraph metadata generation. Triggers: "create short link", "shorten URL", "delete link", "edit link", "list links", "export links", "import links", "link analytics", "export analytics", "AI slug", "AI OpenGraph", "geo routing".
npx skillsauth add miantiao-me/sink sinkInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Sink is a link shortener running on Cloudflare. Manage links via REST API.
All endpoints require Bearer token authentication:
Authorization: Bearer YOUR_SITE_TOKEN
Token = NUXT_SITE_TOKEN environment variable.
https://your-sink-domain
POST /api/link/create
Content-Type: application/json
{
"url": "https://example.com/long-url",
"slug": "custom-slug",
"comment": "optional note",
"expiration": 1735689599,
"apple": "https://apps.apple.com/app/id123",
"google": "https://play.google.com/store/apps/details?id=com.example",
"geo": {
"US": "https://example.com/us"
},
"title": "Example Title",
"description": "Example social preview description",
"password": "optional-password",
"redirectWithQuery": true
}
Required: url
Optional: slug (auto-generated if omitted), comment, expiration (unix timestamp), apple (Apple device redirect), google (Android redirect), geo (country-specific routing map), password, unsafe, title, description, image, cloaking, redirectWithQuery
If
NUXT_SAFE_BROWSING_DOHis configured andunsafeis not explicitly set, the server auto-detects via DoH and marks unsafe links automatically.
Response (201):
{
"link": {
"id": "abc123",
"url": "https://example.com/long-url",
"slug": "custom-slug",
"createdAt": 1718119809,
"updatedAt": 1718119809
},
"shortLink": "https://your-domain/custom-slug"
}
Errors: 409 (slug exists)
GET /api/link/query?slug=custom-slug
Response (200):
{
"id": "abc123",
"url": "https://example.com",
"slug": "custom-slug",
"createdAt": 1718119809,
"updatedAt": 1718119809
}
Errors: 404 (not found)
PUT /api/link/edit
Content-Type: application/json
{
"slug": "existing-slug",
"url": "https://new-url.com",
"comment": "updated note"
}
Required: slug (identifies which link to edit), url
Optional: other fields to update
Response (201): Same as create
Errors: 404 (not found)
POST /api/link/delete
Content-Type: application/json
{
"slug": "slug-to-delete"
}
Response: 200 (empty body)
GET /api/link/list?limit=20&cursor=abc123
Parameters:
limit: max 1024, default 20cursor: pagination cursor from previous responseResponse:
{
"keys": [],
"list_complete": false,
"cursor": "next-cursor"
}
GET /api/link/export
Response:
{
"version": "1.0",
"exportedAt": "2024-01-01T00:00:00Z",
"count": 100,
"links": [],
"list_complete": true
}
POST /api/link/import
Content-Type: application/json
{
"links": [
{"url": "https://example1.com", "slug": "ex1"},
{"url": "https://example2.com", "slug": "ex2"}
]
}
Response: imported links array
GET /api/link/ai?url=https://example.com/article
The server can use the URL and extracted page content to generate a readable slug.
Response:
{
"slug": "ai-generated-slug"
}
GET /api/link/og-ai?url=https://example.com/article&locale=en-US
Generates a localized OpenGraph title and description from the URL and extracted page content.
Response:
{
"title": "Example Article",
"description": "A concise social preview description."
}
GET /api/verify
Verify if the site token is valid.
Response (200):
{
"name": "Sink",
"url": "https://sink.cool"
}
Errors: 401 (invalid token)
| Field | Type | Required | Description |
| ------------------- | ------- | -------- | ------------------------------------------------------------------------------------ |
| url | string | Yes | Target URL (max 2048) |
| slug | string | No | Custom slug (auto-generated) |
| comment | string | No | Internal note |
| expiration | number | No | Unix timestamp |
| apple | string | No | iOS/macOS redirect URL |
| google | string | No | Android redirect URL |
| geo | object | No | Country-specific routing map, for example { "US": "https://example.com/us" } |
| title | string | No | Custom title (max 256) |
| description | string | No | Custom description |
| image | string | No | Custom image path |
| cloaking | boolean | No | Enable link cloaking |
| redirectWithQuery | boolean | No | Append query params to destination URL (overrides global NUXT_REDIRECT_WITH_QUERY) |
| password | string | No | Password protection for the link |
| unsafe | boolean | No | Mark as unsafe (shows warning page before redirect) |
GET /api/stats/counters
GET /api/stats/metrics
GET /api/stats/views
GET /api/stats/heatmap
GET /api/stats/export?startAt=1717200000&endAt=1719791999&slug=custom-slug
Returns text/csv with slug, url, viewer, views, and referer columns.
/_docs/openapi.json/_docs/scalar/_docs/swaggerCreate link:
curl -X POST https://your-domain/api/link/create \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://github.com/example"}'
List links:
curl https://your-domain/api/link/list \
-H "Authorization: Bearer YOUR_TOKEN"
Delete link:
curl -X POST https://your-domain/api/link/delete \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"slug": "my-slug"}'
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.
development
End-to-end Parallels smoke, upgrade, and rerun workflow for OpenClaw across macOS, Windows, and Linux guests. Use when Codex needs to run, rerun, debug, or interpret VM-based install, onboarding, gateway smoke tests, latest-release-to-main upgrade checks, fresh snapshot retests, or optional Discord roundtrip verification under Parallels.