ForHosting KIT · Developer Utilities

Build UTM campaign links

Analytics dashboards fracture into a hundred near-duplicate campaign names the moment two people are allowed to type utm_source by hand. This endpoint builds tagged URLs from structured fields and parses existing links back into their parts, so every campaign shows up in reports exactly once.

● StableFree · in your browser
Use it from WebAPIEmailApp soonTelegram soon

Runs in your browser. Free, unlimited — your data never leaves this page.

The typo that splits your traffic report

Marketing teams rarely lose UTM discipline on purpose — someone writes 'Newsletter', someone else writes 'newsletter', a third person writes 'news_letter', and now a single campaign shows up as three separate rows in the analytics tool, each with a fraction of the real traffic. Multiply that across dozens of campaigns and hundreds of links shared by different team members, and the dashboard stops answering the question it was built to answer. dev.utm removes the human typing step from the part of the process where consistency actually matters.

Building and reading links through one endpoint

POST /dev/utm with a base URL and the campaign fields — source, medium, campaign name, and optionally term and content — to get back a properly encoded, tagged URL; or send an existing tagged URL to have it parsed back into its individual parameters. The call returns a task_id right away, and the result arrives by signed webhook or a signed link valid for 24 hours, so the same endpoint covers both generating new links for a campaign and auditing a batch of links someone else already created.

Why five parameters became the industry standard

Urchin Traffic Monitor parameters predate the analytics platform most people associate them with today; they were adopted early on as a simple, vendor-agnostic way to tag a URL with where a visitor came from, and the five-parameter shape — source, medium, campaign, term, content — has stuck around across every major analytics tool since because it maps cleanly onto how marketers actually think about a campaign. The convention only works, though, if the values going into it are applied the same way every single time, which is precisely the part that manual entry gets wrong.

Where it removes friction from a marketing pipeline

A content calendar tool can generate a tagged link automatically the moment a social post is scheduled, an email platform can tag every outbound campaign link without asking a copywriter to remember the naming convention, and a link-shortener service can validate that inbound URLs follow house rules before they ever go live. Because it's billed per request with no minimum commitment, a team can route every outbound link through the endpoint as a matter of course rather than reserving UTM discipline for the campaigns someone remembers to tag by hand.

Automated campaign link generation

A social media scheduling tool builds a correctly tagged URL for every scheduled post so weekly reporting doesn't require manual link tagging.

Auditing links before a launch

A marketing ops team parses a batch of links submitted by different contributors to catch inconsistent source or medium values before a campaign goes live.

Email platform integration

An email sending tool tags every link in a newsletter template automatically so campaign performance rolls up correctly in analytics.

Affiliate and partner link tracking

A partner program generates a unique tagged URL per affiliate so each partner's traffic is attributed without relying on the partner to build the link correctly.

How do I build a UTM URL with the API?

POST the base URL and campaign fields to /dev/utm, keep the returned task_id, and collect the tagged URL by webhook or a signed link valid for 24 hours.

Is the UTM builder API free?

No, there is no free tier or trial; it costs $0.002 per request, and a failed request is never charged.

Can it parse an existing UTM link back into its parts?

Yes, send an already-tagged URL and the endpoint returns the individual source, medium, campaign, term and content values.

Does it enforce a naming convention?

It builds and parses standard UTM parameters consistently; if your team has house rules for naming, applying them through one endpoint is what keeps every link consistent.

Does it handle URL encoding automatically?

Yes, spaces and special characters in campaign values are encoded correctly so the resulting URL is valid in any browser or analytics tool.

Can I generate UTM links in bulk?

Yes, submit one async task per URL and collect each result by webhook, which suits generating links for an entire campaign calendar at once.

Is this endpoint live?

Yes, /dev/utm is live and accepting requests now.

Are the URLs I submit stored?

No, submitted and generated URLs are deleted after the retention window and are never used for training.

Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.

POSThttps://api.kit.forhosting.com/dev/utm

Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.

curl -X POST https://api.kit.forhosting.com/dev/utm \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":["valor-1","valor-2"]}'
{
  "items": [
    "valor-1",
    "valor-2"
  ]
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "dev.utm",
  "status": "queued",
  "_links": {
    "result": "/tasks/tsk_…/result"
  }
}

The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.

Per request$0.002

Published price — no tokens, no invented credits. A failed task is never charged.

HTTPCodeMeaning
401unauthorizedMissing or invalid API key.
402insufficient_balanceYour balance doesn't cover the task price.
404unknown_typeThat task type doesn't exist.
429rate_limitedToo many requests. Use the webhook instead of polling.

Read the full KIT documentation →