diff --git a/api.go b/api.go
new file mode 100644
index 0000000..50d340f
--- /dev/null
+++ b/api.go
@@ -0,0 +1,62 @@
+package apidQuota
+
+import (
+	"encoding/json"
+	"github.com/30x/apid-core"
+	"github.com/30x/apidQuota/quotaBucket"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+)
+
+func InitAPI(services apid.Services) {
+	Log.Debug("initialized API's exposed by apidQuota plugin")
+	quotaBasePath := Config.GetString(ConfigQuotaBasePath)
+	services.API().HandleFunc(quotaBasePath, getAllQuotaValues).Methods("GET") //yet to implement.
+	services.API().HandleFunc(quotaBasePath+"/{quotaItentifier}", incrementAndCheckQuotaLimit).Methods("POST")
+
+}
+
+func getAllQuotaValues(res http.ResponseWriter, req *http.Request) {
+	stringbytes := []byte("yet to implement")
+	res.Header().Set("Content-Type", "application/json")
+	res.WriteHeader(http.StatusOK)
+	res.Write(stringbytes)
+
+}
+
+func incrementAndCheckQuotaLimit(res http.ResponseWriter, req *http.Request) {
+
+	bodyBytes, err := ioutil.ReadAll(req.Body)
+	defer req.Body.Close()
+	if err != nil {
+		WriteErrorResponse(http.StatusBadRequest, UnableToParseBody, "unable to read request body: "+err.Error(), res, req)
+		return
+	}
+
+	quotaBucketMap := make(map[string]interface{}, 0)
+	if err := json.Unmarshal(bodyBytes, &quotaBucketMap); err != nil {
+		WriteErrorResponse(http.StatusBadRequest, UnMarshalJSONError, "unable to convert request body to an object: "+err.Error(), res, req)
+		return
+	}
+	Log.Println("quotaBucketMap from request: ", quotaBucketMap)
+
+	// parse the request body into the Event struct
+	qBucket := new(quotaBucket.QuotaBucket)
+	if err = qBucket.FromAPIRequest(quotaBucketMap); err != nil {
+		WriteErrorResponse(http.StatusBadRequest, ErrorConvertReqBodyToEntity, err.Error(), res, req)
+		return
+	}
+
+	quotaCount, err := qBucket.GetQuotaCount()
+	if err != nil {
+		WriteErrorResponse(http.StatusBadRequest, UnMarshalJSONError, "error retrieving count for the give identifier "+err.Error(), res, req)
+		return
+	}
+
+	stringbytes := []byte(strconv.Itoa(quotaCount))
+	res.Header().Set("Content-Type", "application/json")
+	res.WriteHeader(http.StatusOK)
+	res.Write(stringbytes)
+
+}
diff --git a/constants.go b/constants.go
new file mode 100644
index 0000000..588b808
--- /dev/null
+++ b/constants.go
@@ -0,0 +1,9 @@
+package apidQuota
+
+const (
+	UnableToParseBody           = "unable_to_parse_body"
+	UnMarshalJSONError          = "unmarshal_json_error"
+	ErrorConvertReqBodyToEntity = "error_convert_reqBody_to_entity"
+	ConfigQuotaBasePath         = "quota_base_path"
+	quotaBasePathDefault        = "/quota"
+)
diff --git a/init.go b/init.go
index 7ec68f9..93e1c1b 100644
--- a/init.go
+++ b/init.go
@@ -4,9 +4,9 @@
 	"github.com/30x/apid-core"
 )
 
