{
  "openapi": "3.1.0",
  "info": {
    "title": "Estudio Paz & Asoc. — Public API",
    "version": "1.0.0",
    "summary": "Read-only facts about Estudio Paz & Asoc.: firm profile, services and offices.",
    "description": "A small, read-only API that exposes the same public facts about Estudio Paz & Asoc. (an Argentine accounting and business-law firm) that are published as JSON-LD across the website. It is intended for AI agents and directories that need the firm's identity, service catalogue and office list in a structured, machine-readable form.\n\nThere is no authentication: every endpoint is public and unauthenticated. All responses are JSON (`application/json`). Errors use the `Error` schema with a stable `error.code`, a human-readable `error.message` and, where useful, an `error.hint`.\n\nRate limit: requests are limited to 120 requests per minute per client IP. Every response carries `RateLimit-Policy` and `RateLimit` headers; a `429` response also carries `Retry-After`.",
    "contact": {
      "name": "Estudio Paz & Asoc.",
      "email": "info@estudiopaz.com.ar",
      "url": "https://estudiopaz.com.ar/contactenos/"
    },
    "license": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    }
  },
  "externalDocs": {
    "description": "Human-readable API documentation",
    "url": "https://estudiopaz.com.ar/api/"
  },
  "servers": [
    { "url": "https://estudiopaz.com.ar", "description": "Production" }
  ],
  "tags": [
    { "name": "firm", "description": "Firm identity and contact details" },
    { "name": "catalogue", "description": "Service catalogue and offices" }
  ],
  "paths": {
    "/api/estudio.json": {
      "get": {
        "operationId": "getFirmProfile",
        "summary": "Get the firm profile",
        "description": "Returns the identity of Estudio Paz & Asoc.: legal form, founding year, languages, area served, contact channels, registered office, opening hours, social profiles, and guidance on what the firm is and is not a good fit for.",
        "tags": ["firm"],
        "responses": {
          "200": {
            "description": "The firm profile.",
            "headers": {
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/FirmProfile" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "default": { "$ref": "#/components/responses/Error" }
        }
      }
    },
    "/api/servicios.json": {
      "get": {
        "operationId": "listServices",
        "summary": "List the firm's services",
        "description": "Returns the six service areas of Estudio Paz & Asoc. Each item has a stable `slug`, its Spanish and English name, the canonical page URL in each language, and a one-sentence summary in each language.",
        "tags": ["catalogue"],
        "responses": {
          "200": {
            "description": "The service catalogue.",
            "headers": {
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ServiceList" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "default": { "$ref": "#/components/responses/Error" }
        }
      }
    },
    "/api/sedes.json": {
      "get": {
        "operationId": "listOffices",
        "summary": "List the firm's offices",
        "description": "Returns the seven offices of Estudio Paz & Asoc. across Argentina (one headquarters in Vicente López, a main office in CABA, and five branches). Phone, WhatsApp and opening hours are shared by every office and returned once under `shared`.",
        "tags": ["catalogue"],
        "responses": {
          "200": {
            "description": "The office list.",
            "headers": {
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/OfficeList" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "default": { "$ref": "#/components/responses/Error" }
        }
      }
    }
  },
  "components": {
    "headers": {
      "RateLimit-Policy": {
        "description": "The quota policy in force, per RFC draft 'RateLimit header fields for HTTP'.",
        "schema": { "type": "string", "examples": ["\"default\";q=120;w=60"] }
      },
      "RateLimit": {
        "description": "The client's current quota state: remaining requests and seconds until the window resets.",
        "schema": { "type": "string", "examples": ["\"default\";r=119;t=60"] }
      },
      "Retry-After": {
        "description": "Seconds the client should wait before retrying.",
        "schema": { "type": "integer", "minimum": 0, "examples": [30] }
      }
    },
    "responses": {
      "TooManyRequests": {
        "description": "The client exceeded the rate limit of 120 requests per minute.",
        "headers": {
          "Retry-After": { "$ref": "#/components/headers/Retry-After" },
          "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
          "RateLimit": { "$ref": "#/components/headers/RateLimit" }
        },
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Error" },
            "example": {
              "error": {
                "code": "rate_limited",
                "message": "Rate limit exceeded: 120 requests per minute.",
                "hint": "Wait for the number of seconds in the Retry-After header, then retry."
              }
            }
          }
        }
      },
      "Error": {
        "description": "An error response.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Error" },
            "example": {
              "error": {
                "code": "not_found",
                "message": "No API resource at /api/foo.",
                "hint": "See https://estudiopaz.com.ar/openapi.json for the list of endpoints."
              }
            }
          }
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "description": "A structured error. `error.code` is a stable machine-readable token; `error.message` is human-readable; `error.hint` suggests how to resolve it.",
        "required": ["error"],
        "additionalProperties": false,
        "properties": {
          "error": {
            "type": "object",
            "required": ["code", "message"],
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string",
                "enum": ["not_found", "method_not_allowed", "rate_limited", "internal_error"]
              },
              "message": { "type": "string" },
              "hint": { "type": "string" }
            }
          }
        }
      },
      "Hours": {
        "type": "object",
        "description": "An opening-hours block: the days it applies to and the local open/close times (24h, America/Argentina/Buenos_Aires).",
        "required": ["days", "opens", "closes"],
        "additionalProperties": false,
        "properties": {
          "days": {
            "type": "array",
            "items": { "type": "string", "enum": ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"] },
            "minItems": 1
          },
          "opens": { "type": "string", "pattern": "^[0-2][0-9]:[0-5][0-9]$" },
          "closes": { "type": "string", "pattern": "^[0-2][0-9]:[0-5][0-9]$" }
        }
      },
      "Geo": {
        "type": "object",
        "description": "WGS-84 coordinates.",
        "required": ["lat", "lng"],
        "additionalProperties": false,
        "properties": {
          "lat": { "type": "number", "minimum": -90, "maximum": 90 },
          "lng": { "type": "number", "minimum": -180, "maximum": 180 }
        }
      },
      "FirmProfile": {
        "type": "object",
        "description": "The identity and contact details of Estudio Paz & Asoc.",
        "required": ["name", "type", "url", "languages", "area_served", "contact", "updated"],
        "additionalProperties": true,
        "properties": {
          "name": { "type": "string", "examples": ["Estudio Paz & Asoc."] },
          "type": { "type": "string", "description": "schema.org type.", "examples": ["AccountingService"] },
          "legal_form": { "type": "string", "examples": ["Estudio jurídico contable"] },
          "description_es": { "type": "string" },
          "description_en": { "type": "string" },
          "founded": { "type": "string", "pattern": "^[0-9]{4}$", "examples": ["2022"] },
          "founder": { "type": "string" },
          "url": { "type": "string", "format": "uri" },
          "url_en": { "type": "string", "format": "uri" },
          "client_portal": { "type": "string", "format": "uri" },
          "languages": { "type": "array", "items": { "type": "string", "examples": ["es", "en"] } },
          "area_served": { "type": "array", "items": { "type": "string", "examples": ["AR"] } },
          "timezone": { "type": "string", "examples": ["America/Argentina/Buenos_Aires"] },
          "contact": {
            "type": "object",
            "required": ["email", "phone"],
            "additionalProperties": false,
            "properties": {
              "email": { "type": "string", "format": "email" },
              "phone": { "type": "string", "examples": ["+541138487500"] },
              "whatsapp": { "type": "string", "format": "uri" },
              "hr_email": { "type": "string", "format": "email" },
              "intake_form": { "type": "string", "format": "uri" },
              "intake_form_en": { "type": "string", "format": "uri" }
            }
          },
          "registered_office": {
            "type": "object",
            "required": ["locality", "region", "country"],
            "additionalProperties": true,
            "properties": {
              "venue": { "type": "string" },
              "street": { "type": "string" },
              "locality": { "type": "string" },
              "region": { "type": "string" },
              "country": { "type": "string", "pattern": "^[A-Z]{2}$" },
              "geo": { "$ref": "#/components/schemas/Geo" },
              "map": { "type": "string", "format": "uri" }
            }
          },
          "hours": { "type": "array", "items": { "$ref": "#/components/schemas/Hours" } },
          "social": {
            "type": "object",
            "additionalProperties": { "type": "string", "format": "uri" }
          },
          "best_for": { "type": "array", "items": { "type": "string" }, "description": "Jobs the firm is a good fit for." },
          "not_for": { "type": "array", "items": { "type": "string" }, "description": "Jobs the firm is not the right resource for." },
          "endpoints": {
            "type": "object",
            "additionalProperties": { "type": "string", "format": "uri" }
          },
          "updated": { "type": "string", "format": "date" }
        }
      },
      "Service": {
        "type": "object",
        "required": ["slug", "name_es", "name_en", "url", "url_en"],
        "additionalProperties": false,
        "properties": {
          "slug": { "type": "string", "pattern": "^[a-z-]+$", "examples": ["impuestos"] },
          "name_es": { "type": "string" },
          "name_en": { "type": "string" },
          "url": { "type": "string", "format": "uri" },
          "url_en": { "type": "string", "format": "uri" },
          "summary_es": { "type": "string" },
          "summary_en": { "type": "string" }
        }
      },
      "ServiceList": {
        "type": "object",
        "required": ["count", "services", "updated"],
        "additionalProperties": false,
        "properties": {
          "count": { "type": "integer", "minimum": 0 },
          "index": { "type": "string", "format": "uri" },
          "index_en": { "type": "string", "format": "uri" },
          "services": { "type": "array", "items": { "$ref": "#/components/schemas/Service" } },
          "updated": { "type": "string", "format": "date" }
        }
      },
      "Office": {
        "type": "object",
        "required": ["city", "region", "country", "type", "location"],
        "additionalProperties": false,
        "properties": {
          "city": { "type": "string" },
          "region": { "type": "string" },
          "country": { "type": "string", "pattern": "^[A-Z]{2}$" },
          "type": {
            "type": "string",
            "enum": ["headquarters", "main_office", "branch"]
          },
          "location": { "type": "string", "description": "Venue / coworking name and neighbourhood." },
          "geo": { "$ref": "#/components/schemas/Geo" },
          "map": { "type": "string", "format": "uri" }
        }
      },
      "OfficeList": {
        "type": "object",
        "required": ["count", "shared", "offices", "updated"],
        "additionalProperties": false,
        "properties": {
          "count": { "type": "integer", "minimum": 0 },
          "index": { "type": "string", "format": "uri" },
          "index_en": { "type": "string", "format": "uri" },
          "shared": {
            "type": "object",
            "description": "Contact details and hours shared by every office.",
            "required": ["phone", "hours"],
            "additionalProperties": true,
            "properties": {
              "phone": { "type": "string" },
              "whatsapp": { "type": "string", "format": "uri" },
              "hours": { "type": "array", "items": { "$ref": "#/components/schemas/Hours" } },
              "note_es": { "type": "string" },
              "note_en": { "type": "string" }
            }
          },
          "offices": { "type": "array", "items": { "$ref": "#/components/schemas/Office" } },
          "updated": { "type": "string", "format": "date" }
        }
      }
    }
  }
}
