Fitbit Subscription Create And Remove Using Java Code

Step- 1:

  1. Register a Fitbit account.
  2. Now you need to create a demo app on Fitbit. For that, you need to login to (https://dev.fitbit.com/login) first using your credentials. Now you need to register an app for that you can hit this https://dev.fitbit.com/apps/new URL.
  3. Kindly find below screenshot for more understanding
  4. For subscription, you need to click on “Add a subscriber” button with a plus sign. So here you can subscribe your API with Fitbit. Here it will ask you some information like:
    1. Endpoint URL (Basically you need to put your one rest service URL which will be verified later) example: https://demoapi.com/healthData/notifications
    2. Type: You can prefer anyone but I used jsonbody in my project
    3. subscribed (This ID is a unique name so you can put anything that you want but that should be unique)
  5. Now click on the checkbox to accept Terms and Conditions.
  6. Now click on the register button.

Step- 2:

In second step you need to verify the subscriberId which you just created in step1.
  1. You will see one screen as below after registration.
  2. Now as you can see verify button and verification code on the bottom of the above screenshot. So basically you need to copy that key from here and store it somewhere which we will use in our next step.
  3. Now you need to create 2 REST API’s with the same URL which you have already given in Endpoint URL. Here both URL’s will have different request methods like @GET and @POST. Here get and post both methods will call when you will click on verify button but don’t do it right now.
@GET
@Path("/notifications")
public Response getFitBitNotification(@PathParam("version") String version,@QueryParam("verify") String verify) throws DemoException {

logger.info("<------ inside fitbit notification verify ------>");
if(verify.equals(fitBitEndPointVerificationCode))
{
logger.info("<------ fitbit subscription verify success------>");
return Response.status(Status.NO_CONTENT).build();
}
logger.info("<------ fitbit subscription verify not applied------>");
return Response.status(Status.NOT_FOUND).build();
}

You need to put your fitBitEndPointVerificationCode which you copied from Fitbit verification screen. This method will basically return with no content status code.

@POST
@Path("/notifications")
public Response getFitBitNotificationData(@Context HttpServletRequest request,@PathParam("version") String version,List notificationList) throws MangoMirrorException
{
logger.info("<------inside fitbit notification data ------>");
ExecutorService executor = Executors.newFixedThreadPool(2);
Runnable taskOne = new FitbitDataThread(notificationList);
executor.execute(taskOne);
return Response.status(Status.NO_CONTENT).build();
}

And this post method we use to get continuous updates from Fitbit if any value changes. Basically Fitbit services will call this API if any changes are done within Fitbit account data or profile. So this method will start working when we create a subscription for a particular user. Which we will do in the next step. Here is an above method I used FitBitNotificationModel which is used to get Fitbit data in a custom model.

public class FitBitNotificationModel {

private String collectionType;
private String ownerId;
private String ownerType;
private String subscriberId;
private String subscriptionId;
private String date;

//setter and getter of the above variable
}

you can click on verify button on Fitbit to verify your subscriber Id. Within a minute your verification will be completed and you can check it on the same page “Verify” button will be removed from there and verified the time you can see there.

Step- 3:

Now we will see how we can create a subscription on Fitbit for a particular user. So that we can continuously receive his/her account updates asynchronously. Basically you need to create subscription by unique subscriptionId. So when user will provide access token and secret token to your app that time only you need to create its subscription.

Void createSubscription(String FitbitAccessToken)
{
HttpHeaders headers = new HttpHeaders();
headers.set("X-Fitbit-Subscriber-Id", fitBitSubscriberId);
headers.set("Authorization", "Bearer " +FitbitAccessToken);
HttpEntity entity = new HttpEntity<>(headers);
String subscriptionUrl = “fitbit”
restTemplate.exchange(subscriptionUrl, HttpMethod.POST, entity, String.class);
}
In the above code, I used “1.json” in subscriptionUrl so 1 is actually unique subscriptionId for that account.
Here you need to put your fitBitSubscriberId which you created in the first step. FitbitAccessToken you can get from that user account. So when this function will be called after that subscription will be done for that particular user. Whenever data or profile change happens in that particular account, below method of yours will be called and from here you can see which category of data is modified in that account. https://www.demo.com/healthData/notifications (POST) created in step2.
If you closely observe I have used subscriptionURL in the above method. That can be used in different ways as per your requirement.
  1. https://api.fitbit.com/1/user/-/activities/apiSubscriptions/1.json
  2. https://api.fitbit.com/1/user/-/foods/apiSubscriptions/1.json
  3. https://api.fitbit.com/1/user/-/sleep/apiSubscriptions/1.json
  4. https://api.fitbit.com/1/user/-/body/apiSubscriptions/1.json
Here in 1st URL, we didn’t mention any particular category for subscription, so we will get a notification if any data is modified within these (activities, foods, sleep, body) categories.

And other subscription URL we can use if we want notification for a fixed category of data changes.

Step- 4:

You can’t use same subscriptionId for multiple users account. If you try to do that you will get one ERROR Code 409 Conflict. But if you want to use same Fitbit account with other subscriptionId in that case you need to first unsubscribe existing subscriptionId then you can create a new subscription for that account. You can use below code to unsubscribe existing subscriptionId.

Void removeSubscription(String FitbitAccessToken)
{
HttpHeaders headers = new HttpHeaders();
headers.set("X-Fitbit-Subscriber-Id", fitBitSubscriberId);
headers.set("Authorization", "Bearer " +FitbitAccessToken);
HttpEntity entity = new HttpEntity<>(headers);
String subscriptionUrl = “fitbit”
restTemplate.exchange(subscriptionUrl, HttpMethod.DELETE, entity, String.class);
}

In my next blog, I will explain how we can fetch data from Fitbit after getting a notification. I hope that this in-depth research blog can accomplish all your queries.

For subscription related details you can check their official doc on below link. https://dev.fitbit.com/build/reference/web-api/subscriptions/

If without creating any application want to check their api’s and its response you can use below link: https://dev.fitbit.com/build/reference/web-api/explore/

Gaurav

Full Stack Developer

Gaurav is a full stack developer with over 4+ years of experience with excellent knowledge in Java (Core+Advanced), Spring Boot, Angular JS and AWS Cloud services. He is very dedicated towards his work and that’s the reason he is always trying to learn new technologies to update himself. He loves to help people solving their queries in the technical aspects.

Get in touch for a detailed discussion.

Hear From Our 100+ Customers
coma

Mindbowser helped us build an awesome iOS app to bring balance to people’s lives.

author
ADDIE WOOTTEN
CEO, SMILINGMIND
coma

We had very close go live timeline and MindBowser team got us live a month before.

author
Shaz Khan
CEO, BuyNow WorldWide
coma

They were a very responsive team! Extremely easy to communicate and work with!

author
Kristen M.
Founder & CEO, TotTech
coma

We’ve had very little-to-no hiccups at all—it’s been a really pleasurable experience.

author
Chacko Thomas
Co-Founder, TEAM8s
coma

Mindbowser is one of the reasons that our app is successful. These guys have been a great team.

author
Dave Dubier
Founder & CEO, MangoMirror
coma

Mindbowser was very helpful with explaining the development process and started quickly on the project.

author
Hieu Le
Executive Director of Product Development, Innovation Lab
coma

The greatest benefit we got from Mindbowser is the expertise. Their team has developed apps in all different industries with all types of social proofs.

author
Alex Gobel
Co-Founder, Vesica
coma

Mindbowser is professional, efficient and thorough. 

author
MacKenzie R
Consultant at XPRIZE
coma

Very committed, they create beautiful apps and are very benevolent. They have brilliant Ideas.

author
Laurie Mastrogiani
Founder, S.T.A.R.S of Wellness
coma

MindBowser was great; they listened to us a lot and helped us hone in on the actual idea of the app.” “They had put together fantastic wireframes for us.

author
Bennet Gillogly
Co-Founder, Flat Earth
coma

They're very tech-savvy, yet humble.

author
Uma Nidmarty
CEO, GS Advisorate, Inc.
coma

Ayush was responsive and paired me with the best team member possible, to complete my complex vision and project. Could not be happier.

author
Katie Taylor
Founder, Child Life On Call
coma

As a founder of a budding start-up, it has been a great experience working with Mindbower Inc under Ayush's leadership for our online digital platform design and development activity.

author
Radhika Kotwal
Founder of Courtyardly
coma

The team from Mindbowser stayed on task, asked the right questions, and completed the required tasks in a timely fashion! Strong work team!

author
Michael Wright
Chief Executive Officer, SDOH2Health LLC
coma

They are focused, patient and; they are innovative. Please give them a shot if you are looking for someone to partner with, you can go along with Mindbowser.

author
David Cain
CEO, thirty2give
coma

We are a small non-profit on a budget and they were able to deliver their work at our prescribed budgets. Their team always met their objectives and I'm very happy with the end result. Thank you, Mindbowser team!!

author
Bart Mendel
Founder, Mindworks