Aller au contenu

Pages and page links

Every route for pages and their links, each with a request example and the response returned. A page is referred to by its id or by its custom address (slug).

List pages

GET/v1/pages

The environment's pages, newest first. Each page carries its views in stats: total since it was created, last_30_days over the last 30 days. Read scope.

  • ?search= — searches the name, the custom address and the id
  • ?tag= — a tag id: only the pages that carry it
  • ?page= and ?per_page= — pagination, 50 per page by default, 100 at most
curl "https://api.tinylink.fr/v1/pages?per_page=2" \
  -H "Authorization: Bearer tl_your_token"

Possible responses

{
  "data": [
    {
      "id": "P6ac40109381964",
      "type": "page",
      "name": "My page",
      "description": "All my links in one place.",
      "slug": "my-page",
      "url": "https://tnylnk.fr/my-page",
      "status": "active",
      "password_protected": false,
      "restricted": false,
      "tags": [],
      "qr_code": null,
      "created_at": "2026-10-05T21:56:57+02:00",
      "edit_url": "https://app.tinylink.fr/page-edit?id=P6ac40109381964",
      "stats": {
        "metric": "views",
        "total": 340,
        "last_30_days": 85
      }
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 2,
    "total": 1,
    "total_pages": 1
  }
}

Create a page

POST/v1/pages

name is required. The response is the page created, with its links. Write scope.

  • name — the page's name, 100 characters at most
  • description — 2,000 characters at most
  • slug — the custom address: letters, digits, -, _ and ., 40 characters at most
  • password — protects the page with a password
  • tags — a list of tag ids from the environment
  • qr_code — true for the classic QR code, or a template id
  • links — links to add in one go (100 at most), described as in "Add a link"
curl -X POST https://api.tinylink.fr/v1/pages \
  -H "Authorization: Bearer tl_your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My page",
    "slug": "my-page",
    "links": [
      {
        "title": "My website",
        "url": "https://example.com"
      },
      {
        "title": "Contact",
        "url": "hello@example.com"
      }
    ]
  }'

Possible responses

{
  "id": "P6ac40109381964",
  "type": "page",
  "name": "My page",
  "description": "",
  "slug": "my-page",
  "url": "https://tnylnk.fr/my-page",
  "status": "active",
  "password_protected": false,
  "restricted": false,
  "tags": [],
  "qr_code": null,
  "created_at": "2026-10-05T21:56:57+02:00",
  "edit_url": "https://app.tinylink.fr/page-edit?id=P6ac40109381964",
  "stats": {
    "metric": "views",
    "total": 0,
    "last_30_days": 0
  },
  "links": [
    {
      "id": "L6ac4011edb7c6",
      "title": "My website",
      "description": "",
      "url": "https://example.com",
      "type": "url",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 1,
      "status": "active",
      "image": null,
      "created_at": "2026-10-05T21:57:18+02:00"
    },
    {
      "id": "L6ac4011ee9fab",
      "title": "Contact",
      "description": "",
      "url": "hello@example.com",
      "type": "email",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 2,
      "status": "active",
      "image": null,
      "created_at": "2026-10-05T21:57:18+02:00"
    }
  ]
}

Read a page

GET/v1/pages/{id}

The page and its links, in display order; archived links come last. Read scope.

curl https://api.tinylink.fr/v1/pages/my-page \
  -H "Authorization: Bearer tl_your_token"

Possible responses

{
  "id": "P6ac40109381964",
  "type": "page",
  "name": "My page",
  "description": "All my links in one place.",
  "slug": "my-page",
  "url": "https://tnylnk.fr/my-page",
  "status": "active",
  "password_protected": false,
  "restricted": false,
  "tags": [],
  "qr_code": null,
  "created_at": "2026-10-05T21:56:57+02:00",
  "edit_url": "https://app.tinylink.fr/page-edit?id=P6ac40109381964",
  "stats": {
    "metric": "views",
    "total": 340,
    "last_30_days": 85
  },
  "links": [
    {
      "id": "L6ac4011edb7c6",
      "title": "My website",
      "description": "",
      "url": "https://example.com",
      "type": "url",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 1,
      "status": "active",
      "image": null,
      "created_at": "2026-10-05T21:57:18+02:00"
    },
    {
      "id": "L6ac4011ee9fab",
      "title": "Contact",
      "description": "",
      "url": "hello@example.com",
      "type": "email",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 2,
      "status": "active",
      "image": null,
      "created_at": "2026-10-05T21:57:18+02:00"
    }
  ]
}

Edit a page

PATCH/v1/pages/{id}

