REST API reference for integrating StackBloom apps into your own projects
All API requests require authentication using an API key. Include your API key in the Authorization header:
Authorization: Bearer YOUR_API_KEY
Getting Your API Key: Generate API keys from your dashboard in each app's settings (Forms, URL Shortener, etc.)
API requests are rate-limited to ensure service quality. Rate limit information is included in response headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per hour |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Time when the rate limit resets |
Create, manage, and submit forms programmatically.
/api/formsCreate a new form
{
"name": "Contact Form",
"description": "Main contact form for website",
"template": "contact" // optional
}{
"id": "form_12345",
"name": "Contact Form",
"description": "Main contact form for website",
"isPublished": false,
"createdAt": "2026-02-18T10:30:00Z"
}/api/formsList all forms with filtering options
status - Filter by status (published, draft)/api/forms/:id/submitSubmit a form (public endpoint)
{
"data": {
"field_id_1": "John Doe",
"field_id_2": "john@example.com",
"field_id_3": "Message content"
}
}/api/forms/:id/submissionsRetrieve form submissions with pagination
Convert, edit, and manipulate PDF documents programmatically.
/api/pdf-suite/convertConvert PDF to various formats
{
"fileUrl": "https://example.com/document.pdf",
"targetFormat": "docx", // docx, xlsx, txt, jpg, png
"options": {
"dpi": 150 // for image conversions
}
}{
"success": true,
"url": "https://storage.example.com/converted.docx",
"format": "docx",
"size": 245678
}Create, manage, and track shortened URLs with detailed analytics.
/api/v1/linksCreate a new shortened link
{
"destination": "https://example.com/very-long-url",
"slug": "custom-slug", // optional
"title": "My Link", // optional
"tags": ["marketing"], // optional
"password": "secret", // optional
"expiresAt": "2026-12-31T23:59:59Z", // optional
"maxClicks": 1000 // optional
}{
"success": true,
"data": {
"id": "clx1234567890",
"slug": "custom-slug",
"shortUrl": "https://stackbloom.io/r/custom-slug",
"destination": "https://example.com/very-long-url",
"title": "My Link",
"tags": ["marketing"],
"isActive": true,
"currentClicks": 0,
"maxClicks": 1000,
"expiresAt": "2026-12-31T23:59:59Z",
"createdAt": "2026-02-18T10:30:00Z"
}
}/api/v1/linksList all links with pagination
limit - Number of results (max 100, default 50)offset - Pagination offset (default 0)tag - Filter by tagactive - Filter by active status (true/false){
"success": true,
"data": [...],
"meta": {
"total": 150,
"limit": 50,
"offset": 0,
"hasMore": true
}
}/api/v1/links/:idUpdate an existing link
/api/v1/links/:idDelete a link permanently
/api/v1/links/:id/analyticsGet detailed analytics for a link
period - Time period (24h, 7d, 30d, all)granularity - Data granularity (hourly, daily)Monitor websites, APIs, and servers with uptime checks and alerts.
/api/monitor/monitorsCreate a new monitor
{
"name": "Production API",
"type": "HTTP", // HTTP, SSL, KEYWORD, API, PORT, PING, HEARTBEAT, DOMAIN, PAGE_SPEED
"url": "https://api.example.com",
"method": "GET",
"checkInterval": 60, // seconds (10-3600)
"timeout": 30, // seconds
"expectedStatusCode": 200,
"followRedirects": true,
"locations": ["us-east"],
"keyword": "success", // for KEYWORD type
"keywordMode": "PRESENT" // PRESENT or ABSENT
}{
"id": "mon_12345",
"name": "Production API",
"type": "HTTP",
"url": "https://api.example.com",
"isActive": true,
"isPaused": false,
"createdAt": "2026-02-18T10:30:00Z"
}/api/monitor/monitorsList all monitors with latest status
Receive real-time notifications about events in your StackBloom apps.
form.submitted - New form submissionform.published - Form publishedmonitor.down - Monitor went downmonitor.up - Monitor came back upincident.created - New incidentincident.resolved - Incident resolvedlink.clicked - Link was clickedlink.expired - Link expired{
"event": "form.submitted",
"timestamp": "2026-02-18T10:30:00Z",
"data": {
"formId": "form_12345",
"submissionId": "sub_67890",
"fields": {
"name": "John Doe",
"email": "john@example.com"
}
}
}All webhooks include an X-StackBloom-Signature header with an HMAC-SHA256 signature. Verify this signature using your webhook secret to ensure the request is authentic.
All error responses follow a consistent format across the StackBloom API.
{
"error": "Error message description",
"details": [...] // optional, for validation errors
}200201400401403404409429500// Create a shortened URL
const response = await fetch('https://www.stackbloom.io/api/v1/links', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
destination: 'https://example.com',
slug: 'my-link',
title: 'My Awesome Link'
})
});
const data = await response.json();
console.log(data.data.shortUrl);import requests
# Create a form
response = requests.post(
'https://www.stackbloom.io/api/forms',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
json={
'name': 'Contact Form',
'description': 'Main contact form',
}
)
data = response.json()
print(f"Form created: {data['id']}")# Create a monitor
curl -X POST https://www.stackbloom.io/api/monitor/monitors \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Production API",
"type": "HTTP",
"url": "https://api.example.com",
"checkInterval": 60
}'<?php
// Convert PDF to Word
$ch = curl_init('https://www.stackbloom.io/api/pdf-suite/convert');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'fileUrl' => 'https://example.com/document.pdf',
'targetFormat' => 'docx',
]));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo "Converted file: " . $data['url'];
?>The StackBloom API uses URL-based versioning for certain endpoints:
/api/v1/links/api/[app-name]/... (no version prefix)We maintain backwards compatibility and will announce any breaking changes at least 90 days in advance.