diff --git a/controllers/gdd_controller.go b/controllers/gdd_controller.go
index d482652ef7de9dc792c12941332b3b472e3e330e..4d209ff98a4d59ccf743226b9d9b4f943c7a41bb 100644
--- a/controllers/gdd_controller.go
+++ b/controllers/gdd_controller.go
@@ -46,6 +46,6 @@ func GetDailyGdd(c *fiber.Ctx) error {
 // @Param accumulate query boolean true "Accumulate gdd values"
 // @Router /gdd/normals [get]
 func GetNormalGdd(c *fiber.Ctx) error {
-	request := models.BuildGddRequest(c)
+	request := models.BuildYearlessGddRequest(c)
 	return c.Status(fiber.StatusOK).JSON(services.GetNormalValues(request))
 }
diff --git a/controllers/nomads_controller.go b/controllers/nomads_controller.go
index e79592543d4d4d5684a9580feb3f3e8213a093f4..c9f83002b3da0b64e259ffe8e118369500d4fc04 100644
--- a/controllers/nomads_controller.go
+++ b/controllers/nomads_controller.go
@@ -23,7 +23,7 @@ import (
 // @Param accumulate query boolean true "Accumulate gdd values"
 // @Router /gdd/gefs [get]
 func GetGefsGDD(c *fiber.Ctx) error {
-	request := models.BuildGddRequest(c)
+	request := models.BuildYearlessGddRequest(c)
 	return c.Status(fiber.StatusOK).JSON(services.GetGefsGddValues(request))
 }
 
@@ -41,7 +41,7 @@ func GetGefsGDD(c *fiber.Ctx) error {
 // @Param accumulate query boolean true "Accumulate gdd values"
 // @Router /gdd/cfs [get]
 func GetCfsGDD(c *fiber.Ctx) error {
-	request := models.BuildGddRequest(c)
+	request := models.BuildYearlessGddRequest(c)
 	return c.Status(fiber.StatusOK).JSON(services.GetCfsGddValues(request))
 }
 
diff --git a/models/gdd.go b/models/gdd.go
index 1b4f537f2f0715bc4f98d0b5ac591902266efbec..6bd4cc7127fe06a8a3c86650f2b67c1f1563988d 100644
--- a/models/gdd.go
+++ b/models/gdd.go
@@ -9,6 +9,7 @@ import (
 
 	validation "github.com/go-ozzo/ozzo-validation"
 	"github.com/gofiber/fiber/v2"
+	"github.com/tgs266/dawn-go-common/errors"
 )
 
 type GddResponse struct {
@@ -54,6 +55,23 @@ var BuildGddRequest = func(c *fiber.Ctx) GddRequest {
 	accumulate, errBool := strconv.ParseBool(c.Query("accumulate", "false"))
 	plantingDate, errDate := time.Parse(time.RFC3339, pd)
 
+	if errLat != nil || errLon != nil || errBool != nil {
+		panic(config.BAD_REQUEST)
+	}
+
+	if errYear != nil && errDate != nil {
+		panic(errors.NewBadRequest(nil).PutDetail("reason", "no date or year provided"))
+	}
+
+	// date is provided but year isnt
+	if errYear != nil && errDate == nil {
+		year = plantingDate.Year()
+	}
+
+	if errDate != nil && pd != "" {
+		panic(errors.NewBadRequest(nil).PutDetail("reason", "date must be ISO8601 or RFC3339 format"))
+	}
+
 	rNew := GddRequest{
 		Year:         year,
 		Product:      product,
@@ -63,22 +81,31 @@ var BuildGddRequest = func(c *fiber.Ctx) GddRequest {
 		PlantingDate: plantingDate,
 	}
 
-	if errYear != nil || errLat != nil || errLon != nil || errBool != nil {
+	if e := rNew.Validate(); e != nil {
+		panic(errors.NewBadRequest(e).AddLogDetails(e.Error()))
+	}
+	return rNew
+}
+
+var BuildYearlessGddRequest = func(c *fiber.Ctx) GddRequest {
+	product := c.Query("product")
+	latitude, errLat := strconv.ParseFloat(c.Query("latitude"), 64)
+	longitude, errLon := strconv.ParseFloat(c.Query("longitude"), 64)
+	accumulate, errBool := strconv.ParseBool(c.Query("accumulate", "false"))
+
+	if errLat != nil || errLon != nil || errBool != nil {
 		panic(config.BAD_REQUEST)
 	}
 
-	if errDate != nil && pd != "" {
-		panic(config.BAD_REQUEST.PutDetail("reason", "date must be ISO8601 or RFC3339 format"))
+	rNew := GddRequest{
+		Product:    product,
+		Latitude:   latitude,
+		Longitude:  longitude,
+		Accumulate: accumulate,
 	}
 
-	if rNew.Year != 0 {
-		if e := rNew.Validate(); e != nil {
-			panic(config.BAD_REQUEST.AddLogDetails(e.Error()))
-		}
-	} else {
-		if e := rNew.ValidateNoYear(); e != nil {
-			panic(config.BAD_REQUEST.AddLogDetails(e.Error()))
-		}
+	if e := rNew.ValidateNoYear(); e != nil {
+		panic(errors.NewBadRequest(e).AddLogDetails(e.Error()))
 	}
 	return rNew
 }