407 lines
7.9 KiB
Markdown
407 lines
7.9 KiB
Markdown
# 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
|