{"openapi":"3.1.0","info":{"title":"Julio.Works API for agents","version":"1.0.0","description":"The published offer of Julio.Works (web development, custom software and maintenance, Seville and Málaga, Spain) with exact prices and terms, and a way for an AI agent to request a quote on a person’s behalf. Read-only endpoints are cacheable and open; the quote endpoint takes JSON only and is rate-limited. Content is served in Spanish or in English. An MCP server with the same queries and the quote request as tools is at https://julio.works/mcp (card at /mcp/server-card). Human-readable guide: https://julio.works/en/for-agents/","contact":{"name":"Julio.Works","email":"info@julio.works","url":"https://julio.works/en/contact/"}},"servers":[{"url":"https://julio.works"}],"paths":{"/api/oferta":{"get":{"operationId":"getOferta","summary":"The full offer: services, packages, plans, prices and terms","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["es","en"],"default":"es"},"description":"Language of the texts. Figures are the same in both."}],"responses":{"200":{"description":"The offer in the requested language. Prices are in euros without taxes; custom software has no fixed figure, only a range by weekly sprints.","content":{"application/json":{"schema":{"type":"object","properties":{"idioma":{"type":"string","enum":["es","en"]},"moneda":{"type":"string","const":"EUR"},"impuestos":{"type":"string"},"estudio":{"type":"object"},"servicios":{"type":"array","items":{"type":"object"}},"tarifaHoraSuelta":{"type":"number"},"bolsasHoras":{"type":"array","items":{"type":"object"}},"validezBolsas":{"type":"string"},"encargos":{"type":"array","items":{"type":"object"}},"presupuesto":{"type":"object"}}}}}},"304":{"description":"Not modified (If-None-Match matched the ETag)."},"400":{"description":"Unsupported lang.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}},"/api/openapi.json":{"get":{"operationId":"getOpenApi","summary":"This document","responses":{"200":{"description":"The OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/presupuesto":{"post":{"operationId":"postPresupuesto","summary":"Request a quote on a person’s behalf","description":"Sends the person’s project brief to Julio.Works. Julio replies to the person’s email within 48 hours; the agent receives only the acknowledgement. One request per person and service every 24 hours; the body must be JSON (Content-Type: application/json) and under 16 KB.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nombre":{"type":"string","minLength":2,"maxLength":120,"description":"The person's name, as they gave it. Never derived from the email address or a placeholder."},"email":{"type":"string","format":"email","maxLength":254,"description":"The person's email address. Julio replies there within 48 hours; nothing is sent to the agent."},"telefono":{"type":"string","maxLength":30,"description":"The person's phone number, only if they offered it."},"servicio":{"type":"string","enum":["desarrollo-web","mantenimiento","software-a-medida","sin-determinar"],"description":"The service that fits the project: desarrollo-web (websites and online shops), mantenimiento (maintenance plans, hour bundles and fixed-price jobs), software-a-medida (custom software in weekly sprints) or sin-determinar when it is not clear yet."},"resumen":{"type":"string","minLength":10,"maxLength":2000,"description":"The project and its context in two or three sentences, written in Spanish or in English."},"alcance":{"type":"array","items":{"type":"string","maxLength":300},"maxItems":20,"description":"Concrete points of the scope, in Spanish or in English."},"restricciones":{"type":"array","items":{"type":"string","maxLength":300},"maxItems":20,"description":"Deadlines, integrations and other conditions, in Spanish or in English."},"orientacionPrecio":{"type":["object","null"],"description":"The price guidance already given to the person from the published offer, or null if none was given.","properties":{"tipo":{"type":"string","enum":["cerrado","horquilla"]},"precio":{"type":"number","description":"Only with tipo cerrado: a published fixed price, in euros without taxes."},"precioMin":{"type":"number","description":"Only with tipo horquilla: the lower bound, in euros without taxes."},"precioMax":{"type":"number","description":"Only with tipo horquilla: the upper bound, in euros without taxes."}}},"locale":{"type":"string","enum":["es","en"],"default":"es","description":"The language in which the person wants to be answered."},"agente":{"type":"string","minLength":2,"maxLength":80,"description":"The model or product sending the request on the person’s behalf, for example \"ChatGPT\" or \"Claude\"."},"consentimiento":{"type":"boolean","const":true,"description":"Must be true: the person has asked the agent to send their details to Julio.Works and knows the privacy policy (https://julio.works/en/privacy/)."}},"required":["nombre","email","servicio","resumen","alcance","restricciones","agente","consentimiento"]}}}},"responses":{"201":{"description":"Received. The message is in the language of `locale`.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"mensaje":{"type":"string"},"plazoRespuesta":{"type":"string"}}}}}},"400":{"description":"Invalid or incomplete brief; `errors` names each field.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"409":{"description":"A quote for this person and service was already received in the last 24 hours.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"413":{"description":"Body over 16 KB.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"415":{"description":"Content-Type is not application/json.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"429":{"description":"Too many requests; `Retry-After` says when to try again.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"502":{"description":"The request could not be delivered; try again later or use https://julio.works/en/contact/","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}}