{
  "openapi": "3.1.0",
  "info": {
    "title": "IURCO public API",
    "version": "1.0.0",
    "summary": "Read-only public information about IURCO: services, products, contact and full-text search of the site.",
    "description": "Same data as the IURCO MCP server (https://iurco.com/mcp), over plain HTTP for clients that do not speak MCP and for LLM function calling. No authentication. All errors are JSON objects with code, message and hint. Versioning and deprecation policy: versions live under their own path (/api/v1); a new major version coexists with the previous one for at least 6 months, and a deprecated version announces its retirement with the Deprecation and Sunset response headers (RFC 9745 / RFC 8594) and a Link rel=\"successor-version\" header. Nothing is deprecated today. See https://iurco.com/developers#versioning.",
    "contact": {
      "name": "IURCO",
      "email": "info@iurco.com",
      "url": "https://iurco.com/developers"
    },
    "license": {
      "name": "Public data \u2014 no license required for use",
      "identifier": "CC0-1.0"
    },
    "x-versioning-policy": {
      "scheme": "URL path (/api/v1). A new major version gets a new path and coexists with the previous one for at least 6 months.",
      "deprecation": "A deprecated version answers with `Deprecation: true` and `Sunset: <date>` headers (RFC 9745 / RFC 8594) and a `Link rel=\"successor-version\"` to the new one. Changes are announced at https://iurco.com/developers#versioning.",
      "current": "1.0.0",
      "deprecated": [],
      "sunset": null,
      "policyUrl": "https://iurco.com/developers#versioning"
    },
    "x-rate-limit": {
      "limit": 120,
      "window": "60s",
      "scope": "per IP",
      "headers": [
        "RateLimit-Limit",
        "RateLimit-Remaining",
        "RateLimit-Reset",
        "RateLimit-Policy",
        "X-RateLimit-Limit",
        "X-RateLimit-Remaining",
        "X-RateLimit-Reset"
      ],
      "exceeded": "429 with JSON error (code rate_limited) and Retry-After"
    }
  },
  "servers": [
    {
      "url": "https://iurco.com/api/v1",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Developer portal (MCP server, llms.txt, discovery files)",
    "url": "https://iurco.com/developers"
  },
  "tags": [
    {
      "name": "company",
      "description": "What IURCO offers and how to reach it"
    },
    {
      "name": "search",
      "description": "Search the public site"
    }
  ],
  "paths": {
    "/services": {
      "get": {
        "operationId": "listServices",
        "tags": [
          "company"
        ],
        "summary": "List IURCO services",
        "description": "The services IURCO offers (ecommerce, custom software, AI & automation, UX/UI, SEO, social media, paid media), each with a description. Use it to know whether IURCO does what the user needs.",
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the descriptions.",
            "schema": {
              "type": "string",
              "enum": [
                "en",
                "es"
              ],
              "default": "en"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Services",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServicesResponse"
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            }
          },
          "400": {
            "description": "Invalid parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "deprecated": false
      }
    },
    "/products": {
      "get": {
        "operationId": "listProducts",
        "tags": [
          "company"
        ],
        "summary": "List IURCO products",
        "description": "IURCO's own products: commerce platforms (Pampa, Ceibo), monitoring (El Centinela), integration hub (Andes HUB), private AI engine (Neurus), Posta POS, Estiba WMS, Iurco CRM.",
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the descriptions.",
            "schema": {
              "type": "string",
              "enum": [
                "en",
                "es"
              ],
              "default": "en"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Products",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductsResponse"
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            }
          },
          "400": {
            "description": "Invalid parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "deprecated": false
      }
    },
    "/contact": {
      "get": {
        "operationId": "getContactInfo",
        "tags": [
          "company"
        ],
        "summary": "How to contact IURCO",
        "description": "Email, contact form URL per language, location, languages spoken, social profiles and technology partners. Use it when the user wants to hire or talk to IURCO.",
        "responses": {
          "200": {
            "description": "Contact information",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contact"
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "deprecated": false
      }
    },
    "/search": {
      "get": {
        "operationId": "searchSite",
        "tags": [
          "search"
        ],
        "summary": "Full-text search of iurco.com",
        "description": "Searches the markdown mirror of the site (services, products, pages, contact) and returns the paragraphs that mention the query with the heading they belong to.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Words to look for (case-insensitive, at least 2 characters).",
            "schema": {
              "type": "string",
              "minLength": 2
            },
            "example": "magento"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of paragraphs.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 5
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Search results",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponse"
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            }
          },
          "400": {
            "description": "Missing or invalid parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message",
              "status"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "not_found",
                  "invalid_parameter",
                  "method_not_allowed",
                  "internal_error"
                ]
              },
              "message": {
                "type": "string"
              },
              "hint": {
                "type": "string",
                "description": "How to fix the request."
              },
              "status": {
                "type": "integer"
              }
            }
          }
        }
      },
      "Service": {
        "type": "object",
        "required": [
          "id",
          "title",
          "description"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "ecommerce"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "ServicesResponse": {
        "type": "object",
        "required": [
          "lang",
          "services"
        ],
        "properties": {
          "lang": {
            "type": "string",
            "enum": [
              "en",
              "es"
            ]
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Service"
            }
          }
        }
      },
      "Product": {
        "type": "object",
        "required": [
          "id",
          "title",
          "description"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "pampa"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "ProductsResponse": {
        "type": "object",
        "required": [
          "lang",
          "products"
        ],
        "properties": {
          "lang": {
            "type": "string",
            "enum": [
              "en",
              "es"
            ]
          },
          "products": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Product"
            }
          }
        }
      },
      "Contact": {
        "type": "object",
        "required": [
          "email",
          "form",
          "location"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "form": {
            "type": "object",
            "properties": {
              "es": {
                "type": "string",
                "format": "uri"
              },
              "en": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "location": {
            "type": "string"
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "social": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "partners": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "SearchResponse": {
        "type": "object",
        "required": [
          "query",
          "results"
        ],
        "properties": {
          "query": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "heading",
                "paragraph"
              ],
              "properties": {
                "heading": {
                  "type": "string"
                },
                "paragraph": {
                  "type": "string"
                }
              }
            }
          },
          "source": {
            "type": "string",
            "format": "uri"
          }
        }
      }
    },
    "headers": {
      "RateLimit-Limit": {
        "description": "Requests allowed per window (per IP).",
        "schema": {
          "type": "integer",
          "example": 120
        }
      },
      "RateLimit-Remaining": {
        "description": "Requests left in the current window.",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimit-Reset": {
        "description": "Seconds until the window resets.",
        "schema": {
          "type": "integer"
        }
      },
      "API-Version": {
        "description": "Version of the API that produced the response.",
        "schema": {
          "type": "string",
          "example": "1.0.0"
        }
      },
      "Retry-After": {
        "description": "Seconds to wait before retrying (only on 429).",
        "schema": {
          "type": "integer"
        }
      }
    },
    "responses": {
      "RateLimited": {
        "description": "Too many requests",
        "headers": {
          "RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimit-Limit"
          },
          "RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimit-Remaining"
          },
          "RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimit-Reset"
          },
          "API-Version": {
            "$ref": "#/components/headers/API-Version"
          },
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    }
  }
}
