{"action":"created","comment":{"url":"https://api.github.com/repos/auth0/blog/pulls/comments/93528164","pull_request_review_id":14057638,"id":93528164,"diff_hunk":"@@ -0,0 +1,971 @@\n+---\n+layout: post\n+title: \"Introduction to Progressive Web Apps (Push Notifications) - Part 3\"\n+description: Progressive Web Apps are the future. Learn how to make your mobile web app native-like by making it work offline, load instantly and send push notifications.\n+date: 2016-12-19 08:30\n+category: Technical Guide, Progressive Web Apps, Push Notifications\n+design:\n+  bg_color: \"#222228\"\n+  image: https://cdn.auth0.com/blog/pwa/push_notification_Logo.png\n+author:\n+  name: Prosper Otemuyiwa\n+  url: http://twitter.com/unicodeveloper?lang=en\n+  mail: prosper.otemuyiwa@auth0.com\n+  avatar: https://en.gravatar.com/avatar/1097492785caf9ffeebffeb624202d8f?s=200\n+tags:\n+- pwa\n+- service-workers\n+- offline\n+related:\n+- 2015-10-30-creating-offline-first-web-apps-with-service-workers\n+- 2016-02-22-12-12-steps-to-a-faster-web-app\n+- 2016-12-18-introduction-to-progressive-apps-part-one\n+\n+---\n+\n+---\n+\n+**TL;DR:** Web development has evolved significantly over the years allowing developers to deploy a website or web application and serve millions of people around the globe within minutes. With just a browser, a user can put in a URL and access a web application. With, **Progressive Web Apps**, developers can deliver amazing app-like experiences to users using modern web technologies. In [Part 1](https://auth0.com/blog/introduction-to-progressive-apps-part-one) and [Part 2](part 2) of this tutorial, we set up our progressive web app, cached the pages and made it work fully offline. This time, we'll add the ability to activate push notifications.\n+\n+---\n+\n+## Recap and Introduction to Part 3\n+\n+In [Introduction to Progressive Web Apps (Offline First)](https://auth0.com/blog/introduction-to-progressive-apps-part-one), we discussed how a typical progressive web application should look like and also introduced the service worker. We also cached the application shell. In [Introduction to Progressive Web Apps (Instant Loading)](https://link-to-part-2), we made the app cache dynamic data and load instantly from locally saved data.\n+\n+This part of this tutorial will cover:\n+\n+* Activating Push Notifications in the web app\n+* Adding a web application manifest to make the web app installable\n+\n+\n+## Push Notifications\n+\n+The [Push API](https://developer.mozilla.org/en/docs/Web/API/Push_API) gives web applications the ability to receive push notification messages pushed to them from a server. This works hand in hand with the service worker. This is the process of a typical push notification flow in a web application:\n+\n+* The web app brings forward a popup asking the user to subscribe to receive notifications.\n+* The user subscribes to receive push notifications.\n+* The service worker's push manager is responsible for handling the user's subscription.\n+* The user's subscription ID is used whenever messages are posted from the server. Every user can actually have a customized experience based on their subscription ID.\n+* The service worker, with the help of the `push` listens and is ready to receive any message coming in.\n+\n+## Implementation\n+\n+This is a quick summary of the process of how we'll set up push notifications in this web app:\n+\n+* Give the user an option to click on a button to activate or deactivate push notifications\n+* If the user activates, subscribe the user to receive push notifications via the service worker's push manager\n+* Set up an API to handle saving and deletion of user's subscription ID. This API will also have endpoints that will be responsible for sending notifications to all the users that have activated push notifications\n+* Set up Github Webhook to automate the sending of notifications immediately a new commit is pushed to the `resources-i-like` repo.\n+\n+### Let's Build\n+\n+Create a new JavaScript file `js/notification.js` in your project. Reference the file in your `index.html` like so:\n+\n+```bash\n+\n+ <script src=\"./js/notification.js\"></script>\n+\n+``` \n+\n+..and add the following code the `notification.js` like so:\n+\n+```js\n+\n+(function (window) {\n+  'use strict';\n+\n+  //Push notification button\n+  var fabPushElement = document.querySelector('.fab__push');\n+  var fabPushImgElement = document.querySelector('.fab__image');\n+  \n+  //To check `push notification` is supported or not\n+  function isPushSupported() {\n+    //To check `push notification` permission is denied by user\n+    if (Notification.permission === 'denied') {\n+      alert('User has blocked push notification.');\n+      return;\n+    }\n+\n+    //Check `push notification` is supported or not\n+    if (!('PushManager' in window)) {\n+      alert('Sorry, Push notification isn\\'t supported in your browser.');\n+      return;\n+    }\n+\n+    //Get `push notification` subscription\n+    //If `serviceWorker` is registered and ready\n+    navigator.serviceWorker.ready\n+      .then(function (registration) {\n+        registration.pushManager.getSubscription()\n+        .then(function (subscription) {\n+          //If already access granted, enable push button status\n+          if (subscription) {\n+            changePushStatus(true);\n+          }\n+          else {\n+            changePushStatus(false);\n+          }\n+        })\n+        .catch(function (error) {\n+          console.error('Error occurred while enabling push ', error);\n+        });\n+      });\n+  }\n+\n+  // Ask User if he/she wants to subscribe to push notifications and then \n+  // ..subscribe and send push notification\n+  function subscribePush() {\n+    navigator.serviceWorker.ready.then(function(registration) {\n+      if (!registration.pushManager) {\n+        alert('Your browser doesn\\'t support push notification.');\n+        return false;\n+      }\n+\n+      //To subscribe `push notification` from push manager\n+      registration.pushManager.subscribe({\n+        userVisibleOnly: true //Always show notification when received\n+      })\n+      .then(function (subscription) {\n+        toast('Subscribed successfully.');\n+        console.info('Push notification subscribed.');\n+        console.log(subscription);\n+        //saveSubscriptionID(subscription);\n+        changePushStatus(true);\n+      })\n+      .catch(function (error) {\n+        changePushStatus(false);\n+        console.error('Push notification subscription error: ', error);\n+      });\n+    })\n+  }\n+\n+  // Unsubscribe the user from push notifications\n+  function unsubscribePush() {\n+    navigator.serviceWorker.ready\n+    .then(function(registration) {\n+      //Get `push subscription`\n+      registration.pushManager.getSubscription()\n+      .then(function (subscription) {\n+        //If no `push subscription`, then return\n+        if(!subscription) {\n+          alert('Unable to unregister push notification.');\n+          return;\n+        }\n+\n+        //Unsubscribe `push notification`\n+        subscription.unsubscribe()\n+          .then(function () {\n+            toast('Unsubscribed successfully.');\n+            console.info('Push notification unsubscribed.');\n+            console.log(subscription);\n+            //deleteSubscriptionID(subscription);\n+            changePushStatus(false);\n+          })\n+          .catch(function (error) {\n+            console.error(error);\n+          });\n+      })\n+      .catch(function (error) {\n+        console.error('Failed to unsubscribe push notification.');\n+      });\n+    })\n+  }\n+\n+  //To change status\n+  function changePushStatus(status) {\n+    fabPushElement.dataset.checked = status;\n+    fabPushElement.checked = status;\n+    if (status) {\n+      fabPushElement.classList.add('active');\n+      fabPushImgElement.src = '../images/push-on.png';\n+    }\n+    else {\n+     fabPushElement.classList.remove('active');\n+     fabPushImgElement.src = '../images/push-off.png';\n+    }\n+  }\n+\n+  //Click event for subscribe push\n+  fabPushElement.addEventListener('click', function () {\n+    var isSubscribed = (fabPushElement.dataset.checked === 'true');\n+    if (isSubscribed) {\n+      unsubscribePush();\n+    }\n+    else {\n+      subscribePush();\n+    }\n+  });\n+\n+  isPushSupported(); //Check for push notification support\n+})(window);\n+\n+```\n+\n+This bunch of code above is doing different things. Just relax, I'll explain the different parts of the code.\n+\n+```js\n+\n+//Push notification button\n+  var fabPushElement = document.querySelector('.fab__push');\n+  var fabPushImgElement = document.querySelector('.fab__image');\n+```\n+\n+![Push Notification button](https://cdn.auth0.com/blog/pwa/notification-button.png)\n+\n+_Push Notification button_\n+\n+This code above simply grabs the push notification activation and deactivation button.\n+\n+```js\n+\n+function isPushSupported() {\n+    //To check `push notification` permission is denied by user\n+    if (Notification.permission === 'denied') {\n+      alert('User has blocked push notification.');\n+      return;\n+    }\n+\n+    //Check `push notification` is supported or not\n+    if (!('PushManager' in window)) {\n+      alert('Sorry, Push notification isn\\'t supported in your browser.');\n+      return;\n+    }\n+\n+    //Get `push notification` subscription\n+    //If `serviceWorker` is registered and ready\n+    navigator.serviceWorker.ready\n+      .then(function (registration) {\n+        registration.pushManager.getSubscription()\n+        .then(function (subscription) {\n+          //If already access granted, enable push button status\n+          if (subscription) {\n+            changePushStatus(true);\n+          }\n+          else {\n+            changePushStatus(false);\n+          }\n+        })\n+        .catch(function (error) {\n+          console.error('Error occurred while enabling push ', error);\n+        });\n+      });\n+  }\n+\n+```\n+\n+This code above checks the browser to determine whether push notification is supported. Now, it's paramount that the service worker has to be registered and ready before you can even try to subscribe a user to receive push notifications. So, the code above also checks if the service worker is ready and gets the subscription of the user.","path":"_posts/2016-12-19-introduction-to-progressive-web-apps-push-notifications-part-3.markdown","position":257,"original_position":257,"commit_id":"5d40e31fa60850b8a6963a5c8260a1dae3de7849","original_commit_id":"5d40e31fa60850b8a6963a5c8260a1dae3de7849","user":{"login":"kukicado","id":1770570,"avatar_url":"https://avatars.githubusercontent.com/u/1770570?v=3","gravatar_id":"","url":"https://api.github.com/users/kukicado","html_url":"https://github.com/kukicado","followers_url":"https://api.github.com/users/kukicado/followers","following_url":"https://api.github.com/users/kukicado/following{/other_user}","gists_url":"https://api.github.com/users/kukicado/gists{/gist_id}","starred_url":"https://api.github.com/users/kukicado/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kukicado/subscriptions","organizations_url":"https://api.github.com/users/kukicado/orgs","repos_url":"https://api.github.com/users/kukicado/repos","events_url":"https://api.github.com/users/kukicado/events{/privacy}","received_events_url":"https://api.github.com/users/kukicado/received_events","type":"User","site_admin":false},"body":"Delete \"above\"","created_at":"2016-12-21T22:01:04Z","updated_at":"2016-12-21T22:08:06Z","html_url":"https://github.com/auth0/blog/pull/563#discussion_r93528164","pull_request_url":"https://api.github.com/repos/auth0/blog/pulls/563","_links":{"self":{"href":"https://api.github.com/repos/auth0/blog/pulls/comments/93528164"},"html":{"href":"https://github.com/auth0/blog/pull/563#discussion_r93528164"},"pull_request":{"href":"https://api.github.com/repos/auth0/blog/pulls/563"}}},"pull_request":{"url":"https://api.github.com/repos/auth0/blog/pulls/563","id":98959549,"html_url":"https://github.com/auth0/blog/pull/563","diff_url":"https://github.com/auth0/blog/pull/563.diff","patch_url":"https://github.com/auth0/blog/pull/563.patch","issue_url":"https://api.github.com/repos/auth0/blog/issues/563","number":563,"state":"open","locked":false,"title":"Introduction to Progressive Web Apps (Push Notifications) - Part 3","user":{"login":"unicodeveloper","id":2946769,"avatar_url":"https://avatars.githubusercontent.com/u/2946769?v=3","gravatar_id":"","url":"https://api.github.com/users/unicodeveloper","html_url":"https://github.com/unicodeveloper","followers_url":"https://api.github.com/users/unicodeveloper/followers","following_url":"https://api.github.com/users/unicodeveloper/following{/other_user}","gists_url":"https://api.github.com/users/unicodeveloper/gists{/gist_id}","starred_url":"https://api.github.com/users/unicodeveloper/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unicodeveloper/subscriptions","organizations_url":"https://api.github.com/users/unicodeveloper/orgs","repos_url":"https://api.github.com/users/unicodeveloper/repos","events_url":"https://api.github.com/users/unicodeveloper/events{/privacy}","received_events_url":"https://api.github.com/users/unicodeveloper/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-12-21T16:08:36Z","updated_at":"2016-12-21T22:08:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3e7dde9538ea277193cd6d04cd5e4ec015ec725a","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/auth0/blog/pulls/563/commits","review_comments_url":"https://api.github.com/repos/auth0/blog/pulls/563/comments","review_comment_url":"https://api.github.com/repos/auth0/blog/pulls/comments{/number}","comments_url":"https://api.github.com/repos/auth0/blog/issues/563/comments","statuses_url":"https://api.github.com/repos/auth0/blog/statuses/5d40e31fa60850b8a6963a5c8260a1dae3de7849","head":{"label":"auth0:pwa-3","ref":"pwa-3","sha":"5d40e31fa60850b8a6963a5c8260a1dae3de7849","user":{"login":"auth0","id":2824157,"avatar_url":"https://avatars.githubusercontent.com/u/2824157?v=3","gravatar_id":"","url":"https://api.github.com/users/auth0","html_url":"https://github.com/auth0","followers_url":"https://api.github.com/users/auth0/followers","following_url":"https://api.github.com/users/auth0/following{/other_user}","gists_url":"https://api.github.com/users/auth0/gists{/gist_id}","starred_url":"https://api.github.com/users/auth0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auth0/subscriptions","organizations_url":"https://api.github.com/users/auth0/orgs","repos_url":"https://api.github.com/users/auth0/repos","events_url":"https://api.github.com/users/auth0/events{/privacy}","received_events_url":"https://api.github.com/users/auth0/received_events","type":"Organization","site_admin":false},"repo":{"id":7830124,"name":"blog","full_name":"auth0/blog","owner":{"login":"auth0","id":2824157,"avatar_url":"https://avatars.githubusercontent.com/u/2824157?v=3","gravatar_id":"","url":"https://api.github.com/users/auth0","html_url":"https://github.com/auth0","followers_url":"https://api.github.com/users/auth0/followers","following_url":"https://api.github.com/users/auth0/following{/other_user}","gists_url":"https://api.github.com/users/auth0/gists{/gist_id}","starred_url":"https://api.github.com/users/auth0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auth0/subscriptions","organizations_url":"https://api.github.com/users/auth0/orgs","repos_url":"https://api.github.com/users/auth0/repos","events_url":"https://api.github.com/users/auth0/events{/privacy}","received_events_url":"https://api.github.com/users/auth0/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/auth0/blog","description":"auth0 blog","fork":false,"url":"https://api.github.com/repos/auth0/blog","forks_url":"https://api.github.com/repos/auth0/blog/forks","keys_url":"https://api.github.com/repos/auth0/blog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/auth0/blog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/auth0/blog/teams","hooks_url":"https://api.github.com/repos/auth0/blog/hooks","issue_events_url":"https://api.github.com/repos/auth0/blog/issues/events{/number}","events_url":"https://api.github.com/repos/auth0/blog/events","assignees_url":"https://api.github.com/repos/auth0/blog/assignees{/user}","branches_url":"https://api.github.com/repos/auth0/blog/branches{/branch}","tags_url":"https://api.github.com/repos/auth0/blog/tags","blobs_url":"https://api.github.com/repos/auth0/blog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/auth0/blog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/auth0/blog/git/refs{/sha}","trees_url":"https://api.github.com/repos/auth0/blog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/auth0/blog/statuses/{sha}","languages_url":"https://api.github.com/repos/auth0/blog/languages","stargazers_url":"https://api.github.com/repos/auth0/blog/stargazers","contributors_url":"https://api.github.com/repos/auth0/blog/contributors","subscribers_url":"https://api.github.com/repos/auth0/blog/subscribers","subscription_url":"https://api.github.com/repos/auth0/blog/subscription","commits_url":"https://api.github.com/repos/auth0/blog/commits{/sha}","git_commits_url":"https://api.github.com/repos/auth0/blog/git/commits{/sha}","comments_url":"https://api.github.com/repos/auth0/blog/comments{/number}","issue_comment_url":"https://api.github.com/repos/auth0/blog/issues/comments{/number}","contents_url":"https://api.github.com/repos/auth0/blog/contents/{+path}","compare_url":"https://api.github.com/repos/auth0/blog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/auth0/blog/merges","archive_url":"https://api.github.com/repos/auth0/blog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/auth0/blog/downloads","issues_url":"https://api.github.com/repos/auth0/blog/issues{/number}","pulls_url":"https://api.github.com/repos/auth0/blog/pulls{/number}","milestones_url":"https://api.github.com/repos/auth0/blog/milestones{/number}","notifications_url":"https://api.github.com/repos/auth0/blog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/auth0/blog/labels{/name}","releases_url":"https://api.github.com/repos/auth0/blog/releases{/id}","deployments_url":"https://api.github.com/repos/auth0/blog/deployments","created_at":"2013-01-25T22:57:37Z","updated_at":"2016-12-04T22:15:54Z","pushed_at":"2016-12-21T20:07:33Z","git_url":"git://github.com/auth0/blog.git","ssh_url":"git@github.com:auth0/blog.git","clone_url":"https://github.com/auth0/blog.git","svn_url":"https://github.com/auth0/blog","homepage":"https://auth0.com/blog","size":16353,"stargazers_count":26,"watchers_count":26,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":52,"mirror_url":null,"open_issues_count":19,"forks":52,"open_issues":19,"watchers":26,"default_branch":"master"}},"base":{"label":"auth0:master","ref":"master","sha":"b94a675cc59a641dd0cf97a506bfa5868a07e3b5","user":{"login":"auth0","id":2824157,"avatar_url":"https://avatars.githubusercontent.com/u/2824157?v=3","gravatar_id":"","url":"https://api.github.com/users/auth0","html_url":"https://github.com/auth0","followers_url":"https://api.github.com/users/auth0/followers","following_url":"https://api.github.com/users/auth0/following{/other_user}","gists_url":"https://api.github.com/users/auth0/gists{/gist_id}","starred_url":"https://api.github.com/users/auth0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auth0/subscriptions","organizations_url":"https://api.github.com/users/auth0/orgs","repos_url":"https://api.github.com/users/auth0/repos","events_url":"https://api.github.com/users/auth0/events{/privacy}","received_events_url":"https://api.github.com/users/auth0/received_events","type":"Organization","site_admin":false},"repo":{"id":7830124,"name":"blog","full_name":"auth0/blog","owner":{"login":"auth0","id":2824157,"avatar_url":"https://avatars.githubusercontent.com/u/2824157?v=3","gravatar_id":"","url":"https://api.github.com/users/auth0","html_url":"https://github.com/auth0","followers_url":"https://api.github.com/users/auth0/followers","following_url":"https://api.github.com/users/auth0/following{/other_user}","gists_url":"https://api.github.com/users/auth0/gists{/gist_id}","starred_url":"https://api.github.com/users/auth0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auth0/subscriptions","organizations_url":"https://api.github.com/users/auth0/orgs","repos_url":"https://api.github.com/users/auth0/repos","events_url":"https://api.github.com/users/auth0/events{/privacy}","received_events_url":"https://api.github.com/users/auth0/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/auth0/blog","description":"auth0 blog","fork":false,"url":"https://api.github.com/repos/auth0/blog","forks_url":"https://api.github.com/repos/auth0/blog/forks","keys_url":"https://api.github.com/repos/auth0/blog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/auth0/blog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/auth0/blog/teams","hooks_url":"https://api.github.com/repos/auth0/blog/hooks","issue_events_url":"https://api.github.com/repos/auth0/blog/issues/events{/number}","events_url":"https://api.github.com/repos/auth0/blog/events","assignees_url":"https://api.github.com/repos/auth0/blog/assignees{/user}","branches_url":"https://api.github.com/repos/auth0/blog/branches{/branch}","tags_url":"https://api.github.com/repos/auth0/blog/tags","blobs_url":"https://api.github.com/repos/auth0/blog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/auth0/blog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/auth0/blog/git/refs{/sha}","trees_url":"https://api.github.com/repos/auth0/blog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/auth0/blog/statuses/{sha}","languages_url":"https://api.github.com/repos/auth0/blog/languages","stargazers_url":"https://api.github.com/repos/auth0/blog/stargazers","contributors_url":"https://api.github.com/repos/auth0/blog/contributors","subscribers_url":"https://api.github.com/repos/auth0/blog/subscribers","subscription_url":"https://api.github.com/repos/auth0/blog/subscription","commits_url":"https://api.github.com/repos/auth0/blog/commits{/sha}","git_commits_url":"https://api.github.com/repos/auth0/blog/git/commits{/sha}","comments_url":"https://api.github.com/repos/auth0/blog/comments{/number}","issue_comment_url":"https://api.github.com/repos/auth0/blog/issues/comments{/number}","contents_url":"https://api.github.com/repos/auth0/blog/contents/{+path}","compare_url":"https://api.github.com/repos/auth0/blog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/auth0/blog/merges","archive_url":"https://api.github.com/repos/auth0/blog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/auth0/blog/downloads","issues_url":"https://api.github.com/repos/auth0/blog/issues{/number}","pulls_url":"https://api.github.com/repos/auth0/blog/pulls{/number}","milestones_url":"https://api.github.com/repos/auth0/blog/milestones{/number}","notifications_url":"https://api.github.com/repos/auth0/blog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/auth0/blog/labels{/name}","releases_url":"https://api.github.com/repos/auth0/blog/releases{/id}","deployments_url":"https://api.github.com/repos/auth0/blog/deployments","created_at":"2013-01-25T22:57:37Z","updated_at":"2016-12-04T22:15:54Z","pushed_at":"2016-12-21T20:07:33Z","git_url":"git://github.com/auth0/blog.git","ssh_url":"git@github.com:auth0/blog.git","clone_url":"https://github.com/auth0/blog.git","svn_url":"https://github.com/auth0/blog","homepage":"https://auth0.com/blog","size":16353,"stargazers_count":26,"watchers_count":26,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":52,"mirror_url":null,"open_issues_count":19,"forks":52,"open_issues":19,"watchers":26,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/auth0/blog/pulls/563"},"html":{"href":"https://github.com/auth0/blog/pull/563"},"issue":{"href":"https://api.github.com/repos/auth0/blog/issues/563"},"comments":{"href":"https://api.github.com/repos/auth0/blog/issues/563/comments"},"review_comments":{"href":"https://api.github.com/repos/auth0/blog/pulls/563/comments"},"review_comment":{"href":"https://api.github.com/repos/auth0/blog/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/auth0/blog/pulls/563/commits"},"statuses":{"href":"https://api.github.com/repos/auth0/blog/statuses/5d40e31fa60850b8a6963a5c8260a1dae3de7849"}}}}
{"actor":{"display_login":"kukicado"}}