Files

407 lines
7.9 KiB
Markdown
Raw Permalink Normal View History

2026-01-17 16:42:43 +02:00
# API Documentation
This document describes the API endpoints for the site monitoring application.
## Authentication
All API endpoints require authentication using Laravel Sanctum tokens. You need to be logged into the web application to generate API tokens.
### Generate an API Token
After logging into the web application, you can generate an API token by making a POST request:
```bash
POST /api/tokens
Authorization: Bearer {your-session-token}
Content-Type: application/json
{
"token_name": "My API Token"
}
```
**Response:**
```json
{
"token": "1|abcdef123456...",
"type": "Bearer"
}
```
**Important:** Save this token securely. It will only be shown once.
### Using the API Token
Include the token in the `Authorization` header for all API requests:
```bash
Authorization: Bearer 1|abcdef123456...
```
### Token Management
#### List All Tokens
```bash
GET /api/tokens
Authorization: Bearer {your-token}
```
#### Revoke a Specific Token
```bash
DELETE /api/tokens/{tokenId}
Authorization: Bearer {your-token}
```
#### Revoke All Tokens
```bash
DELETE /api/tokens
Authorization: Bearer {your-token}
```
## API Endpoints
### Sites
#### List All Sites
Get all sites for the authenticated user.
```bash
GET /api/sites
Authorization: Bearer {your-token}
```
**Response:**
```json
{
"data": [
{
"id": 1,
"user_id": 1,
"url": "https://example.com",
"name": "My Website",
"monitoring_enabled": true,
"uptime_checks_count": 150,
"ssl_certificates_count": 5,
"broken_links_count": 3,
"created_at": "2024-01-01T00:00:00.000000Z",
"updated_at": "2024-01-15T12:00:00.000000Z"
}
]
}
```
#### Get a Specific Site
```bash
GET /api/sites/{site}
Authorization: Bearer {your-token}
```
**Response:**
```json
{
"data": {
"id": 1,
"user_id": 1,
"url": "https://example.com",
"name": "My Website",
"monitoring_enabled": true,
"uptime_checks_count": 150,
"ssl_certificates_count": 5,
"broken_links_count": 3,
"created_at": "2024-01-01T00:00:00.000000Z",
"updated_at": "2024-01-15T12:00:00.000000Z"
}
}
```
### Uptime Monitoring
#### Get Uptime History
Get paginated uptime check history for a site.
```bash
GET /api/sites/{site}/uptime?per_page=50
Authorization: Bearer {your-token}
```
**Query Parameters:**
- `per_page` (optional): Number of results per page (1-100, default: 50)
**Response:**
```json
{
"current_page": 1,
"data": [
{
"id": 1,
"site_id": 1,
"status_code": 200,
"response_time_ms": 245,
"checked_at": "2024-01-15T12:00:00.000000Z",
"created_at": "2024-01-15T12:00:00.000000Z"
}
],
"first_page_url": "http://localhost/api/sites/1/uptime?page=1",
"from": 1,
"last_page": 3,
"last_page_url": "http://localhost/api/sites/1/uptime?page=3",
"links": [...],
"next_page_url": "http://localhost/api/sites/1/uptime?page=2",
"path": "http://localhost/api/sites/1/uptime",
"per_page": 50,
"prev_page_url": null,
"to": 50,
"total": 150
}
```
#### Get Uptime Statistics
Get uptime statistics for a site.
```bash
GET /api/sites/{site}/uptime/stats
Authorization: Bearer {your-token}
```
**Response:**
```json
{
"data": {
"total_checks": 150,
"successful_checks": 147,
"uptime_percentage": 98.0,
"average_response_time_ms": 234.56,
"latest_check": {
"id": 150,
"site_id": 1,
"status_code": 200,
"response_time_ms": 245,
"checked_at": "2024-01-15T12:00:00.000000Z",
"created_at": "2024-01-15T12:00:00.000000Z"
}
}
}
```
### SSL Certificate Monitoring
#### Get SSL Certificate Data
Get the latest SSL certificate information for a site.
```bash
GET /api/sites/{site}/ssl
Authorization: Bearer {your-token}
```
**Response:**
```json
{
"data": {
"issuer": "Let's Encrypt Authority X3",
"expires_at": "2024-04-15T00:00:00.000000Z",
"checked_at": "2024-01-15T12:00:00.000000Z",
"days_until_expiry": 90,
"is_expiring_soon": false,
"is_expired": false
}
}
```
#### Get SSL Certificate History
Get paginated SSL certificate check history.
```bash
GET /api/sites/{site}/ssl/history?per_page=20
Authorization: Bearer {your-token}
```
**Query Parameters:**
- `per_page` (optional): Number of results per page (1-100, default: 20)
**Response:**
```json
{
"current_page": 1,
"data": [
{
"id": 5,
"site_id": 1,
"issuer": "Let's Encrypt Authority X3",
"expires_at": "2024-04-15T00:00:00.000000Z",
"checked_at": "2024-01-15T12:00:00.000000Z",
"created_at": "2024-01-15T12:00:00.000000Z"
}
],
"first_page_url": "...",
"last_page": 1,
"per_page": 20,
"total": 5
}
```
### Broken Links
#### Get Broken Links List
Get paginated list of broken links for a site.
```bash
GET /api/sites/{site}/links?per_page=50
Authorization: Bearer {your-token}
```
**Query Parameters:**
- `per_page` (optional): Number of results per page (1-100, default: 50)
**Response:**
```json
{
"current_page": 1,
"data": [
{
"id": 1,
"site_id": 1,
"url": "https://example.com/broken-page",
"status_code": 404,
"last_checked_at": "2024-01-15T12:00:00.000000Z",
"created_at": "2024-01-15T12:00:00.000000Z"
}
],
"first_page_url": "...",
"last_page": 1,
"per_page": 50,
"total": 3
}
```
#### Get Broken Links Statistics
Get statistics about broken links for a site.
```bash
GET /api/sites/{site}/links/stats
Authorization: Bearer {your-token}
```
**Response:**
```json
{
"data": {
"total_broken_links": 3,
"status_code_breakdown": [
{
"status_code": 404,
"count": 2
},
{
"status_code": 500,
"count": 1
}
]
}
}
```
## Error Responses
### Unauthorized (401)
```json
{
"message": "Unauthenticated."
}
```
### Forbidden (403)
```json
{
"message": "Unauthorized"
}
```
### Not Found (404)
```json
{
"message": "No SSL certificate data found"
}
```
### Validation Error (422)
```json
{
"message": "The per_page field must be an integer.",
"errors": {
"per_page": [
"The per_page field must be an integer."
]
}
}
```
## Example Usage
### Using cURL
```bash
# List all sites
curl -X GET http://localhost/api/sites \
-H "Authorization: Bearer 1|abcdef123456..." \
-H "Accept: application/json"
# Get uptime history
curl -X GET "http://localhost/api/sites/1/uptime?per_page=25" \
-H "Authorization: Bearer 1|abcdef123456..." \
-H "Accept: application/json"
# Get SSL certificate data
curl -X GET http://localhost/api/sites/1/ssl \
-H "Authorization: Bearer 1|abcdef123456..." \
-H "Accept: application/json"
```
### Using JavaScript (Fetch API)
```javascript
const apiToken = '1|abcdef123456...';
const baseUrl = 'http://localhost/api';
// List all sites
const response = await fetch(`${baseUrl}/sites`, {
headers: {
'Authorization': `Bearer ${apiToken}`,
'Accept': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Using Python (requests)
```python
import requests
api_token = '1|abcdef123456...'
base_url = 'http://localhost/api'
headers = {
'Authorization': f'Bearer {api_token}',
'Accept': 'application/json'
}
# List all sites
response = requests.get(f'{base_url}/sites', headers=headers)
data = response.json()
print(data)
```
## Rate Limiting
API requests are subject to Laravel's default rate limiting (60 requests per minute for authenticated users). If you exceed the rate limit, you'll receive a `429 Too Many Requests` response.
## Security Best Practices
1. **Never share your API tokens** - Keep them secure and treat them like passwords
2. **Use HTTPS in production** - Always use encrypted connections when making API requests
3. **Rotate tokens regularly** - Periodically revoke and recreate your API tokens
4. **Use separate tokens for different applications** - Create named tokens for each integration
5. **Revoke unused tokens** - Remove tokens that are no longer needed