GET/api/v6/urlshortener/links

List short links

Your links, paginated, with search, filters, sorting and their visit counters.

Scope and limits

Scope

API key with the urlshortener service enabled

Usage limit

30 requests per minute

  • Up to 100 items per page; a larger value is capped at 100.
  • total is exact up to 10,000; above that, totalIsExact is false.
  • With page you reach up to link 10,000; to go further, cursor.
  • A search or a sort too expensive for a very large organization is stopped after a few seconds with 504.

Lists your organization’s links —never deleted ones— with their counters already consolidated. By default, newest first. Every filter is optional and they combine with each other.

status keeps its original meaning: active includes expired links, because expiring does not change the stored status. To separate current links from expired ones use state.

To walk through many links, paginate with `cursor`. Each response carries nextCursor while there are more: pass it in the next request, with the same filters, sort and order, and the page starts right after the last link of the previous one. page keeps working as always, but only up to link 10,000 (with perPage=100, up to page 100); beyond that it returns 400 and you continue with cursor, which has no cap.

`total` is exact up to 10,000. If more links match the filters, total comes as 10000 and totalIsExact as false: “more than 10,000”. hasMore always tells, without error, whether there is another page.

Query parameters

page
integeroptional
1-based page number. It reaches up to link 10,000: the page must start, at the latest, at link 10,000. Ignored with cursor.

Default: 1

perPage
integeroptional
Items per page (max 100).

Default: 20

cursor
stringoptional
The nextCursor of the previous response, as is. The page starts right after the last link of that response. It must go with the same sort and order; a cursor that is not from this organization or this order returns 400.
search
stringoptional
Searches the code and the destination URL, by fragment and ignoring case and accents (minimum 2 characters; shorter is ignored). If you paste a full short URL (h0b.co/a1b2c3d or https://h0b.co/a1b2c3d), it returns exactly that link, also if its domain no longer belongs to your organization (domainStatus: released).
domain
stringoptional
Only links on this domain. Those on a domain that no longer belongs to your organization (domainStatus: released) are not included even if they have the same name: to find one, paste its short URL in search.
state
stringoptional
Status as a visitor experiences it: active (active and not expired), expired (active with its expiry already past: it no longer redirects), disabled or blocked (blocked by Hablame).
activeexpireddisabledblocked
status
stringoptional
Stored status. active includes expired links. Kept for compatibility; prefer state.
activedisabledblocked
kind
stringoptional
Links with a chosen alias, or with a generated code.
aliasgenerated
traffic
stringoptional
none: links that never received a visit. some: links that received at least one.
nonesome
createdFrom
stringoptional
Created from this day on (YYYY-MM-DD, Colombia time), inclusive.
createdTo
stringoptional
Created up to this day (YYYY-MM-DD, Colombia time), inclusive.
sort
stringoptional
Order: by creation date, by lifetime visits, by last visit or by expiry. With lastClick and expires, links without that value go last in both directions.
createdclickslastClickexpires

Default: created

order
stringoptional
Sort direction.
descasc

Default: desc

Responses

200

Page of links.

{
  "success": true,
  "data": {
    "items": [
      {
        "domain": "h0b.co",
        "code": "a1b2c3d",
        "shortUrl": "https://h0b.co/a1b2c3d",
        "longUrl": "https://example.com/landing",
        "isAlias": false,
        "status": "active",
        "domainStatus": "active",
        "expiresAt": null,
        "createdAt": "2026-09-20T15:04:05Z",
        "clicks": 128,
        "uniqueClicks": 96,
        "firstClickAt": "2026-09-20T15:31:40Z",
        "lastClickAt": "2026-09-23T18:22:10Z"
      }
    ],
    "page": 1,
    "perPage": 20,
    "total": 1,
    "totalIsExact": true,
    "hasMore": false,
    "nextCursor": null
  },
  "meta": {
    "requestId": "8f0c0e2a4b1d4c8fae2b7a91e0c5d3f6",
    "timestamp": "2026-09-23T18:30:00+00:00",
    "responseTimeMs": 7.2
  }
}
400

A filter carries a value that does not exist (the message says which one and what it accepts), a date that is not YYYY-MM-DD, a page beyond link 10,000 or a cursor that is not valid.

401

Invalid or missing credentials.

403

The API key does not have the URL shortener enabled (or it is turned off for your organization), the key cannot be used from the request network, or the organization is not active.

429

Request limit exceeded.

504

The query took too long and we stopped it. It happens with very large queries for organizations with many links: narrow it (fewer days, fewer sections, more filters). Repeating it as is does not help.

Possible errors

Codes this endpoint can return in error.code. The full detail lives in the catalog.

See the full catalog
GET /api/v6/urlshortener/links
curl -X GET 'https://developers.hablame.co/api/v6/urlshortener/links?perPage=20&sort=created' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer hk_YOUR_API_KEY'

Try-It

Run the request against the real API with your own API key.

The key is used only in your browser for this request. It is not stored nor sent anywhere else.

Parameters

1-based page number. It reaches up to link 10,000: the page must start, at the latest, at link 10,000. Ignored with cursor.

Items per page (max 100).

The nextCursor of the previous response, as is. The page starts right after the last link of that response. It must go with the same sort and order; a cursor that is not from this organization or this order returns 400.

Searches the code and the destination URL, by fragment and ignoring case and accents (minimum 2 characters; shorter is ignored). If you paste a full short URL (h0b.co/a1b2c3d or https://h0b.co/a1b2c3d), it returns exactly that link, also if its domain no longer belongs to your organization (domainStatus: released).

Only links on this domain. Those on a domain that no longer belongs to your organization (domainStatus: released) are not included even if they have the same name: to find one, paste its short URL in search.

Status as a visitor experiences it: active (active and not expired), expired (active with its expiry already past: it no longer redirects), disabled or blocked (blocked by Hablame).

Stored status. active includes expired links. Kept for compatibility; prefer state.

Links with a chosen alias, or with a generated code.

none: links that never received a visit. some: links that received at least one.

Created from this day on (YYYY-MM-DD, Colombia time), inclusive.

Created up to this day (YYYY-MM-DD, Colombia time), inclusive.

Order: by creation date, by lifetime visits, by last visit or by expiry. With lastClick and expires, links without that value go last in both directions.

Sort direction.

GET https://developers.hablame.co/api/v6/urlshortener/links?perPage=20&sort=created

Response

You have not sent a request yet.