Skip to content

Endpoints

Endpoints

Name

Organization overview

Inventory, range activity against the previous period, trends, top links and breakdowns for your whole organization.

HTTP method and path

GET/api/v6/urlshortener/overview

https://developers.hablame.co/api/v6/urlshortener/overview

What happens when you run it

  • Read only: it does not change your organization’s data.
  • The call is not charged.

What it does

Your organization’s whole URL shortener in a single call, without walking the links one by one. Days and hours are Colombia’s (America/Bogota).

  • inventory is a snapshot of the moment and does not depend on the range: live links by status (expired are active ones whose expiry has passed), aliases, those that never received a visit and lifetime visits.
  • totals is what happened in the range, and today, the same for today. The previous period is requested with compare=previous: then previous, previousTotals and, with series, previousSeries come, for the previous period of the same length (30 days up to today are compared with the 30 before, not with the calendar month). Without asking for it they come as null.
  • Optional blocks are requested in include. Those you do not request come as null; those you request that have no data, empty.

The overview walks every link of your organization, so its quota goes by what it costs: each overview spends units from a quota of 150 per minute for your organization. It spends 2 for the query; 1 for each block that does not depend on the length of the range (inventory, today, recent, heatmap), and, for every 31 days of the range, 1 for each block that walks it (totals, series, top, dimensions, and the previous-period ones if you compare). A 30-day overview with series,top,recent spends 8; comparing, 10; a one-year one with everything, 78. Without units, 429 with Retry-After. And at most two overviews of your organization are computed at once: one arriving with two in progress waits a few seconds and, if it does not get a turn, gets 429.

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.

Create your API key

Authentication and permissions

  • Send your API key in the Authorization header with the Bearer scheme.

Who can call it: An API key with the urlshortener service enabled.

Limits and operational notes

Usage limit: 120 requests per minute.

  • Windows of up to 366 days by day, and up to 31 days by hour.
  • Up to 100 values per dimension and per ranking.
  • Cost quota: 150 units per minute per organization (see above). Two overviews at once per organization.

Path parameters

This endpoint has no path parameters.

Query parameters

NameTypeDescription and rules
fromOptionalstring

First day of the window, YYYY-MM-DD in Colombia time, inclusive. Defaults to 29 days before to (a 30-day window).

Format:dateExample:2026-09-01

toOptionalstring

Last day of the window, YYYY-MM-DD in Colombia time, inclusive. Defaults to today.

Format:dateExample:2026-09-23

granularityOptionalstring

Size of each point of the series. day allows windows of up to 366 days; hour, up to 31.

Allowed values:day hourDefault value:day

compareOptionalstring

previous adds the previous period of the same length (previous, previousTotals and, with series, previousSeries). none, or not sending it, omits it. Until 2026-09-30 the default was previous.

Allowed values:previous noneDefault value:none

includeOptionalstring

Comma-separated optional blocks: series, top, recent, dimensions, heatmap. Defaults to series,top,recent. An unknown name returns 400.

Example:series,top,recent,dimensions,heatmap

dimensionsOptionalstring

Comma-separated breakdown dimensions: country, subdivision, city, device, os, browser, referrer. Defaults to country,device,os,browser,referrer. Unknown names are ignored.

Example:country,device,referrer

topOptionalinteger

How many values each dimension (and each ranking) returns. Max 100.

Default value:10Minimum:1Maximum:100

HTTP headers

NameTypeDescription and rules
AuthorizationRequiredstring

Your API key with the Bearer scheme.

Example:Bearer hk_TU_API_KEY

Request body

This endpoint takes no request body.

Successful responses

200

Organization overview. The example is with compare=previous.

