{"openapi":"3.0.3","info":{"title":"SHORTME API","version":"1.1.0"},"servers":[{"url":"https://short.micheleg.me/api"}],"security":[{"apiToken":[]}],"components":{"securitySchemes":{"apiToken":{"type":"apiKey","in":"header","name":"X-Api-Token"}}},"paths":{"/":{"get":{"summary":"Verifica che l'API sia operativa.","description":"Restituisce lo stato del servizio, la versione, la connessione al database e l'elenco degli endpoint. È utile come health check.","operationId":"stato","parameters":[],"responses":{"200":{"description":"Servizio operativo","content":{"application/json":{"example":{"success":true,"status":"operational","version":"1.1.0","api":"SHORTME API","database":"connected","timestamp":"2026-01-15 10:30:00"}}}}}}},"/list":{"get":{"summary":"Elenca gli URL creati con il tuo token.","description":"Restituisce gli URL creati con il token usato per la richiesta, dal più recente. Supporta paginazione e ricerca nell'URL originale, nello short code e nell'alias.","operationId":"elenco","parameters":[{"name":"page","in":"query","required":false,"description":"Numero di pagina (default 1).","schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"description":"Risultati per pagina, da 1 a 100 (default 50).","schema":{"type":"integer"}},{"name":"search","in":"query","required":false,"description":"Testo da cercare.","schema":{"type":"string"}}],"responses":{"200":{"description":"Pagina di risultati","content":{"application/json":{"example":{"success":true,"data":[{"original_url":"https://example.com/pagina-molto-lunga","short_code":"aB3xYz","short_url":"https://short.micheleg.me/s/aB3xYz","created_at":"2026-01-15 10:30:00","alias":"mio-link"}],"pagination":{"total":1,"page":1,"limit":20,"pages":1}}}}}}}},"/{short_code}":{"get":{"summary":"Legge un URL tramite il suo short code.","description":"Restituisce i dettagli di un URL. I campi `alias`, `expires_at` e `max_uses` compaiono solo se impostati.","operationId":"dettaglio","parameters":[{"name":"short_code","in":"path","required":true,"description":"Lo short code dell'URL.","schema":{"type":"string"}}],"responses":{"200":{"description":"URL trovato","content":{"application/json":{"example":{"success":true,"data":{"original_url":"https://example.com/pagina-molto-lunga","short_code":"aB3xYz","short_url":"https://short.micheleg.me/s/aB3xYz","created_at":"2026-01-15 10:30:00","alias":"mio-link","expires_at":"2026-12-31 23:59:59","max_uses":100}}}}},"404":{"description":"URL inesistente o eliminato","content":{"application/json":{"example":{"success":false,"error":"URL not found"}}}}}}},"/create":{"post":{"summary":"Crea un nuovo URL accorciato.","description":"Crea un URL breve. Puoi scegliere un alias, uno short code personalizzato, una data di scadenza e un numero massimo di utilizzi. Se non indichi `custom_code` lo short code viene generato automaticamente.","operationId":"crea","parameters":[],"responses":{"201":{"description":"URL creato","content":{"application/json":{"example":{"success":true,"data":{"original_url":"https://example.com/pagina-molto-lunga","short_code":"aB3xYz","short_url":"https://short.micheleg.me/s/aB3xYz","created_at":"2026-01-15 10:30:00","alias":"mio-link","expires_at":"2030-12-31 23:59:59","max_uses":100}}}}},"400":{"description":"Dati non validi","content":{"application/json":{"example":{"success":false,"error":"Invalid URL format"}}}},"409":{"description":"Alias o codice già esistente","content":{"application/json":{"example":{"success":false,"error":"Alias already exists"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"original_url":{"type":"string","description":"URL da accorciare. Deve essere http o https e al massimo di 2048 caratteri."},"alias":{"type":"string","description":"Alias personalizzato: lettere, numeri, trattini e underscore. Deve essere univoco."},"custom_code":{"type":"string","description":"Short code personalizzato (stessi caratteri dell'alias). Deve essere univoco."},"expires_at":{"type":"string","description":"Data di scadenza futura, formato `YYYY-MM-DD HH:MM:SS` o `YYYY-MM-DD`."},"max_uses":{"type":"integer","description":"Numero massimo di utilizzi (intero positivo)."}},"required":["original_url"]}}}}}},"/update/{short_code}":{"put":{"summary":"Modifica un URL esistente.","description":"Aggiorna solo i campi inviati. Puoi modificare soltanto gli URL creati con il tuo stesso token. Invia una stringa vuota in `alias` o `expires_at` per rimuoverli. Accetta anche `POST` sullo stesso percorso.","operationId":"aggiorna","parameters":[{"name":"short_code","in":"path","required":true,"description":"Lo short code dell'URL da modificare.","schema":{"type":"string"}}],"responses":{"200":{"description":"URL aggiornato","content":{"application/json":{"example":{"success":true,"data":{"original_url":"https://example.com/pagina-molto-lunga","short_code":"aB3xYz","short_url":"https://short.micheleg.me/s/aB3xYz","created_at":"2026-01-15 10:30:00","max_uses":500}}}}},"400":{"description":"Dati non validi o nessun campo da aggiornare","content":{"application/json":{"example":{"success":false,"error":"No fields to update provided"}}}},"403":{"description":"L'URL è stato creato con un altro token","content":{"application/json":{"example":{"success":false,"error":"Forbidden. Not authorized."}}}},"404":{"description":"URL inesistente","content":{"application/json":{"example":{"success":false,"error":"URL not found"}}}},"409":{"description":"Alias già in uso","content":{"application/json":{"example":{"success":false,"error":"Alias already exists"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"original_url":{"type":"string","description":"Nuovo URL di destinazione (http o https)."},"alias":{"type":"string","description":"Nuovo alias, oppure stringa vuota per rimuoverlo."},"expires_at":{"type":"string","description":"Nuova scadenza futura, oppure stringa vuota per rimuoverla."},"max_uses":{"type":"integer","description":"Nuovo limite di utilizzi (intero positivo)."}}}}}}}},"/delete/{short_code}":{"delete":{"summary":"Elimina un URL.","description":"Elimina l'URL (eliminazione logica: i dati restano consultabili dal pannello di amministrazione). Puoi eliminare soltanto gli URL creati con il tuo stesso token.","operationId":"elimina","parameters":[{"name":"short_code","in":"path","required":true,"description":"Lo short code dell'URL da eliminare.","schema":{"type":"string"}}],"responses":{"200":{"description":"URL eliminato","content":{"application/json":{"example":{"success":true,"message":"URL deleted successfully","data":{"short_code":"aB3xYz"}}}}},"403":{"description":"L'URL è stato creato con un altro token","content":{"application/json":{"example":{"success":false,"error":"Forbidden. Not authorized."}}}},"404":{"description":"URL inesistente","content":{"application/json":{"example":{"success":false,"error":"URL not found"}}}}}}}}}