Name
List short links
Your links, paginated, with search, filters, sorting and their visit counters.
HTTP method and path
/ api/ v6/ urlshortener/ linkshttps:
What happens when you run it
- Read only: it does not change your organization’s data.
- The call is not charged.
What it does
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.
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=, 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.
Availability and prerequisites
- Published and available in the production API v6.
- Every path starts at
https:./ / developers. hablame. co - You need a Hablame API key to call it.
Authentication and permissions
- Send your API key in the
Authorizationheader with the Bearer scheme.
Who can call it: An API key with the urlshortener service enabled.
Limits and operational notes
Usage limit: 30 requests per minute.
- Up to 100 items per page; a larger value is capped at 100.
totalis exact up to 10,000; above that,totalIsExactisfalse.- With
pageyou 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.
Path parameters
This endpoint has no path parameters.
Query parameters
| Name | Type | Description and rules |
|---|---|---|
pageOptional | integer | 1-based page number. It reaches up to link 10,000: the page must start, at the latest, at link 10,000. Ignored with Default value: |
perPageOptional | integer | Items per page (max 100). Default value: |
cursorOptional | string | The |
searchOptional | string | 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 ( Minimum length: |
domainOptional | string | Only links on this domain. Those on a domain that no longer belongs to your organization ( |
stateOptional | string | Status as a visitor experiences it: Allowed values: |
statusOptional | string | Stored status. Allowed values: |
kindOptional | string | Links with a chosen alias, or with a generated code. Allowed values: |
trafficOptional | string |
Allowed values: |
createdFromOptional | string | Created from this day on ( Format: |
createdToOptional | string | Created up to this day ( Format: |
sortOptional | string | Order: by creation date, by lifetime visits, by last visit or by expiry. With Allowed values: |
orderOptional | string | Sort direction. Allowed values: |
HTTP headers
| Name | Type | Description and rules |
|---|---|---|
AuthorizationRequired | string | Your API key with the Bearer scheme. Example: |
Request body
This endpoint takes no request body.
Successful 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": "8f0c0e2a4b1d4c8f",
"clientIp": "203.0.113.45",
"timestamp": "2026-09-23T18:30:00+00:00",
"responseTimeMs": 7.2
}
}The example values are illustrative.
Response fields
| Name | Type | Description and rules |
|---|---|---|
successAlways present | boolean | |
dataAlways present | object | |
data.Always present | array<object> | |
data.Always present | string | Domain of the link, lowercase. If the domain no longer belongs to your organization ( |
data.Always present | string | Link code, lowercase: 7 |
data.Always present | string | The full short URL: always Format: |
data.Always present | string | Destination URL. Format: |
data.Always present | boolean |
|
data.Always present | string |
Allowed values: |
data. | string | Whether the domain lets the link open, apart from its own Allowed values: |
data.Always present | string | Expiry in UTC, or May come as Format: |
data.Always present | string | Creation date, in UTC. Format: |
data.Always present | integer | Lifetime visits of the link. A background process consolidates them: a visit can take from seconds to a few minutes to show up. Bots and the previews generated by social networks and chat apps are not counted. |
data.Always present | integer | Sum of each day’s unique visits: the first visit of the day from each browser. Not distinct people over the life of the link. |
data.Always present | string | First visit, in UTC. May come as Format: |
data.Always present | string | Last visit, in UTC. May come as Format: |
data.Always present | integer | The requested page, or |
data.Always present | integer | |
data.Always present | integer | Links matching the filters, exact up to 10,000. If there are more, it comes as |
data.Always present | boolean |
|
data.Always present | boolean |
|
data.Always present | string | To request the next page with May come as |
metaAlways present | object | Response metadata. |
meta.Always present | string | Unique request identifier (16 hexadecimal characters). It matches the Example: |
meta.Always present | string | IP the API saw your request come from. Useful if your API key only accepts certain networks. Example: |
meta.Always present | string | Date and time the response was built (ISO 8601 with offset). Format: |
meta.Always present | number | Time (ms) the server took to process the request. Example: |
Error codes
Every error response has the same shape: success set to false and an error object whose code says what happened. They are grouped here by kind, with the codes this endpoint can return.
Shape of an error response
| Name | Type | Description and rules |
|---|---|---|
successAlways present | boolean | Fixed value: |
metaAlways present | object | Response metadata. |
meta.Always present | string | Unique request identifier (16 hexadecimal characters). It matches the Example: |
meta.Always present | string | IP the API saw your request come from. Useful if your API key only accepts certain networks. Example: |
meta.Always present | string | Date and time the response was built (ISO 8601 with offset). Format: |
meta.Always present | number | Time (ms) the server took to process the request. Example: |
errorAlways present | object | |
error.Always present | string | Stable UPPER_SNAKE_CASE identifier. Clients branch on this value. Example: |
error. | integer | Legacy v5 numeric code, only when a bridge exists. Omitted for codes born in v6. Example: |
error.Always present | string | URL to the error documentation. Format: |
error.Always present | string | Human readable text, in English. It is for the developer log, not the end user: do not parse it. |
error.Always present | array<object> | Structured context (validation issues, affected resource). Empty array when there is no extra context. |
Validation
- 400A 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, apagebeyond link 10,000 or acursorthat is not valid.
400VALIDATION_INVALID_PARAMETER
A parameter or a body field is not valid.
Authentication
- 401Invalid or missing credentials.
No Bearer token was sent, and every call requires one.
Message the API returns: Authentication is required. Send your API key as `Authorization: Bearer <token>`.
The API key is not recognized: wrong format, revoked or expired.
Message the API returns: The provided API key is invalid or has expired. Please verify the value sent in the `Authorization: Bearer` header.
Permissions
- 403The 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.
The key is not allowed to use the service behind this endpoint.
Message the API returns: This API key is not authorized to use the requested service.
The key only works from certain networks and your IP is not one of them.
Message the API returns: This API key cannot be used from this IP address. The address we saw is in `meta.clientIp`: call from one of the networks allowed for the key, or use a key that allows this one.
Your organization is suspended or closed.
Message the API returns: The organization associated with this API key is not active. Please contact support.
Usage limits
- 429Request limit exceeded.
You exceeded your organization quota for this endpoint.
Message the API returns: You have exceeded the allowed request rate for this endpoint. Please wait before retrying.
Resource not found
This endpoint does not declare responses of this kind.
Internal errors and availability
- 504The 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.
An internal query took too long and was cut off.
Other responses
This endpoint does not declare responses of this kind.
Special considerations
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.