{
  "openapi": "3.1.0",
  "info": {
    "title": "Daniil Kutsyna profile API",
    "version": "1.0.0",
    "summary": "Read-only public profile of Daniil Kutsyna, Applied AI and product engineer.",
    "description": "Read-only JSON API. No authentication and no sign-up. Rate limit: 120 requests per minute per IP, reported in the RateLimit headers.\n\nVersioning: the version is in the path (/api/v1). Within v1 fields are only added. A breaking change ships as /api/v2, and v1 then keeps running for at least 90 days while sending Deprecation (RFC 9745) and Sunset (RFC 8594) headers.\n\nDocs: https://daniilkutsyna.com/developers",
    "contact": {
      "name": "Daniil Kutsyna",
      "email": "daniil.kutsyna@gmail.com",
      "url": "https://daniilkutsyna.com/developers"
    },
    "x-api-lifecycle": {
      "status": "stable",
      "versioning": "url-path",
      "deprecationPolicy": "90 days notice via Deprecation and Sunset headers"
    }
  },
  "externalDocs": {
    "description": "Developer docs",
    "url": "https://daniilkutsyna.com/developers"
  },
  "servers": [
    {
      "url": "https://daniilkutsyna.com/api/v1",
      "description": "Production (read-only, safe to test against)"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "profile",
      "description": "Who Daniil is and what he is open to"
    },
    {
      "name": "roles",
      "description": "Work history"
    },
    {
      "name": "contact",
      "description": "How to reach him"
    }
  ],
  "paths": {
    "/profile": {
      "get": {
        "operationId": "getProfile",
        "tags": [
          "profile"
        ],
        "summary": "Get the profile",
        "description": "Returns the pitch, the roles Daniil is open to and a great match for, proof, focus areas, current role, education and skills.",
        "responses": {
          "200": {
            "description": "The profile",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Profile"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/roles": {
      "get": {
        "operationId": "listRoles",
        "tags": [
          "roles"
        ],
        "summary": "List roles in the work history",
        "description": "Returns roles newest first, cursor-paginated. Use q to filter by company, title, technology or industry.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Keyword filter, e.g. fintech, founding, Claude.",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Page size.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 5
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from pagination.next_cursor of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of roles",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoleList"
                }
              }
            }
          },
          "400": {
            "description": "Invalid parameter or cursor",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/roles/{slug}": {
      "get": {
        "operationId": "getRole",
        "tags": [
          "roles"
        ],
        "summary": "Get one role",
        "description": "Returns one role from the work history by its slug.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Role slug from listRoles, e.g. nettle-founding-engineer.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]{1,120}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The role",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Role"
                }
              }
            }
          },
          "404": {
            "description": "No such endpoint or role",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/contact": {
      "get": {
        "operationId": "getContact",
        "tags": [
          "contact"
        ],
        "summary": "Get contact details",
        "description": "Returns the email address and profile links. Email is the preferred channel.",
        "responses": {
          "200": {
            "description": "Contact details",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contact"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Any other error",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "API-Version": {
                "$ref": "#/components/headers/API-Version"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "headers": {
      "RateLimit": {
        "description": "Remaining quota and seconds to reset, e.g. \"default\";r=119;t=42",
        "schema": {
          "type": "string"
        }
      },
      "RateLimit-Policy": {
        "description": "Quota policy, e.g. \"default\";q=120;w=60",
        "schema": {
          "type": "string"
        }
      },
      "API-Version": {
        "description": "API version that served the response.",
        "schema": {
          "type": "string",
          "example": "v1"
        }
      },
      "Retry-After": {
        "description": "Seconds to wait before retrying.",
        "schema": {
          "type": "integer"
        }
      },
      "Deprecation": {
        "description": "Sent once this version is deprecated (RFC 9745).",
        "schema": {
          "type": "string"
        }
      },
      "Sunset": {
        "description": "Date this version stops being served (RFC 8594).",
        "schema": {
          "type": "string"
        }
      }
    },
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details",
        "required": [
          "type",
          "title",
          "status",
          "code"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "URI identifying the error type"
          },
          "title": {
            "type": "string",
            "description": "Short summary"
          },
          "status": {
            "type": "integer",
            "description": "HTTP status"
          },
          "code": {
            "type": "string",
            "description": "Machine-readable code",
            "enum": [
              "invalid_parameter",
              "invalid_cursor",
              "not_found",
              "role_not_found",
              "method_not_allowed",
              "rate_limited",
              "internal_error"
            ]
          },
          "detail": {
            "type": "string",
            "description": "What went wrong"
          },
          "hint": {
            "type": "string",
            "description": "How to fix it"
          },
          "instance": {
            "type": "string",
            "description": "Request path"
          }
        }
      },
      "Role": {
        "type": "object",
        "required": [
          "slug",
          "company",
          "title",
          "start",
          "current"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Stable identifier"
          },
          "company": {
            "type": "string"
          },
          "title": {
            "type": "string",
            "description": "Job title"
          },
          "start": {
            "type": "string",
            "description": "YYYY-MM"
          },
          "end": {
            "type": [
              "string",
              "null"
            ],
            "description": "YYYY-MM, null for the current role"
          },
          "current": {
            "type": "boolean"
          },
          "about_company": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the company is"
          },
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "Industry"
          },
          "summary": {
            "type": [
              "string",
              "null"
            ],
            "description": "One-line summary"
          },
          "highlights": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "What he did"
          },
          "stack": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Technology used"
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company website"
          }
        }
      },
      "RoleList": {
        "type": "object",
        "required": [
          "data",
          "pagination"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Role"
            }
          },
          "pagination": {
            "type": "object",
            "required": [
              "limit",
              "has_more",
              "next_cursor"
            ],
            "properties": {
              "limit": {
                "type": "integer"
              },
              "has_more": {
                "type": "boolean"
              },
              "next_cursor": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Pass as cursor to get the next page; null on the last page"
              },
              "total": {
                "type": "integer",
                "description": "Roles matching the filter"
              }
            }
          }
        }
      },
      "Profile": {
        "type": "object",
        "required": [
          "name",
          "headline",
          "pitch",
          "open_to"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "headline": {
            "type": "string"
          },
          "location": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "pitch": {
            "type": "string",
            "description": "One-paragraph pitch"
          },
          "open_to": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Roles he is open to"
          },
          "great_match_for": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Kinds of role and company he fits best"
          },
          "proof": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Evidence from the track record"
          },
          "strengths": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "What he brings beyond code: product, design, domain, adoption"
          },
          "focus": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Current areas of interest"
          },
          "case_studies": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "company": {
                  "type": "string"
                },
                "role": {
                  "type": "string"
                },
                "when": {
                  "type": "string"
                },
                "problem": {
                  "type": "string"
                },
                "built": {
                  "type": "string"
                },
                "result": {
                  "type": "string"
                },
                "stack": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            },
            "description": "Selected work: problem, what was built, result"
          },
          "verify": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "How to check the claims"
          },
          "current_role": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Role"
              },
              {
                "type": "null"
              }
            ]
          },
          "education": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "institution": {
                  "type": "string"
                },
                "area": {
                  "type": "string"
                },
                "studyType": {
                  "type": "string"
                },
                "startDate": {
                  "type": "string"
                },
                "endDate": {
                  "type": "string"
                }
              }
            }
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "keywords": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "website": {
            "type": "string"
          }
        }
      },
      "Contact": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string"
          },
          "preferred": {
            "type": "string",
            "description": "Preferred channel"
          },
          "open_to": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "linkedin": {
            "type": "string"
          },
          "github": {
            "type": "string"
          }
        }
      }
    }
  }
}
