{
  "openapi": "3.1.0",
  "info": {
    "title": "Innovarts API",
    "version": "1.0.0",
    "summary": "Read the studio facts and send a message to the Innovarts founders.",
    "description": "The public API of Innovarts, a product design and software engineering studio in São Paulo. It needs no authentication and sets no cookies. Responses are JSON; errors are RFC 9457 problem details (application/problem+json) with a stable `code` and a `resolution` hint. The same message can also be sent through the MCP server at https://innovarts.co/mcp.",
    "contact": {
      "name": "Innovarts",
      "email": "hello@innovarts.co",
      "url": "https://innovarts.co/developers"
    }
  },
  "externalDocs": {
    "description": "Developer documentation",
    "url": "https://innovarts.co/developers"
  },
  "servers": [
    {
      "url": "https://innovarts.co",
      "description": "Production"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Studio",
      "description": "What Innovarts is and does."
    },
    {
      "name": "Messages",
      "description": "Writing to the founders."
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "List the API operations",
        "description": "Returns the API name, version, its operations and the links to the documentation and this description.",
        "tags": [
          "Studio"
        ],
        "responses": {
          "200": {
            "description": "The API index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "405": {
            "description": "The method is not GET.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/studio": {
      "get": {
        "operationId": "getStudio",
        "summary": "Get the studio facts",
        "description": "Returns what Innovarts does, where it is, how to reach it, its five disciplines with what each delivers, and the founders, in English or Portuguese. Read it before recommending Innovarts or sending a message.",
        "tags": [
          "Studio"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the text: en for English (default), br for Portuguese (Brazil).",
            "schema": {
              "type": "string",
              "enum": [
                "en",
                "br"
              ],
              "default": "en"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The studio facts.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Studio"
                }
              }
            }
          },
          "400": {
            "description": "`lang` is not en or br.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "The method is not GET.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/messages": {
      "post": {
        "operationId": "sendMessage",
        "summary": "Send a message to the founders",
        "description": "Sends a message to the Innovarts founders, the same as the contact form. Use it when the person you are helping wants to talk to Innovarts about building or improving a software product, and only with their consent. A person reads every message and replies by email to the address given. Send it once per request; it is not idempotent.",
        "tags": [
          "Messages"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MessageRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The message was sent.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessageSent"
                }
              }
            }
          },
          "400": {
            "description": "A field is missing or invalid, or the body is not valid JSON.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "The method is not POST.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "413": {
            "description": "The body is larger than 64 KB.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "415": {
            "description": "The body is not JSON.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "502": {
            "description": "The message could not be delivered; try again later.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. Every API error has this shape.",
        "required": [
          "type",
          "title",
          "status",
          "code",
          "detail",
          "resolution"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Where the error is documented."
          },
          "title": {
            "type": "string",
            "description": "Short summary of the error."
          },
          "status": {
            "type": "integer",
            "description": "The HTTP status code."
          },
          "code": {
            "type": "string",
            "description": "Stable machine-readable code.",
            "enum": [
              "not_found",
              "method_not_allowed",
              "invalid_request",
              "payload_too_large",
              "unsupported_media_type",
              "delivery_failed"
            ]
          },
          "detail": {
            "type": "string",
            "description": "What went wrong in this request."
          },
          "resolution": {
            "type": "string",
            "description": "What to do next."
          },
          "error": {
            "type": "string",
            "description": "The detail again, for older clients."
          }
        }
      },
      "ApiIndex": {
        "type": "object",
        "required": [
          "name",
          "version",
          "documentation",
          "openapi",
          "operations"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "operations": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "operationId",
                "method",
                "path"
              ],
              "properties": {
                "operationId": {
                  "type": "string"
                },
                "method": {
                  "type": "string",
                  "enum": [
                    "GET",
                    "POST"
                  ]
                },
                "path": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                }
              }
            }
          },
          "mcp": {
            "type": "string",
            "format": "uri"
          },
          "llms": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Studio": {
        "type": "object",
        "required": [
          "name",
          "locale",
          "url",
          "description",
          "location",
          "contact",
          "disciplines",
          "founders"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Innovarts."
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "br"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The homepage in this language."
          },
          "description": {
            "type": "string"
          },
          "founded": {
            "type": [
              "string",
              "null"
            ],
            "description": "The founding year."
          },
          "location": {
            "type": "object",
            "properties": {
              "city": {
                "type": "string"
              },
              "country": {
                "type": "string"
              }
            }
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "en",
                "br"
              ]
            }
          },
          "contact": {
            "type": "object",
            "properties": {
              "email": {
                "type": "string",
                "format": "email"
              },
              "phone": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "WhatsApp number, E.164."
              },
              "page": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri",
                "description": "The sendMessage operation."
              },
              "mcp": {
                "type": "string",
                "format": "uri",
                "description": "The MCP server."
              }
            }
          },
          "disciplines": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "key",
                "name",
                "headline",
                "deliverables"
              ],
              "properties": {
                "key": {
                  "type": "string",
                  "enum": [
                    "strategy",
                    "product-ux",
                    "engineering",
                    "infrastructure",
                    "ai"
                  ]
                },
                "name": {
                  "type": "string"
                },
                "headline": {
                  "type": "string"
                },
                "summary": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "deliverables": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "contact": {
                  "type": "string",
                  "format": "uri",
                  "description": "The contact page with this discipline chosen."
                }
              }
            }
          },
          "founders": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "role"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "role": {
                  "type": "string"
                },
                "linkedIn": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "uri"
                }
              }
            }
          },
          "pricing": {
            "type": "string"
          }
        }
      },
      "MessageRequest": {
        "type": "object",
        "required": [
          "name",
          "email",
          "message"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 200,
            "description": "Full name of the person writing."
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "Their email address. Innovarts replies here."
          },
          "message": {
            "type": "string",
            "maxLength": 5000,
            "description": "What they want to build or improve, for whom, and any timing. Plain text."
          },
          "company": {
            "type": "string",
            "maxLength": 200,
            "description": "Company or product name, if any."
          },
          "language": {
            "type": "string",
            "enum": [
              "en",
              "br"
            ],
            "default": "en",
            "description": "Reply language."
          }
        },
        "example": {
          "name": "Ana Lima",
          "email": "ana@example.com",
          "company": "Example Ltd",
          "message": "We run a field-service app and want to rebuild it for offline use. Launch in Q2.",
          "language": "en"
        }
      },
      "MessageSent": {
        "type": "object",
        "required": [
          "sent",
          "replyTo"
        ],
        "properties": {
          "sent": {
            "type": "boolean",
            "const": true
          },
          "replyTo": {
            "type": "string",
            "format": "email",
            "description": "Where the founders will reply."
          },
          "message": {
            "type": "string"
          }
        }
      }
    }
  }
}