diff --git a/29_flask_calculator/main.py b/29_flask_calculator/main.py
new file mode 100644
index 0000000..6d28b2a
--- /dev/null
+++ b/29_flask_calculator/main.py
@@ -0,0 +1,83 @@
+# python -m venv .venv
+# .venv\scripts\activate
+# pip install flask
+
+from flask import Flask, jsonify
+
+app = Flask(__name__)
+
+@app.route("/")
+def index():
+ return """
+
+ - /secti/A/B
+ - /odecti/A/B
+ - /vynasob/A/B
+ - /vydel/A/B
+ - /mocnina/základ/exponent
+ - /pozdrav/JMÉNO
+
+ """
+
+@app.route("/secti//")
+def add(a,b):
+ vysledek = a+b
+ return jsonify({
+ "operace":"soucet",
+ "vstup":{"a":a,"b":b},
+ "vysledek":vysledek
+ })
+
+@app.route("/odecti//")
+def substrack(a,b):
+ vysledek = a-b
+ return jsonify({
+ "operace":"rozdíl",
+ "vstup":{"a":a,"b":b},
+ "vysledek":vysledek
+ })
+
+@app.route("/vynasob//")
+def multiply(a,b):
+ vysledek = a*b
+ return jsonify({
+ "operace":"násobení",
+ "vstup":{"a":a,"b":b},
+ "vysledek":vysledek
+ })
+
+@app.route("/vydel//")
+def divide(a,b):
+ if b == 0:
+ return jsonify({
+ "operace":"rozdil",
+ "vstup":{"a":a,"b":b},
+ "chyba": "Dělení nulou není povoleno!"
+ }), 400 #400 Bad Request
+ vysledek = a/b
+ return jsonify({
+ "operace":"rozdil",
+ "vstup":{"a":a,"b":b},
+ "vysledek":vysledek
+ })
+
+
+@app.route("/mocnina//")
+def power(zaklad,exponent):
+ vysledek = zaklad ** exponent
+ return jsonify({
+ "operace":"mocnina",
+ "zaklad": zaklad,
+ "exponent":exponent,
+ "vysledek":vysledek
+ })
+
+
+
+@app.route("/pozdrav/")
+def pozdrav(jmeno):
+ return f"Ahoj {jmeno}"
+
+if __name__ == "__main__":
+ print("Server běží na http://localhost:80")
+ app.run(host="0.0.0.0", port=80, debug=True)
\ No newline at end of file
diff --git a/30_api_heroes/main.py b/30_api_heroes/main.py
new file mode 100644
index 0000000..c869a54
--- /dev/null
+++ b/30_api_heroes/main.py
@@ -0,0 +1,65 @@
+from flask import Flask, jsonify
+import random
+
+app = Flask(__name__)
+
+# AltGR + F|G = [|]
+hrdinove = [
+ #{"jmeno":"","rasa":"","hp":100,"level":10},
+ {"jmeno":"Aragorn","rasa":"clovek","hp":100,"level":20},
+ {"jmeno":"Legolas","rasa":"elf","hp":80,"level":18},
+ {"jmeno":"Gimli","rasa":"trpaslik","hp":130,"level":21},
+ {"jmeno":"Frodo","rasa":"hobbit","hp":40,"level":5},
+ {"jmeno":"Gandalf","rasa":"clovek","hp":150,"level":50},
+ {"jmeno":"Sauron","rasa":"demon","hp":500,"level":100},
+]
+
+@app.route("/")
+def index():
+ """Hlavní stránka s rozcestníkem (HTML pro snadné klikání)"""
+ return """
+ RPG Heroes API Server
+
+ - Všichni hrdninové: /api/heroes
+ - Nahodný hrdina: /api/heores/random
+ - Konkrétní hrdina: /api/heroes/ČÍSLO
+ - filtrovat podle rasy (např.elf): /api/heroes/filter/elf
+
+ """
+
+@app.route("/api/heroes")
+def get_all_heroes():
+ """Vrátí celý seznam hrdinů jako JSON"""
+ return jsonify(hrdinove)
+
+@app.route("/api/heroes/random")
+def get_random_hero():
+ """Vrátí náhodného hrdinu jako JSON"""
+ nahodny = random.choice(hrdinove)
+ return jsonify(nahodny)
+
+@app.route("/api/heroes/")
+def get_hero_by_id(hero_id):
+ """Vrátí hrdinu podle jeho indexu v seznamu v poli(array)"""
+ if 0 <= hero_id < len(hrdinove):
+ return jsonify(hrdinove[hero_id])
+ else:
+ return jsonify({"chyba":"Hrdina s tímto ID neexistuje"}), 404
+
+@app.route("/api/heroes/filter/")
+def filter_heores_by_race(rasa):
+ """Vrátí hrdiny, kteří odpovídají zadané rase"""
+ vysledek = []
+ for hrdina in hrdinove:
+ if hrdina["rasa"].lower() == rasa.lower():
+ vysledek.append(hrdina)
+ if not vysledek:
+ return jsonify({"chyba":f"Žádný hrdina rasy '{rasa}'!"})
+ return jsonify(vysledek)
+
+
+if __name__ == "__main__":
+ print("--- HERO API SERVER NASTARTOVÁN ---")
+ print("Server běží na http://localhost:80")
+ print("Vypnout server -> Ctrl + C")
+ app.run(host="0.0.0.0",port=80,debug=True)
\ No newline at end of file