
Product
Socket for Jira Is Now Available
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.
Learn more about the Dub.co TypeScript SDK in the official documentation.
The SDK can be installed with either npm, pnpm, bun or yarn package managers.
npm add dub
pnpm add dub
bun add dub
yarn add dub
[!NOTE] This package is published with CommonJS and ES Modules (ESM) support.
For supported JavaScript runtimes, please consult RUNTIMES.md.
import { Dub } from "dub";
const dub = new Dub({
token: "DUB_API_KEY",
});
async function run() {
const result = await dub.links.create();
console.log(result);
}
run();
import { Dub } from "dub";
const dub = new Dub({
token: "DUB_API_KEY",
});
async function run() {
const result = await dub.links.upsert();
console.log(result);
}
run();
DubError is the base class for all HTTP error responses. It has the following properties:
| Property | Type | Description |
|---|---|---|
error.message | string | Error message |
error.statusCode | number | HTTP response status code eg 404 |
error.headers | Headers | HTTP response headers |
error.body | string | HTTP body. Can be empty string if no body is returned. |
error.rawResponse | Response | Raw HTTP response |
error.data$ | Optional. Some errors may contain structured data. See Error Classes. |
import { Dub } from "dub";
import * as errors from "dub/models/errors";
const dub = new Dub({
token: "DUB_API_KEY",
});
async function run() {
try {
const result = await dub.links.list();
for await (const page of result) {
console.log(page);
}
} catch (error) {
// The base class for HTTP error responses
if (error instanceof errors.DubError) {
console.log(error.message);
console.log(error.statusCode);
console.log(error.body);
console.log(error.headers);
// Depending on the method different errors may be thrown
if (error instanceof errors.BadRequest) {
console.log(error.data$.error); // errors.ErrorT
}
}
}
}
run();
Primary errors:
DubError: The base class for HTTP error responses.
BadRequest: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). Status code 400.Unauthorized: Although the HTTP standard specifies "unauthorized", semantically this response means "unauthenticated". That is, the client must authenticate itself to get the requested response. Status code 401.Forbidden: The client does not have access rights to the content; that is, it is unauthorized, so the server is refusing to give the requested resource. Unlike 401 Unauthorized, the client's identity is known to the server. Status code 403.NotFound: The server cannot find the requested resource. Status code 404.Conflict: This response is sent when a request conflicts with the current state of the server. Status code 409.InviteExpired: This response is sent when the requested content has been permanently deleted from server, with no forwarding address. Status code 410.UnprocessableEntity: The request was well-formed but was unable to be followed due to semantic errors. Status code 422.RateLimitExceeded: The user has sent too many requests in a given amount of time ("rate limiting"). Status code 429.InternalServerError: The server has encountered a situation it does not know how to handle. Status code 500.Network errors:
ConnectionError: HTTP client was unable to make a request to a server.RequestTimeoutError: HTTP request timed out due to an AbortSignal signal.RequestAbortedError: HTTP request was aborted by the client.InvalidRequestError: Any input used to create a request is invalid.UnexpectedClientError: Unrecognised or unexpected error.Inherit from DubError:
ResponseValidationError: Type mismatch between the data returned from the server and the structure expected by the SDK. See error.rawValue for the raw value and error.pretty() for a nicely formatted multi-line string.The default server can be overridden globally by passing a URL to the serverURL: string optional parameter when initializing the SDK client instance. For example:
import { Dub } from "dub";
const dub = new Dub({
serverURL: "https://api.dub.co",
token: "DUB_API_KEY",
});
async function run() {
const result = await dub.links.list();
for await (const page of result) {
console.log(page);
}
}
run();
The TypeScript SDK makes API calls using an HTTPClient that wraps the native
Fetch API. This
client is a thin wrapper around fetch and provides the ability to attach hooks
around the request lifecycle that can be used to modify the request or handle
errors and response.
The HTTPClient constructor takes an optional fetcher argument that can be
used to integrate a third-party HTTP client or when writing tests to mock out
the HTTP client and feed in fixtures.
The following example shows how to:
"beforeRequest" hook to add a custom header and a timeout to requests"requestError" hook to log errorsimport { Dub } from "dub";
import { ProxyAgent } from "undici";
import { HTTPClient } from "dub/lib/http";
const dispatcher = new ProxyAgent("http://proxy.example.com:8080");
const httpClient = new HTTPClient({
// 'fetcher' takes a function that has the same signature as native 'fetch'.
fetcher: (input, init) =>
// 'dispatcher' is specific to undici and not part of the standard Fetch API.
fetch(input, { ...init, dispatcher } as RequestInit),
});
httpClient.addHook("beforeRequest", (request) => {
const nextRequest = new Request(request, {
signal: request.signal || AbortSignal.timeout(5000)
});
nextRequest.headers.set("x-custom-header", "custom value");
return nextRequest;
});
httpClient.addHook("requestError", (error, request) => {
console.group("Request Error");
console.log("Reason:", `${error}`);
console.log("Endpoint:", `${request.method} ${request.url}`);
console.groupEnd();
});
const sdk = new Dub({ httpClient: httpClient });
This SDK supports the following security scheme globally:
| Name | Type | Scheme |
|---|---|---|
token | http | HTTP Bearer |
To authenticate with the API the token parameter must be set when initializing the SDK client instance. For example:
import { Dub } from "dub";
const dub = new Dub({
token: "DUB_API_KEY",
});
async function run() {
const result = await dub.links.list();
for await (const page of result) {
console.log(page);
}
}
run();
Some of the endpoints in this SDK support retries. If you use the SDK without any configuration, it will fall back to the default retry strategy provided by the API. However, the default retry strategy can be overridden on a per-operation basis, or across the entire SDK.
To change the default retry strategy for a single API call, simply provide a retryConfig object to the call:
import { Dub } from "dub";
const dub = new Dub({
token: "DUB_API_KEY",
});
async function run() {
const result = await dub.links.list(undefined, {
retries: {
strategy: "backoff",
backoff: {
initialInterval: 1,
maxInterval: 50,
exponent: 1.1,
maxElapsedTime: 100,
},
retryConnectionErrors: false,
},
});
for await (const page of result) {
console.log(page);
}
}
run();
If you'd like to override the default retry strategy for all operations that support retries, you can provide a retryConfig at SDK initialization:
import { Dub } from "dub";
const dub = new Dub({
retryConfig: {
strategy: "backoff",
backoff: {
initialInterval: 1,
maxInterval: 50,
exponent: 1.1,
maxElapsedTime: 100,
},
retryConnectionErrors: false,
},
token: "DUB_API_KEY",
});
async function run() {
const result = await dub.links.list();
for await (const page of result) {
console.log(page);
}
}
run();
Some of the endpoints in this SDK support pagination. To use pagination, you
make your SDK calls as usual, but the returned response object will also be an
async iterable that can be consumed using the for await...of
syntax.
Here's an example of one such pagination call:
import { Dub } from "dub";
const dub = new Dub({
token: "DUB_API_KEY",
});
async function run() {
const result = await dub.links.list();
for await (const page of result) {
console.log(page);
}
}
run();
All the methods listed above are available as standalone functions. These functions are ideal for use in applications running in the browser, serverless runtimes or other environments where application bundle size is a primary concern. When using a bundler to build your application, all unused functionality will be either excluded from the final bundle or tree-shaken away.
To read more about standalone functions, check FUNCTIONS.md.
analyticsRetrieve - Retrieve analytics for a link, a domain, or the authenticated workspace.bountiesApproveSubmission - Approve a bounty submissionbountiesListSubmissions - List bounty submissionsbountiesRejectSubmission - Reject a bounty submissioncommissionsList - List all commissionscommissionsUpdate - Update a commissioncommissionsUpdateMany - Bulk update commissionscustomersDelete - Delete a customercustomersGet - Retrieve a customercustomersList - Retrieve a list of customerscustomersUpdate - Update a customerdomainsCheckStatus - Check the availability of one or more domainsdomainsCreate - Create a domaindomainsDelete - Delete a domaindomainsList - Retrieve a list of domainsdomainsRegister - Register a domaindomainsUpdate - Update a domainembedTokensReferrals - Create a referrals embed tokeneventsList - Retrieve a list of eventsfoldersCreate - Create a folderfoldersDelete - Delete a folderfoldersList - Retrieve a list of foldersfoldersUpdate - Update a folderlinksCount - Retrieve links countlinksCreate - Create a linklinksCreateMany - Bulk create linkslinksDelete - Delete a linklinksDeleteMany - Bulk delete linkslinksGet - Retrieve a linklinksList - Retrieve a list of linkslinksUpdate - Update a linklinksUpdateMany - Bulk update linkslinksUpsert - Upsert a linkpartnersAnalytics - Retrieve analytics for a partnerpartnersBan - Ban a partnerpartnersCreate - Create or update a partnerpartnersCreateLink - Create a link for a partnerpartnersDeactivate - Deactivate a partnerpartnersList - List all partnerspartnersRetrieveLinks - Retrieve a partner's links.partnersUpsertLink - Upsert a link for a partnerpayoutsList - List all payoutsqrCodesGet - Retrieve a QR codetagsCreate - Create a tagtagsDelete - Delete a tagtagsList - Retrieve a list of tagstagsUpdate - Update a tagtrackLead - Track a leadtrackSale - Track a saleYou can setup your SDK to emit debug logs for SDK requests and responses.
You can pass a logger that matches console's interface as an SDK option.
[!WARNING] Beware that debug logging will reveal secrets, like API tokens in headers, in log messages printed to a console or files. It's recommended to use this feature only during local development and not in production.
import { Dub } from "dub";
const sdk = new Dub({ debugLogger: console });
Dub API: Dub is the modern link attribution platform for short links, conversion tracking, and affiliate programs.
While we value open-source contributions to this SDK, this library is generated programmatically. Feel free to open a PR or a Github issue as a proof of concept and we'll do our best to include it in a future release!
FAQs
Dub.co TypeScript SDK <img src="https
The npm package dub receives a total of 87,700 weekly downloads. As such, dub popularity was classified as popular.
We found that dub demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.