Only send the fields to change: name, description, slug, password. null removes the custom address or the password. The response is the updated page. Write scope.

curl -X PATCH https://api.tinylink.fr/v1/pages/P6ac40109381964 \
  -H "Authorization: Bearer tl_your_token" \
  -H "Content-Type: application/json" \
  -d '{"description":"All my links in one place.","password":null}'

Possible responses

{
  "id": "P6ac40109381964",
  "type": "page",
  "name": "My page",
  "description": "All my links in one place.",
  "slug": "my-page",
  "url": "https://tnylnk.fr/my-page",
  "status": "active",
  "password_protected": false,
  "restricted": false,
  "tags": [],
  "qr_code": null,
  "created_at": "2026-10-05T21:56:57+02:00",
  "edit_url": "https://app.tinylink.fr/page-edit?id=P6ac40109381964",
  "stats": {
    "metric": "views",
    "total": 340,
    "last_30_days": 85
  },
  "links": [
    {
      "id": "L6ac4011edb7c6",
      "title": "My website",
      "description": "",
      "url": "https://example.com",
      "type": "url",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 1,
      "status": "active",
      "image": null,
      "created_at": "2026-10-05T21:57:18+02:00"
    },
    {
      "id": "L6ac4011ee9fab",
      "title": "Contact",
      "description": "",
      "url": "hello@example.com",
      "type": "email",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 2,
      "status": "active",
      "image": null,
      "created_at": "2026-10-05T21:57:18+02:00"
    }
  ]
}

Delete a page

DELETE/v1/pages/{id}

Deletes the page, its links and its statistics. This cannot be undone. Delete scope.

curl -X DELETE https://api.tinylink.fr/v1/pages/P6ac40109381964 \
  -H "Authorization: Bearer tl_your_token"

Possible responses

No content

Duplicate a page

POST/v1/pages/{id}/duplicate

