{
  "openapi": "3.1.0",
  "info": {
    "title": "Shramko CV contact API",
    "version": "1.0.0",
    "summary": "Send a message to Andrii Shramko (engineer and filmmaker, Bydgoszcz, Poland) on behalf of a person.",
    "description": "One endpoint. Meant for AI assistants and scripts acting for a person, and used by the contact form of https://cv.flyreelstudio.eu. The message is delivered to Andrii, who replies personally to reply_to. Text sent here is treated as untrusted data and never executed. Rate limit: 3 requests per hour per client for agents. Page content for reading: https://cv.flyreelstudio.eu/llms.txt",
    "contact": {
      "name": "Andrii Shramko",
      "email": "zmei116@gmail.com",
      "url": "https://www.linkedin.com/in/andrii-shramko/"
    }
  },
  "servers": [
    {
      "url": "https://cv.flyreelstudio.eu"
    }
  ],
  "paths": {
    "/api/contact": {
      "post": {
        "operationId": "contactAndrii",
        "summary": "Send a contact request to Andrii Shramko",
        "description": "Required: reply_to (an e-mail address for agents; 400 without it) and message (agents). topic is one of the listed values (unknown values become 'other'). An AI agent must send 'agent'. Send the test header X-Shramko-Test: 1 while you develop: the request is stored and answered, but never forwarded to Andrii.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "agent",
                  "reply_to",
                  "message"
                ],
                "properties": {
                  "agent": {
                    "type": "string",
                    "maxLength": 80,
                    "description": "Name of the assistant or script that sends the request."
                  },
                  "on_behalf_of": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Name of the person you act for."
                  },
                  "topic": {
                    "type": "string",
                    "enum": [
                      "meeting",
                      "lesson",
                      "scan",
                      "film",
                      "event",
                      "research",
                      "other"
                    ]
                  },
                  "message": {
                    "type": "string",
                    "maxLength": 1500
                  },
                  "reply_to": {
                    "type": "string",
                    "format": "email",
                    "maxLength": 254,
                    "description": "Where Andrii should reply. Required."
                  },
                  "lang": {
                    "type": "string",
                    "enum": [
                      "pl",
                      "en",
                      "uk",
                      "ru"
                    ]
                  },
                  "audience": {
                    "type": "string",
                    "enum": [
                      "szkola",
                      "miasto",
                      "kultura",
                      "firma",
                      "media",
                      "badania",
                      "fpv"
                    ],
                    "description": "Who the person represents: school/university, city office, museum/culture, company/event, film/media/brand, research/robotics/AI, FPV pilots."
                  }
                }
              },
              "example": {
                "agent": "ExampleAssistant",
                "on_behalf_of": "Jan Kowalski",
                "topic": "meeting",
                "message": "Jan Kowalski, a school director in Bydgoszcz, asks for a call about a lesson on FPV drones.",
                "reply_to": "jan@example.com",
                "lang": "en",
                "audience": "szkola"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Accepted and stored.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "id": {
                      "type": "string"
                    },
                    "delivered": {
                      "type": "boolean"
                    },
                    "expected_reply": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Missing or invalid reply_to, or an empty message from an agent."
          },
          "413": {
            "description": "Body larger than 8 KB."
          },
          "429": {
            "description": "Rate limit: 3 requests per hour per client for agents."
          }
        },
        "parameters": [
          {
            "name": "X-Shramko-Test",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Test request: stored with test:true and answered, never forwarded to Andrii."
          }
        ]
      }
    }
  }
}
