diff --git a/clients.go b/clients.go
index c260b98..7fc8c48 100644
--- a/clients.go
+++ b/clients.go
@@ -1,15 +1,19 @@
 package apiGatewayConfDeploy
 
 import (
+	"github.com/30x/apid-core"
+	"github.com/30x/apidApigeeSync"
 	"io/ioutil"
 	"net/http"
 	"net/url"
+	"strings"
 )
 
 const (
 	trackerConfigStatusEndpoint = "/serviceconfigstatus"
 	trackerHeartbeatEndpoint    = "/serviceheartbeat/{uuid}"
 	trackerRegisterEndpoint     = "/serviceregister/{uuid}"
+	ApigeeSyncTokenSelector     = "ApigeeSyncToken"
 )
 
 type trackerClientInterface interface {
@@ -28,17 +32,18 @@
 	trackerBaseUrl string
 	clusterId      string
 	httpclient     *http.Client
+	handler        *tokenEventHandler
 }
 
 func (t *trackerClient) putConfigStatus(configId, status, uuid, created string) trackerResponse {
-	uri, err := url.Parse(t.trackerBaseUrl + trackerConfigStatusEndpoint)
+	uri, err := url.Parse(t.trackerBaseUrl + strings.Replace(trackerConfigStatusEndpoint, "{uuid}", uuid, 1))
 	if err != nil {
 		log.Errorf("putConfigStatus failed to parse tracker uri: %v", err)
 		return (internalError(err))
 	}
-	req, err := http.NewRequest("PUT", uri, nil)
+	req, err := http.NewRequest("PUT", uri.String(), nil)
 	req.Header.Add("configid", configId)
-	req.Header.Add("Authorization", getAuthToken())
+	req.Header.Add("Authorization", t.handler.getBearerToken())
 	req.Header.Add("status", status)
 	req.Header.Add("uuid", uuid)
 	req.Header.Add("created", created)
@@ -55,8 +60,16 @@
 	case http.StatusOK:
 		res.code = r.StatusCode
 		res.contentType = r.Header.Get("Content-type")
+	case http.StatusUnauthorized, http.StatusForbidden:
+		res.code = http.StatusInternalServerError
+		res.errString = "apid token rejected by tracker"
+		return res
 	default:
-		res.code = r.StatusCode
+		if 400 <= res.code && res.code < 500 {
+			res.code = http.StatusInternalServerError
+		} else {
+			res.code = r.StatusCode
+		}
 		res.contentType = r.Header.Get("Content-type")
 		body, err := ioutil.ReadAll(r.Body)
 		if err != nil {
@@ -68,14 +81,13 @@
 }
 
 func (t *trackerClient) postRegister(uuid, pod, created, name, podType, serviceType string) trackerResponse {
-	uri, err := url.Parse(t.trackerBaseUrl + trackerRegisterEndpoint)
+	uri, err := url.Parse(t.trackerBaseUrl + strings.Replace(trackerRegisterEndpoint, "{uuid}", uuid, 1))
 	if err != nil {
 		log.Errorf("postRegister failed to parse tracker uri: %v", err)
 		return (internalError(err))
 	}
-	req, err := http.NewRequest("PUT", uri, nil)
-	req.Header.Add("uuid", uuid)
-	req.Header.Add("Authorization", getAuthToken())
+	req, err := http.NewRequest("PUT", uri.String(), nil)
+	req.Header.Add("Authorization", t.handler.getBearerToken())
 	req.Header.Add("pod", pod)
 	req.Header.Add("podtype", podType)
 	req.Header.Add("created", created)
@@ -94,8 +106,16 @@
 	case http.StatusOK:
 		res.code = r.StatusCode
 		res.contentType = r.Header.Get("Content-type")
+	case http.StatusUnauthorized, http.StatusForbidden:
+		res.code = http.StatusInternalServerError
+		res.errString = "apid token rejected by tracker"
+		return res
 	default:
-		res.code = r.StatusCode
+		if 400 <= res.code && res.code < 500 {
+			res.code = http.StatusInternalServerError
+		} else {
+			res.code = r.StatusCode
+		}
 		res.contentType = r.Header.Get("Content-type")
 		body, err := ioutil.ReadAll(r.Body)
 		if err != nil {
@@ -107,21 +127,20 @@
 }
 
 func (t *trackerClient) putHeartbeat(uuid, updated string) trackerResponse {
-	uri, err := url.Parse(t.trackerBaseUrl + trackerHeartbeatEndpoint)
+	uri, err := url.Parse(t.trackerBaseUrl + strings.Replace(trackerHeartbeatEndpoint, "{uuid}", uuid, 1))
 	if err != nil {
 		log.Errorf("putHeartbeat failed to parse tracker uri: %v", err)
-		return (internalError(err))
+		return internalError(err)
 	}
-	req, err := http.NewRequest("PUT", uri, nil)
-	req.Header.Add("uuid", uuid)
-	req.Header.Add("Authorization", getAuthToken())
+	req, err := http.NewRequest("PUT", uri.String(), nil)
+	req.Header.Add("Authorization", t.handler.getBearerToken())
 	req.Header.Add("updated", updated)
 	req.Header.Add("clusterid", t.clusterId)
 
 	r, err := t.httpclient.Do(req)
 	if err != nil {
 		log.Errorf("trackerClient communication error: %v", err)
-		return (internalError(err))
+		return internalError(err)
 	}
 	defer r.Body.Close()
 	res := trackerResponse{}
@@ -129,12 +148,20 @@
 	case http.StatusOK:
 		res.code = r.StatusCode
 		res.contentType = r.Header.Get("Content-type")
+	case http.StatusUnauthorized, http.StatusForbidden:
+		res.code = http.StatusInternalServerError
+		res.errString = "apid token rejected by tracker"
+		return res
 	default:
-		res.code = r.StatusCode
+		if 400 <= res.code && res.code < 500 {
+			res.code = http.StatusInternalServerError
+		} else {
+			res.code = r.StatusCode
+		}
 		res.contentType = r.Header.Get("Content-type")
 		body, err := ioutil.ReadAll(r.Body)
 		if err != nil {
-			return (internalError(err))
+			return internalError(err)
 		}
 		res.errString = string(body)
 	}
@@ -147,7 +174,21 @@
 	return res
 }
 
-func getAuthToken() string {
-	//TODO
-	return "Bearer "
+type tokenEventHandler struct {
+	token string
+}
+
+func (h *tokenEventHandler) Handle(e apid.Event) {
+	if tokenEvent, ok := e.(*apidApigeeSync.TokenEvent); ok {
+		h.token = tokenEvent.AccessToken
+	}
+}
+
+func (h *tokenEventHandler) getBearerToken() string {
+	return "Bearer " + h.token
+}
+
+func (h *tokenEventHandler) initListener(services apid.Services) {
+
+	services.Events().Listen(ApigeeSyncTokenSelector, h)
 }
diff --git a/init.go b/init.go
index 919e7a6..b1d2b7c 100644
--- a/init.go
+++ b/init.go
@@ -129,6 +129,29 @@
 	}
 	apidClusterId = config.GetString(configApidClusterID)
 
+	// initialize token handler
+
+	tokenHandler := &tokenEventHandler{}
+	tokenHandler.initListener(services)
+
+	// initialize tracker client
+
+	client := &trackerClient{
+		trackerBaseUrl: configApiServerBaseURI,
+		clusterId:      apidClusterId,
+		httpclient: &http.Client{
+			Transport: &http.Transport{
+				MaxIdleConnsPerHost: maxIdleConnsPerHost,
+			},
+			Timeout: httpTimeout,
+			CheckRedirect: func(req *http.Request, _ []*http.Request) error {
+				req.Header.Set("Authorization", tokenHandler.getBearerToken())
+				return nil
+			},
+		},
+		handler: tokenHandler,
+	}
+
 	// initialize db manager
 
 	dbMan := &dbManager{
@@ -139,14 +162,18 @@
 	// initialize api manager
 
 	apiMan := &apiManager{
-		dbMan:               dbMan,
-		deploymentsEndpoint: deploymentsEndpoint,
-		blobEndpoint:        blobEndpoint,
-		eTag:                0,
-		deploymentsChanged:  make(chan interface{}, 5),
-		addSubscriber:       make(chan chan deploymentsResult),
-		removeSubscriber:    make(chan chan deploymentsResult),
-		apiInitialized:      false,
+		dbMan:                dbMan,
+		trackerCl:            client,
+		deploymentsEndpoint:  deploymentsEndpoint,
+		blobEndpoint:         blobEndpoint,
+		configStatusEndpoint: configStatusEndpoint,
+		heartbeatEndpoint:    heartbeatEndpoint,
+		registerEndpoint:     registerEndpoint,
+		eTag:                 0,
+		deploymentsChanged:   make(chan interface{}, 5),
+		addSubscriber:        make(chan chan deploymentsResult),
+		removeSubscriber:     make(chan chan deploymentsResult),
+		apiInitialized:       false,
 	}
 
 	// initialize bundle manager