Creates a copy of the page in the same environment: appearance settings and followed style, logo and banner, every link, title, component and integration block, in the same order, with their visibility, archiving and images (files of the copy's own). Neither the custom address, nor the password, nor the tags, nor the QR code are carried over. name (otherwise the same name) and slug are optional. The plan's page limit applies. Write scope.

curl -X POST https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/duplicate \
  -H "Authorization: Bearer tl_your_token" \
  -H "Content-Type: application/json" \
  -d '{"name":"Ma page (copie)","slug":"ma-page-copie"}'

Possible responses

{
  "id": "P6ad34edcdd6ab6",
  "type": "page",
  "name": "Ma page (copie)",
  "description": "",
  "slug": "ma-page-copie",
  "url": "https://tnylnk.fr/ma-page-copie",
  "status": "active",
  "password_protected": false,
  "restricted": false,
  "tags": [],
  "qr_code": null,
  "created_at": "2026-10-17T12:33:00+02:00",
  "edit_url": "https://app.tinylink.fr/page-edit?id=P6ad34edcdd6ab6",
  "stats": {
    "metric": "views",
    "total": 0,
    "last_30_days": 0
  },
  "links": [
    {
      "id": "L6ad34edcdd9c3",
      "title": "Site",
      "description": "",
      "url": "https://exemple.fr",
      "type": "url",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 1,
      "status": "active",
      "image": "https://content.tinylink.fr/page-image/logo_6ad34edcdd8b7.webp",
      "created_at": "2026-10-17T12:33:00+02:00"
    },
    {
      "id": "L6ad34edcddab2",
      "title": "Section",
      "description": "",
      "url": null,
      "type": "title",
      "format": "TITLE",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 2,
      "status": "active",
      "image": null,
      "created_at": "2026-10-17T12:33:00+02:00"
    },
    {
      "id": "L6ad34edcddb85",
      "title": "Caché",
      "description": "",
      "url": "https://exemple.org",
      "type": "url",
      "format": "LIST",
      "size": "FULL",
      "visible": false,
      "archived": false,
      "position": 3,
      "status": "active",
      "image": null,
      "created_at": "2026-10-17T12:33:00+02:00"
    },
    {
      "id": "L6ad34edcddc64",
      "title": "Mes réseaux",
      "description": null,
      "url": null,
      "type": "component",
      "format": "COMPONENT",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 4,
      "status": "active",
      "image": null,
      "created_at": "2026-10-17T12:33:00+02:00",
      "component_id": "C6ad34ed4599305"
    }
  ]
}

List a page's links

GET/v1/pages/{id}/links

The page's links, in display order. type is url, email, tel, title, component (a component placed on the page, with component_id) or integration (an integration block, with integration); status is active, pending_review or blocked. Read scope.

curl https://api.tinylink.fr/v1/pages/P6ac40109381964/links \
  -H "Authorization: Bearer tl_your_token"

Possible responses

{
  "data": [
    {
      "id": "L6ac4011edb7c6",
      "title": "My website",
      "description": "",
      "url": "https://example.com",
      "type": "url",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 1,
      "status": "active",
      "image": null,
      "created_at": "2026-10-05T21:57:18+02:00"
    },
    {
      "id": "L6ac4011eeb074",
      "title": "My socials",
      "description": "",
      "url": null,
      "type": "title",
      "format": "TITLE",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 2,
      "status": "active",
      "image": null,
      "created_at": "2026-10-05T21:57:18+02:00"
    }
  ]
}

Add a link

POST/v1/pages/{id}/links

Adds a link at the bottom of the page, or several with {"links": [ … ]} (100 at most): the response is then {"data": [ … ]}. Your plan's link limits apply as in the app. Write scope.

  • title — required, except for the SOCIAL format; 100 characters at most
  • url — a web address, an e-mail or a phone number, with or without mailto: / tel:; not needed for a TITLE
  • description — 1,000 characters at most
  • format — LIST (default), BANNER, SQUARE, SOCIAL, or TITLE for a section title
  • size — FULL (default) or HALF, for LIST, BANNER and SQUARE
  • visible — false to add it hidden
  • position — rank in the page, 1 = top
  • image — the public address of an image or a base64 data URI, cropped as a square and as a banner; crop.square and crop.banner ({"x", "y", "w", "h"}) pick the areas
  • integration_id, source… — for a block fed by a connected account, see Integrations
curl -X POST https://api.tinylink.fr/v1/pages/P6ac40109381964/links \
  -H "Authorization: Bearer tl_your_token" \
  -H "Content-Type: application/json" \
  -d '{"title":"My website","url":"https://example.com"}'

Possible responses

{
  "id": "L6ac4011edb7c6",
  "title": "My website",
  "description": "",
  "url": "https://example.com",
  "type": "url",
  "format": "LIST",
  "size": "FULL",
  "visible": true,
  "archived": false,
  "position": 1,
  "status": "active",
  "image": null,
  "created_at": "2026-10-05T21:57:18+02:00"
}

Read a link

GET/v1/pages/{id}/links/{lien}

A single link of the page, by its id. Read scope.

curl https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6 \
  -H "Authorization: Bearer tl_your_token"

Possible responses

{
  "id": "L6ac4011edb7c6",
  "title": "My website",
  "description": "",
  "url": "https://example.com",
  "type": "url",
  "format": "LIST",
  "size": "FULL",
  "visible": true,
  "archived": false,
  "position": 1,
  "status": "active",
  "image": null,
  "created_at": "2026-10-05T21:57:18+02:00"
}

Edit a link

PATCH/v1/pages/{id}/links/{lien}

Only send the fields to change: title, description, url, format, size, visible (hide or show), archived (archive or unarchive) , position (move) and image (as when adding; null removes it). A component can only be hidden, archived or moved; an integration block has its own fields, see Integrations. Write scope.

curl -X PATCH https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6 \
  -H "Authorization: Bearer tl_your_token" \
  -H "Content-Type: application/json" \
  -d '{"title":"My new website","position":2,"visible":false}'

Possible responses

{
  "id": "L6ac4011edb7c6",
  "title": "My new website",
  "description": "",
  "url": "https://example.com",
  "type": "url",
  "format": "LIST",
  "size": "FULL",
  "visible": false,
  "archived": false,
  "position": 2,
  "status": "active",
  "image": null,
  "created_at": "2026-10-05T21:57:18+02:00"
}

Delete a link

DELETE/v1/pages/{id}/links/{lien}

Deletes the link, its image and its statistics, then renumbers the following ones. Delete scope.

curl -X DELETE https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6 \
  -H "Authorization: Bearer tl_your_token"

Possible responses

No content

Change several links

PATCH/v1/pages/{id}/links

Changes several links in one request — for example the layout of a whole series: links lists up to 100 entries {"id": …} followed by the fields to change, as for a single link. All or nothing: at the first error nothing is saved, and the faulty field is named (links[1].url). Images are sent one link at a time. The response is the list of the page's links. Write scope.

curl -X PATCH https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links \
  -H "Authorization: Bearer tl_your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "links": [
      {
        "id": "L6ad34a0e84122",
        "format": "BANNER",
        "size": "HALF"
      },
      {
        "id": "L6ad34a0e8467f",
        "format": "BANNER",
        "size": "HALF"
      }
    ]
  }'

