Welcome to the GetSafeDocs API! This documentation covers all available endpoints for secure document sharing, messaging, tracking, document requests, and more.
The API uses session-based authentication. After successful login, a session is established and subsequent requests are authenticated automatically.
POST /api/register.php{ "email": "user@example.com", "password": "yourpassword" }{ "success": true, "account_id": 123 } or { "error": "..." }POST /api/login.php{ "email": "user@example.com", "password": "yourpassword" }{ "success": true, "account_id": 123 } or { "error": "..." }POST /api/logout.php{ "success": true, "message": "Logged out successfully" }POST /api/refresh_token.php{ "success": true, "account_id": 123 } or { "error": "Not authenticated" }POST /api/send_message.phpapplication/x-www-form-urlencodedrecipient (string, required)subject (string, required)body (string, required)uploaded_file_ids (string, optional) - Comma-separated list of file IDs from previous uploads{ "success": true, "message_id": 123 } or { "error": "..." }GET /api/list_messages.php?limit=20&offset=0{
"success": true,
"messages": [
{ "message_id": 123, "subject": "Subject", "created_at": "...", "status": "sent", "recipients": "..." }
],
"total": 42,
"limit": 20,
"offset": 0
}GET /api/list_received_messages.php?limit=20&offset=0{
"success": true,
"messages": [
{ "message_id": 456, "subject": "Subject", "created_at": "...", "status": "sent", "sender_email": "..." }
],
"total": 42,
"limit": 20,
"offset": 0
}GET /api/message_details.php?message_id=123{
"success": true,
"message": {
"message_id": 123,
"subject": "...",
"body": "...",
"created_at": "...",
"status": "...",
"sender_email": "...",
"recipients": ["..."],
"attachments": [ { "file_id": 789, "file_name": "..." } ]
}
}POST /api/delete_message.php{ "message_id": 123 }{ "success": true } or { "error": "..." }GET /api/download_attachment.php?file_id=789All file uploads now use a secure multi-step signed URL process for improved security and performance. This applies to both authenticated users and document request uploads.
POST /get_signed_url.phpapplication/json{
"filename": "document.pdf",
"contentType": "application/pdf",
"fileSize": 1024000
}{
"success": true,
"signedUrl": "https://storage.googleapis.com/bucket/temp/path?signature=...",
"tempBucketPath": "user_uploads/uuid/document.pdf",
"uuid": "12345678-1234-1234-1234-123456789012",
"uploadToken": "base64encodedtoken"
}PUTsignedUrl from Step 1contentType from Step 1POST /process_cloud_upload.phpapplication/json{
"tempBucketPath": "user_uploads/uuid/document.pdf",
"filename": "document.pdf",
"contentType": "application/pdf",
"fileSize": 1024000,
"uuid": "12345678-1234-1234-1234-123456789012",
"uploadToken": "base64encodedtoken"
}{
"success": true,
"file_id": "temp_1234567890",
"scan_result": {
"rating": 0,
"risk": "Clean",
"access_uuid": "access_1234567890"
}
}POST /api/upload_file.phpapplication/jsonPOST /api/get_document_request_signed_url.phpaccess_token parameter)application/json{
"filename": "document.pdf",
"contentType": "application/pdf",
"fileSize": 1024000,
"access_token": "abc123def456"
}/get_signed_url.php designed specifically for document request uploads with token-based authentication instead of session-based authenticationAll file uploads are validated using centralized functions in functions.php to ensure consistency across all endpoints.
For current file type support, see: File Types Reference (HTML) | JSON | Markdown
The system supports:
File type lists are maintained in includes/functions.php via these functions:
getAllowedFileExtensions() - Free tier supported typesgetPremiumFileExtensions() - Premium-only additional types getForbiddenFileExtensions() - Security-blocked types{ "success": false, "message": "File type 'exe' is not allowed for security reasons..." }{ "success": false, "message": "File type 'mp4' is not supported for free accounts..." }{ "success": false, "message": "File content does not match the 'pdf' extension..." }GET /api/message_tracking.php?message_id=123{
"success": true,
"message_id": 123,
"subject": "...",
"created_at": "...",
"tracking": [
{ "activity_type": "message_sent", "activity_timestamp": "...", "ip_address": "...", "user_agent": "...", "recipient_email": "..." }
]
}POST /api/add_reply.php{ "message_id": 123, "reply_text": "...", "parent_reply_id": 5 }{ "success": true, "reply_id": 42 } or { "error": "..." }GET /api/list_replies.php?message_id=123{
"success": true,
"replies": [
{ "reply_id": 42, "message_id": 123, "recipient_id": 7, "reply_text": "...", "created_at": "...", "is_read": 0, "parent_reply_id": null, "is_sender_reply": 1, "viewed_at": null }
]
}POST /api/mark_reply_read.php{ "reply_id": 42 }{ "success": true } or { "success": true, "already_read": true }Document requests allow external users to upload files using a secure token without requiring an account.
Note: The API field is called access_token in both the documentation and implementation.
POST /api/create_document_request.php{
"request_name": "Contract Documents",
"description": "Please upload the signed contract and supporting documents",
"allow_multiple_submissions": true,
"max_file_size_mb": 50,
"max_files_per_submission": 10,
"allowed_file_types": "pdf,doc,docx",
"require_email": true,
"require_subject": false,
"require_message": true,
"expiry_days": 30
}{
"success": true,
"message": "Document request created successfully",
"request": {
"request_id": 123,
"request_name": "Contract Documents",
"description": "Please upload the signed contract and supporting documents",
"access_token": "abc123def456",
"allow_multiple_submissions": true,
"max_file_size_mb": 50,
"max_files_per_submission": 10,
"allowed_file_types": "pdf,doc,docx",
"require_email": true,
"require_subject": false,
"require_message": true,
"expiry_date": "2024-02-15 10:30:00",
"expiry_days": 30,
"upload_url": "../document_request_upload.php?token=abc123def456",
"created_at": "2024-01-16 10:30:00"
}
}{ "success": false, "message": "Not authenticated" } (401){ "success": false, "message": "Document request creation is a premium feature..." } (403){ "success": false, "message": "Request name is required" } (400){ "success": false, "message": "Maximum file size must be between 1 and X MB..." } (400)Note: This endpoint now uses a multi-step signed URL upload process for improved security and performance.
POST /api/get_document_request_signed_url.phpaccess_token)application/json{
"filename": "document.pdf",
"contentType": "application/pdf",
"fileSize": 1024000,
"access_token": "abc123def456"
}{
"success": true,
"signedUrl": "https://storage.googleapis.com/bucket/temp/path?signature=...",
"tempBucketPath": "document_requests/uuid/document.pdf",
"uuid": "12345678-1234-1234-1234-123456789012",
"uploadToken": "base64encodedtoken"
}{ "success": false, "message": "Missing required parameters" } (400){ "success": false, "message": "Token is required" } (400){ "success": false, "message": "Invalid or inactive token" } (400){ "success": false, "message": "This document request has expired" } (400){ "success": false, "message": "File exceeds maximum size limit of X MB" } (400){ "success": false, "message": "File type not allowed for security reasons" } (400){ "success": false, "message": "File type 'ext' is not allowed. Allowed types: ..." } (400){ "success": false, "message": "File type does not match content" } (400)PUTsignedUrl from Step 1contentType from Step 1POST /api/upload_document_request_file.phpapplication/json{
"tempBucketPath": "user_uploads/uuid/document.pdf",
"filename": "document.pdf",
"contentType": "application/pdf",
"fileSize": 1024000,
"uuid": "12345678-1234-1234-1234-123456789012",
"uploadToken": "base64encodedtoken",
"access_token": "abc123def456"
}{
"success": true,
"file_id": "docreq_temp_1234567890",
"message": "File uploaded and scanned successfully",
"scan_result": {
"rating": 0,
"risk": "Clean",
"uuid": "12345678-1234-1234-1234-123456789012",
"access_uuid": "access_1234567890",
"scan_id": 12345
}
}{ "success": false, "message": "Missing required parameters" }{ "success": false, "message": "Invalid upload token" }{ "success": false, "message": "File not found in temp bucket" }{ "success": false, "message": "File content does not match file type" }{ "success": false, "message": "Invalid or inactive token" }{ "success": false, "message": "This document request has expired" }{ "success": false, "message": "File exceeds maximum size limit of X MB" }{ "success": false, "message": "File type not allowed for security reasons" }GET /api/get_submission_details.php?submission_id=123{
"success": true,
"html": "<div class=\"row\">...</div>"
}GET /api/get_profile.php{
"success": true,
"profile": {
"account_id": 123,
"email": "user@example.com",
"access_level": "premium",
"mfa_enabled": true,
"email_verified": true,
"is_company_admin": false,
"is_stripe_payer": true,
"created_at": "2024-01-01 10:00:00",
"last_login": "2024-01-15 14:30:00",
"company": { "company_id": 5, "company_name": "Acme Corp" },
"subscription": { "stripe_subscription_id": "sub_123" },
"usage": {
"messages_sent_this_month": 15,
"messages_remaining": 85,
"messages_limit": 100,
"data_sent_mb": 25.5,
"data_received_mb": 10.2,
"data_limit_mb": 1000
},
"limits": {
"max_attachment_size_mb": 50,
"max_attachments": 10,
"max_recipients": 25
}
}
}POST /api/update_profile.php{
"email": "newemail@example.com",
"current_password": "oldpassword",
"new_password": "newpassword",
"mfa_enabled": true
}{ "success": true, "message": "Profile updated successfully" }GET /api/get_usage_stats.php{
"success": true,
"usage_stats": {
"current_month": {
"messages_sent": 15,
"messages_limit": 100,
"messages_remaining": 85,
"data_sent_mb": 25.5,
"data_received_mb": 10.2,
"data_limit_mb": 1000,
"data_remaining_mb": 989.8
},
"limits": {
"max_attachment_size_mb": 50,
"max_attachments": 10,
"max_recipients": 25
},
"access_level": "premium",
"historical_data": [
{ "month": "2024-01", "messages_sent": 15, "data_sent_mb": 25.5 }
],
"document_requests": {
"total_requests": 5,
"active_requests": 3,
"expired_requests": 2
},
"submissions": {
"total_submissions": 12,
"submissions_last_30_days": 8
}
}
}GET /api/list_document_requests.phplimit, offset, status (active/expired/all){
"success": true,
"requests": [
{
"request_id": 123,
"request_name": "Contract Documents",
"description": "Please upload signed contracts",
"access_token": "abc123def456",
"is_active": true,
"allow_multiple_submissions": true,
"max_file_size_mb": 50,
"max_files_per_submission": 10,
"allowed_file_types": "pdf,doc,docx",
"require_email": true,
"require_subject": false,
"require_message": true,
"expiry_date": "2024-02-15 10:30:00",
"expiry_status": "active",
"created_at": "2024-01-16 10:30:00",
"submission_count": 5,
"last_submission": "2024-01-20 15:45:00",
"upload_url": "../document_request_upload.php?token=abc123def456"
}
],
"pagination": {
"total": 5,
"limit": 20,
"offset": 0,
"has_more": false
}
}POST /api/update_document_request.php{
"request_id": 123,
"request_name": "Updated Contract Documents",
"description": "Updated description",
"is_active": true,
"max_file_size_mb": 100,
"expiry_days": 60
}{ "success": true, "message": "Document request updated successfully", "request": {...} }POST /api/delete_document_request.php{
"request_id": 123,
"force_delete": false
}{ "success": true, "message": "Document request deleted successfully", "submissions_deleted": 5, "files_deleted": 12 }GET /api/admin/list_users.phplimit, offset, access_level, company_id, search{
"success": true,
"users": [
{
"account_id": 123,
"email": "user@example.com",
"access_level": "premium",
"is_company_admin": false,
"is_stripe_payer": true,
"email_verified": true,
"mfa_enabled": true,
"account_locked": false,
"last_login": "2024-01-15 14:30:00",
"failed_login_attempts": 0,
"created_at": "2024-01-01 10:00:00",
"company": { "company_id": 5, "company_name": "Acme Corp" }
}
],
"pagination": { "total": 150, "limit": 20, "offset": 0, "has_more": true }
}POST /api/admin/update_user.php{
"account_id": 123,
"access_level": "enterprise",
"is_company_admin": true,
"account_locked": false,
"company_id": 5
}{ "success": true, "message": "User updated successfully", "user": {...} }GET /api/admin/get_security_logs.phplimit, offset, log_type (auth/activity/malware), start_date, end_date, ip_address{
"success": true,
"logs": [
{
"log_type": "authentication",
"log_id": 123,
"account_id": 456,
"email": "user@example.com",
"access_level": "premium",
"ip_address": "192.168.1.1",
"user_agent": "Mozilla/5.0...",
"login_time": "2024-01-15 14:30:00",
"status": "success",
"login_successful": true
}
],
"pagination": { "total": 1000, "limit": 50, "offset": 0, "has_more": true }
}GET /api/admin/get_malware_detections.phplimit, offset, rating (0/1/2), start_date, end_date, sender_id{
"success": true,
"detections": [
{
"detection_id": 123,
"sender_id": 456,
"sender_email": "user@example.com",
"account_email": "user@example.com",
"access_level": "premium",
"file_name": "document.pdf",
"file_path": "/path/to/file",
"file_size": 1024000,
"scan_uuid": "scan_123456",
"scan_rating": 0,
"scan_risk": "Clean",
"detection_timestamp": "2024-01-15 14:30:00",
"risk_level": "clean"
}
],
"summary": {
"total_detections": 1000,
"clean_files": 950,
"suspicious_files": 40,
"malicious_files": 10,
"detections_last_7_days": 25,
"detections_last_30_days": 100
},
"pagination": { "total": 1000, "limit": 50, "offset": 0, "has_more": true }
}POST /api/archive_message.php{
"message_id": 123,
"archive": true
}{ "success": true, "message": "Message archived successfully", "message_id": 123, "archived": true }GET /api/get_file_metadata.php?file_id=123{
"success": true,
"file": {
"file_id": 123,
"message_id": 456,
"file_name": "document.pdf",
"file_path": "/path/to/file",
"file_size": 1024000,
"mime_type": "application/pdf",
"file_extension": "pdf",
"file_type": "document",
"file_icon": "file-pdf",
"storage_location": "cloud",
"preview_only": false,
"scan_rating": 0,
"scan_risk": "Clean",
"scan_uuid": "scan_123456",
"access_uuid": "access_123456",
"scan_id": 789,
"scan_timestamp": "2024-01-15 14:30:00",
"message": {
"message_id": 456,
"subject": "Important Document",
"message_text": "Please review this document",
"created_at": "2024-01-15 10:00:00",
"sender_email": "sender@example.com"
},
"statistics": {
"download_count": 5,
"view_count": 12,
"total_accesses": 17
},
"recent_activity": [...]
}
}POST /api/bulk_operations.php{
"operation": "archive_messages",
"targets": [123, 456, 789]
}archive_messages, unarchive_messages, delete_messages, delete_document_requests{
"success": true,
"operation": "archive_messages",
"summary": {
"total_processed": 3,
"successful": 3,
"failed": 0
},
"results": [
{ "id": 123, "status": "archived" },
{ "id": 456, "status": "archived" },
{ "id": 789, "status": "archived" }
],
"errors": []
}GET /api/get_system_status.php{
"success": true,
"system_status": {
"timestamp": "2024-01-15 14:30:00",
"status": "operational",
"basic": {
"api_version": "1.0",
"server_time": "2024-01-15 14:30:00",
"timezone": "UTC"
},
"database": {
"status": "connected",
"driver": "mysql"
},
"user": {
"account_id": 123,
"access_level": "premium",
"limits": { "max_attachment_size_mb": 50, "max_attachments": 10 }
},
"admin": {
"database_stats": {
"total_users": 1500,
"total_messages": 50000,
"total_files": 25000,
"total_document_requests": 500,
"total_storage_bytes": 1073741824,
"total_storage_mb": 1024
},
"recent_activity": {
"logins_last_24h": 150,
"messages_last_24h": 500,
"malware_detections_last_24h": 5
},
"health_checks": {
"disk_space": { "status": "ok", "free_gb": 50.5 },
"security": { "status": "ok", "failed_logins_last_hour": 2 }
}
}
}
}/api/upload_document_request_file.php) use token-based authentication and do not require a user account.{ "error": "Error message" }Content-Type: application/jsonContent-Type: application/x-www-form-urlencoded// Step 1: Get signed URL
const response = await fetch('/get_signed_url.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
filename: file.name,
contentType: file.type,
fileSize: file.size
})
});
const { signedUrl, tempBucketPath, uuid, uploadToken } = await response.json();
// Step 2: Upload file directly to GCP
await fetch(signedUrl, {
method: 'PUT',
body: file
});
// Step 3: Process upload
const processResponse = await fetch('/process_cloud_upload.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
tempBucketPath,
filename: file.name,
contentType: file.type,
fileSize: file.size,
uuid,
uploadToken
})
});
const { file_id } = await processResponse.json();
// Step 4: Use file_id in message sending
await fetch('/api/send_message.php', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
recipient: 'user@example.com',
subject: 'Test Message',
body: 'Here is the document',
uploaded_file_ids: file_id
})
});
// Step 1: Get signed URL for document request
const response = await fetch('/api/get_document_request_signed_url.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
filename: file.name,
contentType: file.type || 'application/octet-stream',
fileSize: file.size,
access_token: 'abc123def456' // Document request access token
})
});
const data = await response.json();
if (!data.success) {
throw new Error(data.message || 'Failed to get upload URL');
}
const { signedUrl, tempBucketPath, uuid, uploadToken } = data;
// Step 2: Upload file directly to GCP
const uploadResponse = await fetch(signedUrl, {
method: 'PUT',
headers: {
'Content-Type': file.type || 'application/octet-stream'
},
body: file
});
if (!uploadResponse.ok) {
throw new Error(`Upload failed with status: ${uploadResponse.status}`);
}
// Step 3: Process upload and trigger malware scan
const processResponse = await fetch('/api/upload_document_request_file.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
tempBucketPath,
filename: file.name,
contentType: file.type || 'application/octet-stream',
fileSize: file.size,
uuid,
uploadToken,
access_token: 'abc123def456' // Document request access token
})
});
const result = await processResponse.json();
if (!result.success) {
throw new Error(result.message || 'Upload processing failed');
}
const { file_id, scan_result } = result;
// file_id can be used in form submission
// scan_result contains: { rating, risk, uuid, access_uuid, scan_id }
For more information, contact support at GetSafeDocs.