-var(
-	log apid.LogService
-
+var (
+	Log    apid.LogService
+	Config apid.ConfigService
 )
 
 func init() {
@@ -14,8 +14,19 @@
 }
 
 func initPlugin(services apid.Services) (apid.PluginData, error) {
-	log = services.Log().ForModule("apidQuota")
-	log.Debug("start init")
+	Log = services.Log().ForModule("apidQuota")
+	Log.Debug("start init")
+
+	setConfig(services)
+	InitAPI(services)
 
 	return pluginData, nil
 }
+
+func setConfig(services apid.Services) {
+	// set configuration
+	Config = services.Config()
+	// set plugin config defaults
+	Config.SetDefault(ConfigQuotaBasePath, quotaBasePathDefault)
+
+}
diff --git a/quotaBucket/QuotaDescriptorType.go b/quotaBucket/QuotaDescriptorType.go
new file mode 100644
index 0000000..3e15c4a
--- /dev/null
+++ b/quotaBucket/QuotaDescriptorType.go
@@ -0,0 +1,119 @@
+package quotaBucket
+
+import (
+	"errors"
+	"fmt"
+	"strings"
+	"time"
+)
+
+const (
+	QuotaTypeCalendar      = "calendar"      // after start time
+	QuotaTypeFlexi         = "flexi"         //after first request
+	QuotaTypeRollingWindow = "rollingWindow" // in the past "window" time
+)
+
+type QuotaDescriptorType interface {
+	SetCurrentPeriod(bucket *QuotaBucket) error
+}
+
+func GetQuotaTypeHandler(qType string) (QuotaDescriptorType, error) {
+	var qDescriptor QuotaDescriptorType
+	quotaType := strings.ToLower(strings.TrimSpace(qType))
+	switch quotaType {
+	case QuotaTypeCalendar:
+		qDescriptor = &CanlendarQuotaDescriporType{}
+		return qDescriptor, nil
+	case QuotaTypeFlexi:
+		qDescriptor = &FlexiQuotaDescriptorType{}
+		return qDescriptor, nil
+	case QuotaTypeRollingWindow:
+		qDescriptor = &RollingWindowQuotaDescriptorType{}
+		return qDescriptor, nil
+	default:
+		return nil, errors.New("Ignoring unrecognized quota type in request: " + qType)
+
+	}
+}
+
+type CanlendarQuotaDescriporType struct{}
+
+func (c CanlendarQuotaDescriporType) SetCurrentPeriod(qbucket *QuotaBucket) error {
+	var err error
+	startTime := qbucket.GetStartTime()
+	currentPeriod, err := qbucket.GetPeriod()
+	if err != nil {
+		return err
+	}
+
+	if startTime.Before(time.Now()) || startTime.Equal(time.Now()) {
+		if currentPeriod != nil {
+			if currentPeriod.IsCurrentPeriod(qbucket) {
+				return nil
+			}
+		} else {
+			if currentPeriod.IsCurrentPeriod(qbucket) {
+				return nil
+			} else {
+				qBucketHandler, err := GetQuotaBucketHandler(qbucket.BucketType)
+				if err != nil {
+					return errors.New("error getting QuotaBucketType: " + err.Error())
+				}
+				qBucketHandler.resetCount(qbucket)
+			}
+		}
+	}
+
+	var currentStart, currentEnd time.Time
+	now := time.Now()
+	timeUnit := strings.ToLower(strings.TrimSpace(qbucket.TimeUnit))
+	switch timeUnit {
+	case TimeUnitSECOND:
+		currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.UTC)
+		secInDuration := time.Duration(int64(qbucket.Interval) * time.Second.Nanoseconds())
+		currentEnd = currentStart.Add(secInDuration)
+		break
+	case TimeUnitMINUTE:
+		currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), 0, 0, time.UTC)
+		minInDuration := time.Duration(int64(qbucket.Interval) * time.Minute.Nanoseconds())
+		currentEnd = currentStart.Add(minInDuration)
+		break
+	case TimeUnitHOUR:
+		currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC)
+		hoursInDuration := time.Duration(int64(qbucket.Interval) * time.Hour.Nanoseconds())
+		currentEnd = currentStart.Add(hoursInDuration)
+
+		break
+	case TimeUnitDAY:
+		currentStart = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
+		currentEnd = currentStart.AddDate(0, 0, 1*qbucket.Interval)
+		break
+	case TimeUnitWEEK:
+		//todo
+		//currentStart = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
+		//currentEnd = currentStart.AddDate(0, 0, 7*qbucket.Interval)
+		break
+	case TimeUnitMONTH:
+		currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC)
+		currentEnd = currentStart.AddDate(0, 1*qbucket.Interval, 0)
+		break
+	}
+
+	qbucket.SetPeriod(currentStart, currentEnd)
+	fmt.Println("inside calendat set period: ", qbucket.quotaBucketData.Period)
+	return nil
+}
+
+type FlexiQuotaDescriptorType struct{}
+
+func (c FlexiQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error {
+	//yet to implement
+	return nil
+}
+
+type RollingWindowQuotaDescriptorType struct{}
+
+func (c RollingWindowQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error {
+	//yet to implement
+	return nil
+}
diff --git a/quotaBucket/apiUtil.go b/quotaBucket/apiUtil.go
new file mode 100644
index 0000000..c00a879
--- /dev/null
+++ b/quotaBucket/apiUtil.go
@@ -0,0 +1,173 @@
+package quotaBucket
+
+import (
+	"errors"
+	"fmt"
+	"reflect"
+)
+
+func (qBucket *QuotaBucket) FromAPIRequest(quotaBucketMap map[string]interface{}) error {
+	var edgeOrgID, id, timeUnit, quotaType, bucketType string
+	var interval, maxCount int
+	var startTime int64
+	var preciseAtSecondsLevel bool
+
+	fmt.Println("quotaBucketMap: ", quotaBucketMap)
+
+	value, ok := quotaBucketMap["edgeOrgID"]
+	if !ok {
+		return errors.New(`missing field: 'edgeOrgID' is required`)
+	}
+	if edgeOrgIDType := reflect.TypeOf(value); edgeOrgIDType.Kind() != reflect.String {
+		return errors.New(`invalid type : 'edgeOrgID' should be a string`)
+	}
+	edgeOrgID = value.(string)
+	//fmt.Println("edgeOrgID: ", edgeOrgID)
+
+	value, ok = quotaBucketMap["id"]
+	if !ok {
+		return errors.New(`missing field: 'id' is required`)
+	}
+	if idType := reflect.TypeOf(value); idType.Kind() != reflect.String {
+		return errors.New(`invalid type : 'id' should be a string`)
+	}
+	id = value.(string)
+	//fmt.Println("id: ", id)
+
+	value, ok = quotaBucketMap["interval"]
+	if !ok {
+		return errors.New(`missing field: 'interval' is required`)
+	}
+	//from input when its read its float, need to then convert to int.
+	if intervalType := reflect.TypeOf(value); intervalType.Kind() != reflect.Float64 {
+		return errors.New(`invalid type : 'interval' should be a number`)
+	}
+	intervalFloat := value.(float64)
+	interval = int(intervalFloat)
+	//fmt.Println("interval: ", interval)
+
+	//TimeUnit {SECOND, MINUTE, HOUR, DAY, WEEK, MONTH}
+	value, ok = quotaBucketMap["timeUnit"]
+	if !ok {
+		return errors.New(`missing field: 'timeUnit' is required`)
+	}
+	if timeUnitType := reflect.TypeOf(value); timeUnitType.Kind() != reflect.String {
+		return errors.New(`invalid type : 'timeUnit' should be a string`)
+	}
+	timeUnit = value.(string)
+	//fmt.Println("timeUnit: ", timeUnit)
+
+	//Type {CALENDAR, FLEXI, ROLLING_WINDOW}
+	value, ok = quotaBucketMap["quotaType"]
+	if !ok {
+		return errors.New(`missing field: 'quotaType' is required`)
+	}
+	if quotaTypeType := reflect.TypeOf(value); quotaTypeType.Kind() != reflect.String {
+		return errors.New(`invalid type : 'quotaType' should be a string`)
+	}
+	quotaType = value.(string)
+	//fmt.Println("quotaType: ", quotaType)
+
+	value, ok = quotaBucketMap["preciseAtSecondsLevel"]
+	if !ok {
+		return errors.New(`missing field: 'preciseAtSecondsLevel' is required`)
+	}
+	if preciseAtSecondsLevelType := reflect.TypeOf(value); preciseAtSecondsLevelType.Kind() != reflect.Bool {
+		return errors.New(`invalid type : 'preciseAtSecondsLevel' should be boolean`)
+	}
+	preciseAtSecondsLevel = value.(bool)
+	//fmt.Println("preciseAtSecondsLevel: ", preciseAtSecondsLevel)
+
+	value, ok = quotaBucketMap["startTime"]
+	if !ok {
+		return errors.New(`missing field: 'startTime' is required`)
+	}
+	//from input when its read its float, need to then convert to int.
+	if startTimeType := reflect.TypeOf(value); startTimeType.Kind() != reflect.Float64 {
+		return errors.New(`invalid type : 'startTime' should be UNIX timestamp`)
+	}
+	startTimeFloat := value.(float64)
+	startTime = int64(startTimeFloat)
+	//fmt.Println("startTime: ", startTime)
+
+	quotaPeriod := QuotaPeriod{}
+	value, ok = quotaBucketMap["period"]
+	//if period is not sent in the request, it is calculated based in the startTime, quotaType and interval.
+	if ok {
+		var inStartInt, startInt, endInt int64
+
+		isPeriodMap := reflect.TypeOf(value)
+		if isPeriodMap.Kind() != reflect.Map {
+			return errors.New(`invalid type : 'period' should be a Map`)
+		}
+		periodMap := value.(map[string]interface{})
+
+		inStartTimeValue, ok := periodMap["inputStartTime"]
+		if !ok {
+			//set period.inputStart time from qBucket.startTime
+			inStartInt = startTime
+		} else {
+			if inStartType := reflect.TypeOf(inStartTimeValue); inStartType.Kind() != reflect.Float64 {
+				return errors.New(`invalid type : 'inputStartTime' in 'period' should be UNIX timestamp`)
+			}
+			inStartFloat := inStartTimeValue.(float64)
+			inStartInt = int64(inStartFloat)
+			if startTime != inStartInt {
+				return errors.New(`invalid value : 'inputStartTime' in 'period' should be same as 'startTime'' in request`)
+			}
+		}
+
+		startTimeValue, ok := periodMap["startTime"]
+		if !ok {
+			return errors.New(`missing field : 'startTime' in 'period' cannot be empty`)
+		}
+		if periodStartType := reflect.TypeOf(startTimeValue); periodStartType.Kind() != reflect.Float64 {
+			return errors.New(`invalid type : 'startTime' in 'period' should be UNIX timestamp`)
+		}
+		periodStartFloat := startTimeValue.(float64)
+		startInt = int64(periodStartFloat)
+
+		periodEndValue, ok := periodMap["endTime"]
+		if !ok {
+			return errors.New(`missing field : 'endTime' in 'period' cannot be empty`)
+		}
+		if periodEndType := reflect.TypeOf(periodEndValue); periodEndType.Kind() != reflect.Float64 {
+			return errors.New(`invalid type : 'endTime' in 'period' should be UNIX timestamp`)
+		}
+		periodEndFloat := periodEndValue.(float64)
+		endInt = int64(periodEndFloat)
+
+		quotaPeriod = NewQuotaPeriod(inStartInt, startInt, endInt)
+	}
+
+	value, ok = quotaBucketMap["maxCount"]
+	if !ok {
+		return errors.New(`missing field: 'maxCount' is required`)
+	}
+	//from input when its read its float, need to then convert to int.
+	if maxCountType := reflect.TypeOf(value); maxCountType.Kind() != reflect.Float64 {
+		return errors.New(`invalid type : 'maxCount' should be a number`)
+	}
+	maxCountFloat := value.(float64)
+	maxCount = int(maxCountFloat)
+	//fmt.Println("maxCount: ", maxCount)
+
+	value, ok = quotaBucketMap["bucketType"]
+	if !ok {
+		return errors.New(`missing field: 'bucketType' is required`)
+	}
+	if bucketTypeType := reflect.TypeOf(value); bucketTypeType.Kind() != reflect.String {
+		return errors.New(`invalid type : 'bucketType' should be a string`)
+	}
+	bucketType = value.(string)
+	//fmt.Println("bucketType: ", bucketType)
+
+	newQBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, quotaPeriod, startTime, maxCount, bucketType)
+	if err != nil {
+		return errors.New("unable to Unmarshal periodMap to quotaPeriod: " + err.Error())
+
+	}
+	qBucket.quotaBucketData = newQBucket.quotaBucketData
+	return nil
+
+}
diff --git a/quotaBucket/quotaBucket.go b/quotaBucket/quotaBucket.go
new file mode 100644
index 0000000..36c9082
--- /dev/null
+++ b/quotaBucket/quotaBucket.go
@@ -0,0 +1,169 @@
+package quotaBucket
+
+import (
+	"errors"
+	"fmt"
+	"time"
+)
+
+const (
+	TimeUnitSECOND = "second"
+	TimeUnitMINUTE = "minute"
+	TimeUnitHOUR   = "hour"
+	TimeUnitDAY    = "day"
+	TimeUnitWEEK   = "week"
+	TimeUnitMONTH  = "month"
+)
+
+type QuotaPeriod struct {
+	inputStartTime time.Time
+	startTime      time.Time
+	endTime        time.Time
+}
+
+func NewQuotaPeriod(inputStartTime int64, startTime int64, endTime int64) QuotaPeriod {
+	pInStartTime := time.Unix(inputStartTime, 0)
+	pStartTime := time.Unix(startTime, 0)
+	pEndTime := time.Unix(endTime, 0)
+
+	period := &QuotaPeriod{inputStartTime: pInStartTime,
+		startTime: pStartTime,
+		endTime:   pEndTime,
+	}
+	return *period
+
+}
+
+type quotaBucketData struct {
+	EdgeOrgID             string
+	ID                    string
+	Interval              int
+	TimeUnit              string //TimeUnit {SECOND, MINUTE, HOUR, DAY, WEEK, MONTH}
+	QuotaType             string //Type {CALENDAR, FLEXI, ROLLING_WINDOW}
+	PreciseAtSecondsLevel bool
+	Period                QuotaPeriod
+	StartTime             time.Time
+	MaxCount              int
+	BucketType            string // SyncDistributed, AsyncDistributed, NonDistributed
+}
+
+type QuotaBucket struct {
+	quotaBucketData
+}
+
+func NewQuotaBucket(edgeOrgID string, id string, interval int,
+	timeUnit string, quotaType string, preciseAtSecondsLevel bool, period QuotaPeriod,
+	startTime int64, maxCount int, bucketType string) (*QuotaBucket, error) {
+
+	fromUNIXTime := time.Unix(startTime, 0)
+
+	quotaBucketDataStruct := &quotaBucketData{
+		EdgeOrgID:             edgeOrgID,
+		ID:                    id,
+		Interval:              interval,
+		TimeUnit:              timeUnit,
+		QuotaType:             quotaType,
+		PreciseAtSecondsLevel: preciseAtSecondsLevel,
+		Period:                period,
+		StartTime:             fromUNIXTime,
+		MaxCount:              maxCount,
+		BucketType:            bucketType,
+	}
+
+	quotaBucket := &QuotaBucket{
+		quotaBucketData: *quotaBucketDataStruct,
+	}
+
+	return quotaBucket, nil
+
+}
+
+func (q *QuotaBucket) GetEdgeOrgID() string {
+	return q.quotaBucketData.EdgeOrgID
+}
+
+func (q *QuotaBucket) GetID() string {
+	return q.quotaBucketData.ID
+}
+
+func (q *QuotaBucket) GetInterval() int {
+	return q.quotaBucketData.Interval
+}
+
+func (q *QuotaBucket) GetStartTime() time.Time {
+	return q.quotaBucketData.StartTime
+}
+
+func (q *QuotaBucket) GetQuotaType() string {
+	return q.quotaBucketData.QuotaType
+}
+
+func (q *QuotaBucket) GetPeriod() (*QuotaPeriod, error) {
+	if q.quotaBucketData.QuotaType == QuotaTypeRollingWindow {
+		qRWType := RollingWindowQuotaDescriptorType{}
+		err := qRWType.SetCurrentPeriod(q)
+		if err != nil {
+			return nil, err
+		}
+	}
+	return &q.quotaBucketData.Period, nil
+}
+
+func (q *QuotaBucket) GetMaxCount() int {
+	return q.quotaBucketData.MaxCount
+}
+
+func (q *QuotaBucket) GetBucketType() string {
+	return q.quotaBucketData.BucketType
+}
+
+func (q *quotaBucketData) SetPeriod(startTime time.Time, endTime time.Time) {
+	q.Period = QuotaPeriod{inputStartTime: q.StartTime,
+		startTime: startTime,
+		endTime:   endTime,
+	}
+}
+
+func (q *QuotaBucket) setCurrentPeriod() error {
+
+	qDescriptorType, err := GetQuotaTypeHandler(q.GetQuotaType())
+	if err != nil {
+		return err
+	}
+	return qDescriptorType.SetCurrentPeriod(q)
+
+}
+
+func (period *QuotaPeriod) IsCurrentPeriod(qBucket *QuotaBucket) bool {
+	if qBucket != nil && qBucket.GetBucketType() != "" {
+		if qBucket.GetBucketType() == QuotaTypeRollingWindow {
+			return (period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now()))
+		}
+		return ((period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now())) &&
+			period.startTime.String() != "" && period.endTime.String() != "" &&
+			period.startTime.Before(time.Now()) && period.startTime.Equal(time.Now()) &&
+			period.endTime.Before(time.Now()) && period.startTime.Equal(time.Now()))
+	}
+	return false
+}
+
+func (q *QuotaBucket) GetQuotaCount() (int, error) {
+	err := q.setCurrentPeriod()
+	if err != nil {
+		return 0, errors.New("error setCurrentPeriod(): " + err.Error())
+	}
+	period, err := q.GetPeriod()
+	if err != nil {
+		return 0, errors.New("error getting period: " + err.Error())
+	}
+	fmt.Println("period set: ", period)
+
+	//todo API call to counter service using Period start end and keyspace.
+
+	return 10, nil
+}
+
+func (q *QuotaBucket) IncrementQuota() (int, error) {
+	//todo
+	return 0, nil
+}
diff --git a/quotaBucket/quotaBucketType.go b/quotaBucket/quotaBucketType.go
new file mode 100644
index 0000000..843846b
--- /dev/null
+++ b/quotaBucket/quotaBucketType.go
@@ -0,0 +1,57 @@
+package quotaBucket
+
+import (
+	"errors"
+	"strings"
+)
+
+const (
+	QuotaBucketTypeSynchronous    = "synchronous"
+	QuotaBucketTypeAsynchronous   = "asynchronous"
+	QuotaBucketTypeNonDistributed = "nonDistributed"
+	//todo: Add other bucketTypes
+)
+
+type QuotaBucketType interface {
+	resetCount(bucket *QuotaBucket) error
+}
+
+type SynchronousQuotaBucketType struct{}
+
+func (sQuotaBucket SynchronousQuotaBucketType) resetCount(qBucket *QuotaBucket) error {
+	//do nothing.
+	return nil
+}
+
+type AsynchronousQuotaBucketType struct{}
+
+func (sQuotaBucket AsynchronousQuotaBucketType) resetCount(qBucket *QuotaBucket) error {
+	//yet to implement
+	return nil
+}
+
+type NonDistributedQuotaBucketType struct{}
+
+func (sQuotaBucket NonDistributedQuotaBucketType) resetCount(qBucket *QuotaBucket) error {
+	//yet to implement
+	return nil
+}
+
+func GetQuotaBucketHandler(qBucket string) (QuotaBucketType, error) {
+	var quotaBucketType QuotaBucketType
+	qBucketType := strings.ToLower(strings.TrimSpace(qBucket))
+	switch qBucketType {
+	case QuotaBucketTypeSynchronous:
+		quotaBucketType = &SynchronousQuotaBucketType{}
+		return quotaBucketType, nil
+	case QuotaBucketTypeAsynchronous:
+		quotaBucketType = &AsynchronousQuotaBucketType{}
+		return quotaBucketType, nil
+	case QuotaBucketTypeNonDistributed:
+		quotaBucketType = &NonDistributedQuotaBucketType{}
+		return quotaBucketType, nil
+	default:
+		return nil, errors.New("Ignoring unrecognized quota type in request: " + qBucket)
+
+	}
+}
diff --git a/util.go b/util.go
new file mode 100644
index 0000000..696d5bc
--- /dev/null
+++ b/util.go
@@ -0,0 +1,20 @@
+package apidQuota
+
+import (
+	"encoding/json"
+	"net/http"
+)
+
+// WriteErrorResponse will write the HTTP header and payload for the HTTP ResponseWriter provided
+func WriteErrorResponse(status int, errorType string, errorDescription string, res http.ResponseWriter, req *http.Request) {
+	response := make(map[string]string)
+	response["error"] = errorType
+	response["errorDescription"] = errorDescription
+	responseJson, err := json.Marshal(response)
+	if err != nil {
+		panic(err)
+	}
+	res.Header().Set("Content-Type", "application/json")
+	res.WriteHeader(status)
+	res.Write(responseJson)
+}
