diff --git a/measurer/views/measurer.py b/measurer/views/measurer.py
index f14734ed7619527951200e1c106d2f6c4c9af876..5f648fa553dfd68523f422ca702e53b9b60844f3 100644
--- a/measurer/views/measurer.py
+++ b/measurer/views/measurer.py
@@ -45,6 +45,34 @@ def add_vote() -> typing.Union[flask.Response, int]:
 	return flask.jsonify(None), http.client.NO_CONTENT
 
 
+@measurer_blueprint.route("/", methods=["DELETE"])
+@validators.validate_json({
+	"point": {
+		"type": "string",
+		"allowed": flask.current_app.config["POINTS"],
+		"nullable": False
+	}
+})
+def delete_vote() -> typing.Union[flask.Response, int]:
+	vote = flask.g.sa_session.execute(
+		sqlalchemy.select(database.Vote).
+		where(
+			sqlalchemy.and_(
+				database.Vote.point == flask.g.json["point"],
+				database.Vote.identifier == utils.get_ip_hash()
+			)
+		)
+	).scalars().one_or_none()
+
+	if vote is None:
+		raise werkzeug.exceptions.NotFound
+
+	flask.g.sa_session.delete(vote)
+	flask.g.sa_session.commit()
+
+	return flask.jsonify(None), http.client.NO_CONTENT
+
+
 @measurer_blueprint.route("/", methods=["GET"])
 def list_votes() -> typing.Union[flask.Response, int]:
 	votes = flask.g.sa_session.execute(