Properties
| Name | Type | Description |
|---|---|---|
| linkId | string | |
| tenantId | string | |
| slug | object | |
| targetUrl | string | Absent on link pages |
| page | object | |
| pageFooterPaid | object | The page footer was paid off, for this link for good |
| warnings | array | Create/update only: what reads badly on the page (low contrast, suspicious wording). The page was saved. |
| shortUrl | string | `{base}/{slug}`; share this. QR images encode it with `?s=qr`. |
| name | string | |
| tags | object | |
| metadata | object | |
| groupIds | object | |
| qrStyle | object | |
| rules | array | Evaluated in order on each visit; first match wins, else targetUrl. [] on links without rules |
| status | string | |
| visitCount | integer | Lifetime human visits (qr + direct); bots excluded |
| lastVisitedAt | string | |
| createdAt | string | |
| updatedAt | string |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/esyurl-fyi/json-schema/esyurl-fyi-short-link-schema.json",
"title": "ShortLink",
"x-generated": "2026-11-07",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/esyurl-fyi-openapi.json#/components/schemas/ShortLink",
"type": "object",
"required": [
"linkId",
"tenantId",
"slug",
"shortUrl",
"tags",
"metadata",
"groupIds",
"qrStyle",
"status",
"visitCount",
"createdAt",
"updatedAt"
],
"properties": {
"linkId": {
"type": "string"
},
"tenantId": {
"type": "string"
},
"slug": {
"$ref": "#/$defs/Slug"
},
"targetUrl": {
"type": "string",
"format": "uri",
"description": "Absent on link pages"
},
"page": {
"$ref": "#/$defs/LinkPage"
},
"pageFooterPaid": {
"type": "object",
"properties": {
"paymentKey": {
"type": "string"
},
"at": {
"type": "string",
"format": "date-time"
}
},
"description": "The page footer was paid off, for this link for good"
},
"warnings": {
"type": "array",
"description": "Create/update only: what reads badly on the page (low contrast, suspicious wording). The page was saved.",
"items": {
"type": "object",
"properties": {
"code": {
"type": "string",
"enum": [
"low_contrast",
"suspicious_wording"
]
},
"path": {
"type": "string"
},
"message": {
"type": "string"
},
"ratio": {
"type": "number"
}
}
}
},
"shortUrl": {
"type": "string",
"format": "uri",
"description": "`{base}/{slug}`; share this. QR images encode it with `?s=qr`."
},
"name": {
"type": "string"
},
"tags": {
"$ref": "#/$defs/Tags"
},
"metadata": {
"$ref": "#/$defs/Metadata"
},
"groupIds": {
"$ref": "#/$defs/GroupIds"
},
"qrStyle": {
"$ref": "#/$defs/QrStyle"
},
"rules": {
"type": "array",
"items": {
"$ref": "#/$defs/RedirectRule"
},
"description": "Evaluated in order on each visit; first match wins, else targetUrl. [] on links without rules"
},
"status": {
"type": "string",
"enum": [
"active",
"paused"
]
},
"visitCount": {
"type": "integer",
"description": "Lifetime human visits (qr + direct); bots excluded"
},
"lastVisitedAt": {
"type": "string",
"format": "date-time"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
},
"$defs": {
"GroupIds": {
"type": "array",
"maxItems": 20,
"uniqueItems": true,
"items": {
"$ref": "#/$defs/Id"
},
"description": "A set: returned sorted; duplicates are dropped"
},
"HexColour": {
"type": "string",
"pattern": "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
},
"Id": {
"type": "string",
"pattern": "^[A-Za-z0-9]{1,64}$"
},
"LinkPage": {
"type": "object",
"description": "A link page as stored: pictures are {imageId}, every item has its id, linkId items carry the slug they open.",
"properties": {
"title": {
"type": "string"
},
"bio": {
"type": "string"
},
"avatar": {
"type": "object",
"properties": {
"imageId": {
"type": "string"
}
}
},
"items": {
"type": "array",
"items": {
"type": "object"
}
},
"socials": {
"type": "array",
"items": {
"type": "object"
}
},
"theme": {
"type": "object"
},
"language": {
"type": "string"
},
"noindex": {
"type": "boolean"
},
"footer": {
"type": "boolean"
}
}
},
"Metadata": {
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"type": "string",
"maxLength": 512
}
},
"QrStyle": {
"type": "object",
"additionalProperties": false,
"description": "How the link's QR image looks (free). Styled codes (any of modules, eyeFrame, eyeBall, eyeColor, image) need dark on light at a contrast of at least 3:1. In requests, `image` carries a new picture as `data`, or keeps the current one by its `imageId`; responses carry `imageId`.",
"properties": {
"dark": {
"$ref": "#/$defs/HexColour"
},
"light": {
"$ref": "#/$defs/HexColour"
},
"errorCorrectionLevel": {
"type": "string",
"enum": [
"L",
"M",
"Q",
"H"
],
"description": "Forced to H with a picture"
},
"margin": {
"type": "integer",
"minimum": 0,
"maximum": 16
},
"modules": {
"type": "string",
"enum": [
"square",
"rounded",
"dot",
"row",
"column"
],
"description": "Shape of the data modules (default square)"
},
"eyeFrame": {
"type": "string",
"enum": [
"square",
"rounded",
"circle"
],
"description": "Outer ring of the three corner markers"
},
"eyeBall": {
"type": "string",
"enum": [
"square",
"rounded",
"circle"
],
"description": "Centre of the corner markers"
},
"eyeColor": {
"$ref": "#/$defs/HexColour",
"description": "Colour of the corner markers; defaults to dark"
},
"image": {
"type": "object",
"required": [
"mode"
],
"additionalProperties": false,
"properties": {
"mode": {
"type": "string",
"enum": [
"logo",
"halftone"
],
"description": "logo: in the middle; halftone: a photo behind the code, drawn as dots"
},
"data": {
"type": "string",
"description": "data:image/png;base64,... (png, jpeg, webp or gif, up to 2 MB)"
},
"imageId": {
"type": "string",
"description": "The stored picture; send it back to keep it"
},
"size": {
"type": "number",
"minimum": 0.1,
"maximum": 0.3,
"description": "Logo side as a share of the code (default 0.22)"
}
}
}
}
},
"RedirectRule": {
"type": "object",
"required": [
"when",
"targetUrl"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,32}$",
"description": "Generated if omitted; keep it when editing (visit stats are keyed by it)"
},
"name": {
"type": "string",
"maxLength": 100
},
"enabled": {
"type": "boolean",
"default": true
},
"when": {
"$ref": "#/$defs/RuleCondition"
},
"targetUrl": {
"type": "string",
"format": "uri",
"description": "http(s) only"
}
}
},
"RuleCondition": {
"description": "A test, or all/any/not of conditions (at most 4 deep, 20 tests per rule). See /llms.txt for the field/op table.",
"oneOf": [
{
"type": "object",
"required": [
"field",
"op"
],
"additionalProperties": false,
"properties": {
"field": {
"type": "string",
"enum": [
"os",
"device",
"browser",
"language",
"country",
"referrer",
"source",
"query",
"time",
"weekday",
"hour"
]
},
"op": {
"type": "string",
"enum": [
"eq",
"neq",
"in",
"not_in",
"contains",
"starts_with",
"ends_with",
"exists",
"before",
"after",
"gte",
"lte"
]
},
"value": {
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "number"
}
]
}
}
],
"description": "Array for in/not_in; omitted for exists"
},
"key": {
"type": "string",
"description": "Query parameter name; only for field \"query\""
}
}
},
{
"type": "object",
"required": [
"all"
],
"additionalProperties": false,
"properties": {
"all": {
"type": "array",
"items": {
"$ref": "#/$defs/RuleCondition"
}
}
}
},
{
"type": "object",
"required": [
"any"
],
"additionalProperties": false,
"properties": {
"any": {
"type": "array",
"items": {
"$ref": "#/$defs/RuleCondition"
}
}
}
},
{
"type": "object",
"required": [
"not"
],
"additionalProperties": false,
"properties": {
"not": {
"$ref": "#/$defs/RuleCondition"
}
}
}
]
},
"Slug": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]{3,64}$",
"description": "Globally unique and immutable. Route names (health, v1, mcp, r, api, admin, www, ...) are reserved."
},
"Tags": {
"type": "array",
"maxItems": 20,
"items": {
"type": "string",
"minLength": 1,
"maxLength": 64
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/esyurl-fyi-short-link"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.