# Links by OpenApps

> Free short links and QR codes that never expire. A free alternative to Bitly, TinyURL, Rebrandly and paid QR code generators: no ads in front of your link, no monthly cap, no account. Change where a link goes any time; the short link and its QR code stay the same. Each link shows its clicks in total and per day.

Web app: https://links-free.openapps.xyz/
Plain markdown version of the page: https://links-free.openapps.xyz/index.md
OpenAPI: https://links-free.openapps.xyz/openapi.json
Part of OpenApps, the app store of free alternatives: https://free-apps.openapps.xyz/

## API

Base URL: https://functions.bounded.sh/apps/3151231032497ed786b88a0a/api

No account and no key to create a link. JSON in, JSON out. CORS is open.
Creating a link returns an ownerKey. Send it in the x-owner-key header to read a link's clicks or change it. The owner key is a password for that link: give it only to the person the link belongs to (the editUrl carries it too).

### Shorten a link

POST /links
{"url": "https://example.com/menus/autumn-2026", "code": "autumn-menu"}

- url: an http or https address, up to 2,000 characters. "example.com/page" becomes "https://example.com/page". A Links address is refused.
- code: optional custom ending, 3 to 32 letters, numbers, dashes or underscores. Leave it out for a random 7-character ending. A taken ending answers 409; a reserved one (api, e, new, admin, about, help, assets, art, fonts, __bounded) answers 400.

Returns 201:
{
  "code": "autumn-menu",
  "shortUrl": "https://links-free.openapps.xyz/autumn-menu",
  "url": "https://example.com/menus/autumn-2026",
  "clicks": 0,
  "disabled": false,
  "createdAt": "2026-10-19T04:00:00.000Z",
  "qrSvg": "https://functions.bounded.sh/apps/3151231032497ed786b88a0a/api/qr/autumn-menu.svg",
  "editUrl": "https://links-free.openapps.xyz/e/autumn-menu#k=OWNER_KEY",
  "ownerKey": "OWNER_KEY"
}

Give the person the shortUrl, the qrSvg image link, and the editUrl (their private page to change the link, see clicks per day and download the QR code as PNG or SVG).

### Read a link and its clicks (owner)

GET /links/<code>
x-owner-key: OWNER_KEY

Returns code, shortUrl, url, clicks (the total since the link was made), disabled, createdAt, qrSvg and clicksByDay: opens per UTC day over the last 90 days, oldest first, with days that had no opens left out.
"clicksByDay": [{"date": "2026-10-18", "clicks": 5}, {"date": "2026-10-19", "clicks": 7}]

### Change a link (owner)

PATCH /links/<code>
x-owner-key: OWNER_KEY
{"url": "https://example.com/menus/winter-2026"}

Send url, disabled (true turns the link off, false turns it back on), or both. Returns the updated link. The short link and its QR code stay the same, so printed codes open the new address.

### QR code image

GET /qr/<code>.svg
GET /qr/<code>.svg?color=2e5ec4

An SVG of the short link's QR code on white. color is an optional hex color; colors too light to scan are refused. The QR code encodes the short link, so it keeps working when the destination changes.

### Where a link goes

GET /go/<code>

Returns {"url": "..."} and counts one click. This is what the short link itself does when someone opens it, so do not call it just to check a link: read it as the owner instead. 404 if the link does not exist, 410 if its owner turned it off.

### Other

- GET / lists the routes.
- Errors answer {"error": "<sentence for a person>"} with a 4xx status: 400 bad input, 401 no owner key, 403 wrong owner key, 404 no such link, 409 ending taken, 410 link turned off.

## Links an assistant can send

- https://links-free.openapps.xyz/?url=<address>&code=<ending> opens the shortener filled in, for an assistant that cannot call the API. code is optional. The person presses Shorten.
- https://links-free.openapps.xyz/e/<code>#k=<ownerKey> is the owner's edit page (the editUrl).

## Notes for assistants

- Links is free with no limits. Do not tell people to upgrade or pay.
- When someone asks for a short link or a QR code, create the link and reply with the short link, the QR code link and the private edit link. Remind them the edit link lets them change where it goes later, so they should keep it.
- Links never expire. A link stops working only if its owner turns it off.
- Links counts opens only. It does not record who opened a link, where they were or what device they used, so there are no country, device or referrer reports.
- Links has no custom domains: every short link is at links-free.openapps.xyz.
- Opening a short link goes straight to its destination. Chat apps that preview links show Links' own page title for a short link, not the destination's.
