SSL Certificates
SSL Certificates
Manage TLS certs. Base: /api/v1/ssl ·
Auth: Authorization: Bearer wsp_…
Error envelope:
{ "success": false, "code": "VALIDATION_ERROR", "error": "Domain is required", "message": "…", "status": 400 }
Status — GET /api/v1/ssl/status
Response 200 (verified live):
{ "certbot_installed": true, "expiring_30_days": 0, "total_certs": 0 }
List — GET /api/v1/ssl/
Response 200 (verified live): [], or cert objects
(domain, common_name, auto_renew, created_at, …).
GET /ssl/expiring · /ssl/:id.
Issue — POST /api/v1/ssl/issue
Request: { "domain": "example.com" }
Real issuance requires the domain's DNS to resolve to this server (Let's Encrypt HTTP-01). On success the panel returns
{ "success": true, "domain": "example.com", "issued": true }.
Response 400 (verified live — empty body):
{ "success": false, "code": "VALIDATION_ERROR",
"error": "Domain is required", "message": "Domain is required",
"status": 400 }
Wildcard / upload / ACME / CSR / renew
POST /ssl/:domain/wildcard { "dns_provider": "cloudflare", "credentials": { "api_token": "•••" } };
POST /ssl/upload { "domain": "x", "certificate": "-----BEGIN…", "private_key": "-----BEGIN…" };
POST /ssl/acme/issue { "domain": "x", "email": "[email protected]" };
POST /ssl/:id/renew · /ssl/renewal-trigger;
PUT /ssl/:id/auto-renew { "auto_renew": true };
POST /ssl/csr/generate { "domain": "x", "country": "VN" };
DELETE /ssl/:id.
Conventions → Authentication, Error Handling.