Possible responses

{
  "data": [
    {
      "id": "L6ad34a0e849a2",
      "title": "Mes réseaux",
      "description": "",
      "url": null,
      "type": "title",
      "format": "TITLE",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 1,
      "status": "active",
      "image": null,
      "created_at": "2026-10-17T12:12:30+02:00"
    },
    {
      "id": "L6ad34a0e84122",
      "title": "Mon site",
      "description": "",
      "url": "https://exemple.fr",
      "type": "url",
      "format": "BANNER",
      "size": "HALF",
      "visible": true,
      "archived": false,
      "position": 2,
      "status": "active",
      "image": null,
      "created_at": "2026-10-17T12:12:30+02:00"
    },
    {
      "id": "L6ad34a0e8467f",
      "title": "Ma boutique",
      "description": "",
      "url": "https://exemple.fr/boutique",
      "type": "url",
      "format": "BANNER",
      "size": "HALF",
      "visible": true,
      "archived": false,
      "position": 3,
      "status": "active",
      "image": null,
      "created_at": "2026-10-17T12:12:30+02:00"
    }
  ]
}

Reorder the links

PUT/v1/pages/{id}/links/order

ids gives the new order: the links, titles and components listed move to the top, in that order; the others follow in their current order. The response is the list of the page's links. Write scope.

curl -X PUT https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links/order \
  -H "Authorization: Bearer tl_your_token" \
  -H "Content-Type: application/json" \
  -d '{"ids":["L6ad34a0e849a2","L6ad34a0e84122"]}'

Possible responses

{
  "data": [
    {
      "id": "L6ad34a0e849a2",
      "title": "Mes réseaux",
      "description": "",
      "url": null,
      "type": "title",
      "format": "TITLE",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 1,
      "status": "active",
      "image": null,
      "created_at": "2026-10-17T12:12:30+02:00"
    },
    {
      "id": "L6ad34a0e84122",
      "title": "Mon site",
      "description": "",
      "url": "https://exemple.fr",
      "type": "url",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 2,
      "status": "active",
      "image": null,
      "created_at": "2026-10-17T12:12:30+02:00"
    },
    {
      "id": "L6ad34a0e8467f",
      "title": "Ma boutique",
      "description": "",
      "url": "https://exemple.fr/boutique",
      "type": "url",
      "format": "LIST",
      "size": "FULL",
      "visible": true,
      "archived": false,
      "position": 3,
      "status": "active",
      "image": null,
      "created_at": "2026-10-17T12:12:30+02:00"
    }
  ]
}

Change a link's image

PUT/v1/pages/{id}/links/{lien}/image

POST/v1/pages/{id}/links/{lien}/image

image: the public address of an image or a base64 data URI; to upload a file, POST as multipart/form-data with an image field. JPEG, PNG or WebP, 5 MB at most. Two formats are produced: a square (LIST, SQUARE formats) and a banner (BANNER), each croppable with crop.square and crop.banner. A title or a component takes no image. Write scope.

curl -X PUT https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links/L6ad34a0e84122/image \
  -H "Authorization: Bearer tl_your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "https://exemple.fr/visuel.jpg",
    "crop": {
      "square": {
        "x": 0,
        "y": 0,
        "w": 800,
        "h": 800
      }
    }
  }'

Possible responses

{
  "id": "L6ad34a0e84122",
  "title": "Mon site",
  "description": "",
  "url": "https://exemple.fr",
  "type": "url",
  "format": "LIST",
  "size": "FULL",
  "visible": true,
  "archived": false,
  "position": 1,
  "status": "active",
  "image": "https://content.tinylink.fr/page-image/logo_6ad34a0e8e7da.webp",
  "created_at": "2026-10-17T12:12:30+02:00"
}

Remove a link's image

DELETE/v1/pages/{id}/links/{lien}/image

Deletes the link's image; the response is the link. Nothing else is deleted: the Write scope is enough.

curl -X DELETE https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links/L6ad34a0e84122/image \
  -H "Authorization: Bearer tl_your_token"

Possible responses

{
  "id": "L6ad34a0e84122",
  "title": "Mon site",
  "description": "",
  "url": "https://exemple.fr",
  "type": "url",
  "format": "LIST",
  "size": "FULL",
  "visible": true,
  "archived": false,
  "position": 1,
  "status": "active",
  "image": null,
  "created_at": "2026-10-17T12:12:30+02:00"
}

Still stuck?

Write to us from the Support tab of your workspace, we answer within one business day.

Contact support