Response example
{
  "success": true,
  "data": {
    "range": { "from": "2026-08-25", "to": "2026-09-23", "granularity": "day", "timezone": "America/Bogota" },
    "previous": { "from": "2026-07-26", "to": "2026-08-24" },
    "inventory": {
      "total": 1250, "active": 1190, "expired": 40, "disabled": 20, "blocked": 0,
      "aliases": 35, "neverClicked": 610, "clicks": 48210, "uniqueClicks": 30115
    },
    "today": { "linksCreated": 42, "clicks": 1310, "uniqueClicks": 902, "linksWithClicks": 118 },
    "totals": { "linksCreated": 820, "clicks": 21400, "uniqueClicks": 14020, "linksWithClicks": 540 },
    "previousTotals": { "linksCreated": 610, "clicks": 17950, "uniqueClicks": 11800, "linksWithClicks": 455 },
    "series": [
      { "at": "2026-08-25", "linksCreated": 25, "clicks": 690, "uniqueClicks": 455 }
    ],
    "previousSeries": [
      { "at": "2026-07-26", "linksCreated": 18, "clicks": 540, "uniqueClicks": 360 }
    ],
    "topLinks": [
      {
        "domain": "h0b.co", "code": "promo-septiembre", "shortUrl": "https://h0b.co/promo-septiembre",
        "longUrl": "https://example.com/promo", "status": "active", "expiresAt": null,
        "clicks": 3120, "uniqueClicks": 2210, "lastClickAt": "2026-09-23T18:22:10Z"
      }
    ],
    "dimensions": null,
    "recent": { "created": [], "clicked": [] },
    "heatmap": 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

NameTypeDescription and rules
successAlways presentboolean

dataAlways presentobject

data.rangeAlways presentobject

data.range.fromAlways presentstring

Format:date

data.range.toAlways presentstring

Format:date

data.range.granularityAlways presentstring

Allowed values:day hour

data.range.timezoneAlways presentstring

Example:America/Bogota

data.previousAlways presentobject

The previous period, or null if compare=previous was not requested.

May come as null.

data.previous.fromAlways presentstring

Format:date

data.previous.toAlways presentstring

Format:date

data.inventoryAlways presentobject

Snapshot of live links.

data.inventory.totalAlways presentinteger

data.inventory.activeAlways presentinteger

Active and not expired.

data.inventory.expiredAlways presentinteger

Active with their expiry already past.

data.inventory.disabledAlways presentinteger

data.inventory.blockedAlways presentinteger

Blocked by Hablame. total includes them.

data.inventory.aliasesAlways presentinteger

data.inventory.neverClickedAlways presentinteger

Never received a visit.

data.inventory.clicksAlways presentinteger

Lifetime visits.

data.inventory.uniqueClicksAlways presentinteger

data.todayAlways presentobject

What happened in a window of days.

data.today.linksCreatedAlways presentinteger

Links created in the window, including those deleted afterwards.

data.today.clicksAlways presentinteger

Visits in the window.

data.today.uniqueClicksAlways presentinteger

Sum of each day’s unique visits in the window.

data.today.linksWithClicksAlways presentinteger

Links that received at least one visit in the window.

data.totalsAlways presentobject

What happened in a window of days.

data.totals.linksCreatedAlways presentinteger

Links created in the window, including those deleted afterwards.

data.totals.clicksAlways presentinteger

Visits in the window.

data.totals.uniqueClicksAlways presentinteger

Sum of each day’s unique visits in the window.

data.totals.linksWithClicksAlways presentinteger

Links that received at least one visit in the window.

data.previousTotalsAlways presentobject

What happened in a window of days.

May come as null.

data.previousTotals.linksCreatedAlways presentinteger

Links created in the window, including those deleted afterwards.

data.previousTotals.clicksAlways presentinteger

Visits in the window.

data.previousTotals.uniqueClicksAlways presentinteger

Sum of each day’s unique visits in the window.

data.previousTotals.linksWithClicksAlways presentinteger

Links that received at least one visit in the window.

data.seriesAlways presentarray<object>

May come as null.

data.series[].atAlways presentstring

The day (YYYY-MM-DD) or the hour (YYYY-MM-DDTHH:00:00), in Colombia time and without a zone.

Example:2026-09-23

data.series[].linksCreatedAlways presentinteger

data.series[].clicksAlways presentinteger

data.series[].uniqueClicksAlways presentinteger

data.previousSeriesAlways presentarray<object>

May come as null.

data.previousSeries[].atAlways presentstring

The day (YYYY-MM-DD) or the hour (YYYY-MM-DDTHH:00:00), in Colombia time and without a zone.

Example:2026-09-23

data.previousSeries[].linksCreatedAlways presentinteger

data.previousSeries[].clicksAlways presentinteger

data.previousSeries[].uniqueClicksAlways presentinteger

data.topLinksAlways presentarray<object>

May come as null.

data.topLinks[].domainAlways presentstring

data.topLinks[].codeAlways presentstring

data.topLinks[].shortUrlAlways presentstring

Format:uri

data.topLinks[].longUrlAlways presentstring

Format:uri

data.topLinks[].statusAlways presentstring

Allowed values:active disabled blocked

data.topLinks[].expiresAtAlways presentstring

May come as null.

Format:date-time

data.topLinks[].clicksAlways presentinteger

data.topLinks[].uniqueClicksAlways presentinteger

data.topLinks[].lastClickAtAlways presentstring

May come as null.

Format:date-time

data.dimensionsAlways presentobject

May come as null.

data.dimensions.{any key}array<object>

data.dimensions.{any key}[].valueAlways presentstring

The value as recorded (CO, mobile, Chrome, www.facebook.com…), or __other for the sum of everything outside the top.

data.dimensions.{any key}[].clicksAlways presentinteger

data.recentAlways presentobject

May come as null.

data.recent.createdAlways presentarray<object>

data.recent.created[].domainAlways presentstring

Domain of the link, lowercase. If the domain no longer belongs to your organization (domainStatus: released), it is the name it had.

data.recent.created[].codeAlways presentstring

Link code, lowercase: 7 0-9a-z characters when the service generates it, or the alias chosen at creation. Unique per domain.

data.recent.created[].shortUrlAlways presentstring

The full short URL: always https://{domain}/{code}.

Format:uri

data.recent.created[].longUrlAlways presentstring

Destination URL.

Format:uri

data.recent.created[].isAliasAlways presentboolean

true when the code was chosen by whoever created the link (the code field on creation); false when the service generated it.

data.recent.created[].statusAlways presentstring

active, disabled or blocked (and deleted, only in the case below). Expired is not a status: an active link whose expiresAt has passed no longer redirects, but keeps active. blocked is a link Hablame blocked for security: it does not redirect and cannot be edited, deleted or reactivated through the API; if you think it is a mistake, contact us. Deleted links do not appear in responses, except in the replay of a creation with Idempotency-Key whose link was deleted afterwards: it comes as it is, with deleted.

Allowed values:active disabled blocked deleted

data.recent.created[].domainStatusstring

Whether the domain lets the link open, apart from its own status. active: it does. suspended: the domain is suspended; released: the domain no longer belongs to your organization; pending: it is an own domain that is not verified yet. With those three the link does not redirect (the visitor gets 404) even if its status is active. It comes in the list, when getting a link and when creating, editing or restoring it; if it does not come, treat the link as before the field existed. New values may appear: one you do not know does not mean the link does not open.

Allowed values:active pending suspended released

data.recent.created[].expiresAtAlways presentstring

Expiry in UTC, or null if it never expires.

May come as null.

Format:date-time

data.recent.created[].createdAtAlways presentstring

Creation date, in UTC.

Format:date-time

data.recent.created[].clicksAlways presentinteger

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.recent.created[].uniqueClicksAlways presentinteger

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.recent.created[].firstClickAtAlways presentstring

First visit, in UTC. null if it never received one.

May come as null.

Format:date-time

data.recent.created[].lastClickAtAlways presentstring

Last visit, in UTC. null if it never received one.

May come as null.

Format:date-time

data.recent.clickedAlways presentarray<object>

data.recent.clicked[].domainAlways presentstring

Domain of the link, lowercase. If the domain no longer belongs to your organization (domainStatus: released), it is the name it had.

data.recent.clicked[].codeAlways presentstring

Link code, lowercase: 7 0-9a-z characters when the service generates it, or the alias chosen at creation. Unique per domain.

data.recent.clicked[].shortUrlAlways presentstring

The full short URL: always https://{domain}/{code}.

Format:uri

data.recent.clicked[].longUrlAlways presentstring

Destination URL.

Format:uri

data.recent.clicked[].isAliasAlways presentboolean

true when the code was chosen by whoever created the link (the code field on creation); false when the service generated it.

data.recent.clicked[].statusAlways presentstring

active, disabled or blocked (and deleted, only in the case below). Expired is not a status: an active link whose expiresAt has passed no longer redirects, but keeps active. blocked is a link Hablame blocked for security: it does not redirect and cannot be edited, deleted or reactivated through the API; if you think it is a mistake, contact us. Deleted links do not appear in responses, except in the replay of a creation with Idempotency-Key whose link was deleted afterwards: it comes as it is, with deleted.

Allowed values:active disabled blocked deleted

data.recent.clicked[].domainStatusstring

Whether the domain lets the link open, apart from its own status. active: it does. suspended: the domain is suspended; released: the domain no longer belongs to your organization; pending: it is an own domain that is not verified yet. With those three the link does not redirect (the visitor gets 404) even if its status is active. It comes in the list, when getting a link and when creating, editing or restoring it; if it does not come, treat the link as before the field existed. New values may appear: one you do not know does not mean the link does not open.

Allowed values:active pending suspended released

data.recent.clicked[].expiresAtAlways presentstring

Expiry in UTC, or null if it never expires.

May come as null.

Format:date-time

data.recent.clicked[].createdAtAlways presentstring

Creation date, in UTC.

Format:date-time

data.recent.clicked[].clicksAlways presentinteger

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.recent.clicked[].uniqueClicksAlways presentinteger

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.recent.clicked[].firstClickAtAlways presentstring

First visit, in UTC. null if it never received one.

May come as null.

Format:date-time

data.recent.clicked[].lastClickAtAlways presentstring

Last visit, in UTC. null if it never received one.

May come as null.

Format:date-time

data.heatmapAlways presentobject

May come as null.

data.heatmap.fromAlways presentstring

Format:date

data.heatmap.toAlways presentstring

Format:date

data.heatmap.cellsAlways presentarray<object>

data.heatmap.cells[].weekdayAlways presentinteger

Day of the week: 1 Monday … 7 Sunday.

data.heatmap.cells[].hourAlways presentinteger

Hour from 0 to 23, in Colombia time.

data.heatmap.cells[].clicksAlways presentinteger

metaAlways presentobject

Response metadata.

meta.requestIdAlways presentstring

Unique request identifier (16 hexadecimal characters). It matches the X-Request-Id header. Quote it when contacting support.

Example:b9b1704baffab211

meta.clientIpAlways presentstring

IP the API saw your request come from. Useful if your API key only accepts certain networks.

Example:203.0.113.45

meta.timestampAlways presentstring

Date and time the response was built (ISO 8601 with offset).

Format:date-timeExample:2026-06-04T19:43:59+00:00

meta.responseTimeMsAlways presentnumber

Time (ms) the server took to process the request.

Example:4.24

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
NameTypeDescription and rules
successAlways presentboolean

Fixed value:false

metaAlways presentobject

Response metadata.

meta.requestIdAlways presentstring

Unique request identifier (16 hexadecimal characters). It matches the X-Request-Id header. Quote it when contacting support.

Example:b9b1704baffab211

meta.clientIpAlways presentstring

IP the API saw your request come from. Useful if your API key only accepts certain networks.

Example:203.0.113.45

meta.timestampAlways presentstring

Date and time the response was built (ISO 8601 with offset).

Format:date-timeExample:2026-06-04T19:43:59+00:00

meta.responseTimeMsAlways presentnumber

Time (ms) the server took to process the request.

Example:4.24

errorAlways presentobject

error.codeAlways presentstring

Stable UPPER_SNAKE_CASE identifier. Clients branch on this value.

Example:AUTH_REQUIRED

error.legacyCodeinteger

Legacy v5 numeric code, only when a bridge exists. Omitted for codes born in v6.

Example:40002

error.typeAlways presentstring

URL to the error documentation.

Format:uriExample:https://developers.hablame.co/docs/v6/errors/auth-required

error.messageAlways presentstring

Human readable text, in English. It is for the developer log, not the end user: do not parse it.

error.detailsAlways presentarray<object>

Structured context (validation issues, affected resource). Empty array when there is no extra context.

Validation

  • 400An invalid date or a window above the limit, or a compare or include value that does not exist.

Authentication

  • 401Invalid or missing credentials.
  • 401AUTH_REQUIRED

    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>`.

  • 401AUTH_INVALID_KEY

    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.
  • 403AUTH_SERVICE_NOT_ALLOWED

    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.

  • 403AUTH_IP_NOT_ALLOWED

    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.

  • 403ACCOUNT_NOT_ACTIVE

    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.
  • 429RATE_TPS_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.

Other responses

This endpoint does not declare responses of this kind.

See it in the error catalog

Special considerations

Unique visits are the sum of each day’s, not distinct people. Responses can be up to one minute old (X-Cache header).

Change of 2026-09-30: the previous period used to come always; now only with compare=previous. If you use it, add the parameter.

Related documentation

Need help?

Was this page helpful?

See all support channels

Ask for help about this: this endpoint

We build a message with the details that help us look into your case. Read it, complete it and send it yourself: nothing is sent on its own.

The message never carries your API key or passwords.