{"openapi":"3.1.0","info":{"title":"HorizonDrive public API","version":"1.0.0","description":"Machine-readable documentation for the public HorizonDrive endpoints. Authenticated application routes are not a stable third-party API unless explicitly listed here.","contact":{"url":"https://horizondrive.online/contact"}},"servers":[{"url":"https://horizondrive.online"}],"externalDocs":{"description":"HorizonDrive developer documentation","url":"https://horizondrive.online/developers"},"tags":[{"name":"Discovery","description":"Machine-readable service metadata for agents and integrations."},{"name":"Contact","description":"Public product and support contact form."},{"name":"Client authentication","description":"Explicitly authorized client-account flows."}],"paths":{"/api/openapi.json":{"get":{"tags":["Discovery"],"operationId":"getOpenApiDocument","summary":"Get the HorizonDrive OpenAPI document","description":"Returns the current public API description. This endpoint does not require authentication.","responses":{"200":{"description":"The OpenAPI document.","content":{"application/json":{"schema":{"type":"object","required":["openapi","info","paths"],"properties":{"openapi":{"type":"string","example":"3.1.0"},"info":{"type":"object"},"paths":{"type":"object","additionalProperties":true}}}}}}}}},"/api/contact":{"post":{"tags":["Contact"],"operationId":"submitContactRequest","summary":"Send a contact request","description":"Sends a product, presentation, or support request to HorizonDrive. No account or private workspace access is required.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"}}}},"responses":{"200":{"description":"The request was accepted for delivery.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactAccepted"}}}},"400":{"description":"The required contact fields are missing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The service could not process the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The contact delivery provider rejected the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/auth/client-login":{"post":{"tags":["Client authentication"],"operationId":"loginClient","summary":"Authenticate a client account","description":"Authenticates a client account after the user has explicitly provided credentials. Never guess or reuse credentials without authorization.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientLoginRequest"}}}},"responses":{"200":{"description":"The client account was authenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientLoginResponse"}}}},"400":{"description":"Email or password is missing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"The credentials are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The client account is not valid or is disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The service could not process the login.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"ContactRequest":{"type":"object","required":["nom","email","message"],"properties":{"nom":{"type":"string","minLength":1,"description":"Full name."},"email":{"type":"string","format":"email"},"message":{"type":"string","minLength":1},"telephone":{"type":["string","null"]},"entreprise":{"type":["string","null"]}},"additionalProperties":false},"ContactAccepted":{"type":"object","required":["success","requestId"],"properties":{"success":{"type":"boolean","const":true},"requestId":{"type":"string"}}},"ClientLoginRequest":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":1,"format":"password"}},"additionalProperties":false},"ClientLoginResponse":{"type":"object","required":["success","user"],"properties":{"success":{"type":"boolean","const":true},"user":{"type":"object","required":["id","user_id","client_id","email"],"properties":{"id":{"type":"string"},"user_id":{"type":"string"},"client_id":{"type":"string"},"email":{"type":"string","format":"email"},"client_name":{"type":["string","null"]},"client_info":{"type":["object","null"],"additionalProperties":true},"email_verified":{"type":"boolean"}}}}},"ErrorResponse":{"type":"object","required":["error","code","message","hint"],"properties":{"error":{"type":"string","description":"Legacy human-readable error message."},"code":{"type":"string","description":"Stable machine-readable error code."},"message":{"type":"string"},"hint":{"type":"string","description":"Action an agent can take to resolve the error."},"requestId":{"type":"string"}}}}}}