Skip to main content

API Overview

The Petal API provides programmatic access to subscription and license management.

Subscription Required

API access requires a Standard or Advanced subscription.

Base URL

https://petal.tech/api/v1

Authentication

Most endpoints require authentication via Bearer token:

Authorization: Bearer <access_token>

See Authentication for details on obtaining tokens.

Response Format

All responses are JSON:

{
"data": { ... },
"error": null
}

Error responses:

{
"data": null,
"error": "Error message",
"code": "ERROR_CODE"
}

Available Endpoints

Authentication

MethodEndpointDescription
POST/auth/loginSign in with email/password
POST/auth/signupCreate new account
POST/auth/refreshRefresh access token

Subscription

MethodEndpointDescription
GET/subscription/statusGet subscription details

License

MethodEndpointDescription
POST/license/validateValidate a license key
POST/license/activateActivate license on device

API Keys

MethodEndpointDescription
POST/metrics/api-keyGenerate or retrieve API key
POST/metrics/api-key/validateValidate an API key

Utility

MethodEndpointDescription
POST/heartbeatDevice heartbeat (for session tracking)
GET/binary-hashGet installer file hashes

HTTP Status Codes

CodeMeaning
200Success
400Bad Request - Invalid parameters
401Unauthorized - Missing or invalid auth
403Forbidden - Insufficient permissions
404Not Found - Resource doesn't exist
429Too Many Requests - Rate limited
500Server Error - Try again later

Rate Limiting

Requests are rate limited per IP:

EndpointLimit
Auth (login)5 requests/minute
Auth (signup)3 requests/minute
License endpoints30 requests/minute
API key validation120 requests/minute
General API60 requests/minute

Rate limit headers are included in responses:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 55
X-RateLimit-Reset: 1706365900
Retry-After: 30

SDKs and Libraries

Currently, we don't provide official SDKs. The REST API can be used with any HTTP client:

  • Python: requests, httpx
  • JavaScript: fetch, axios
  • Rust: reqwest
  • Go: net/http

Example: Quick Start

import requests

# Login to get access token
response = requests.post('https://petal.tech/api/v1/auth/login', json={
'email': 'your@email.com',
'password': 'your-password'
})
token = response.json()['access_token']

# Get subscription status
response = requests.get(
'https://petal.tech/api/v1/subscription/status',
headers={'Authorization': f'Bearer {token}'}
)
subscription = response.json()
print(f"Plan: {subscription['subscription']['plan']}")

Next Steps