Use it where links actually get handed off.
Reports, chat replies, signed asset delivery, internal tools, and agent actions all need the same thing: a clean short URL you can trust and return right away.
Zrl.app gives you an API First short URL service with a contract that fits cleanly into backend code, workflow tools, and LLM actions. Send a long URL, get a short URL back, and move on.
$ curl --location 'https://api.zrl.app/api/v1/short-urls' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--data '{
"original_url": "https://your-app.com/reports/april-summary?token=xyz123abc"
}'
# Response
{
"short_id": "fYolGcAs",
"original_url": "https://your-app.com/reports/april-summary?token=xyz123abc",
"short_url": "https://zrl.app/fYolGcAs",
"created_at": "2026-04-05T07:08:56.326888Z"
}
Zrl.app stays narrow on purpose: one reliable endpoint, predictable output, and clean docs your app team or agent runtime can use immediately.
Reports, chat replies, signed asset delivery, internal tools, and agent actions all need the same thing: a clean short URL you can trust and return right away.
No extra platform ceremony. Post a long URL, get back a short URL, and continue the workflow.
The API shape is easy for LLM tools, backend jobs, cron flows, and internal bots to consume safely.
Use fetch, requests, Go net/http, Java HttpClient, or any JSON-capable runtime.
Keep the integration lightweight: issue an API key, call one endpoint, and return the resulting short URL to your UI, your backend jobs, or your agent runtime.
const response = await fetch('https://api.zrl.app/api/v1/short-urls', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_API_KEY'
},
body: JSON.stringify({
original_url: 'https://example.com/reports/april-summary'
})
});
const data = await response.json();
console.log(data.short_url);
import requests
response = requests.post(
'https://api.zrl.app/api/v1/short-urls',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
json={
'original_url': 'https://example.com/reports/april-summary'
}
)
print(response.json()['short_url'])
payload := strings.NewReader(`{"original_url":"https://example.com/reports/april-summary"}`)
req, _ := http.NewRequest(http.MethodPost, "https://api.zrl.app/api/v1/short-urls", payload)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.zrl.app/api/v1/short-urls"))
.header("Authorization", "Bearer YOUR_API_KEY")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(
"{\"original_url\":\"https://example.com/reports/april-summary\"}"
))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
# Tool.md
## create_short_url
Create an agent-ready short URL for a long destination.
### request
POST https://api.zrl.app/api/v1/short-urls
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"original_url": "https://example.com/reports/april-summary"
}
### response
{
"short_url": "https://zrl.app/fYolGcAs"
}
Keep the path short: open portal.zrl.app, issue a key, copy a request example, and wire Zrl.app into your workflow.
These terms govern access to and use of the Zrl.app website, API, and related services.
By accessing or using Zrl.app, you agree to these Terms of Service. If you do not agree, do not use the service.
You may use Zrl.app only in compliance with applicable law. You are responsible for the URLs, content, and destinations you submit through the service.
You are responsible for keeping API keys and account access secure. Activity performed with your credentials is treated as your activity unless reported as unauthorized.
Zrl.app acts as infrastructure for creating short links. You retain responsibility for the underlying destination URLs and any content users reach through those links.
The service may change over time, including rate limits, endpoints, UI, and access controls. We may suspend or restrict service to protect reliability, safety, or legal compliance.
Zrl.app is provided on an “as is” and “as available” basis. To the maximum extent permitted by law, we disclaim warranties and are not liable for indirect, incidental, special, consequential, or punitive damages arising from use of the service.
If you have questions about these terms, contact the Zrl.app operator through the official project channels associated with your account or onboarding flow.
This page explains the categories of data Zrl.app may process when you use the website, portal, and API.
Zrl.app may collect account information, API usage metadata, submitted destination URLs, service logs, and operational telemetry needed to run, secure, and improve the service.
We retain data for as long as reasonably necessary to operate the service, comply with legal obligations, resolve disputes, and enforce agreements. Retention periods may vary by data type and operational need.
We do not sell personal information. Data may be shared with infrastructure providers and service partners acting on our behalf, or when required by law, legal process, or to protect the service and its users.
We use reasonable administrative, technical, and organizational safeguards to protect service data. No system is perfectly secure, so users should avoid placing secrets or unnecessary sensitive data in destination URLs.
Depending on jurisdiction, you may have rights to access, correct, or delete certain personal data. Requests should be made through the official project or support channels tied to your account.
This policy may be updated from time to time. Material changes will be reflected by updating the effective date on this page.