{"info":{"_postman_id":"1a546be5-7f8c-43d7-bfb2-991dc754d825","name":"loginwith.me","description":"<html><head></head><body><p>This is the API documentation for loginwith.me which allows you to programmatically create sessions and executables to establish remote connections, send emails, get chat logs, and more.</p>\n<p>Note that the terminology \"presenter\" as used throughout the documentation is referring to the software which runs on the PC and allows users to connect to the PC through the loginwith.me website. The term \"viewer\" refers to the webpage on the loginwith.me website which allows a user to both view and take control of the presenter's screen. Also note that there can be multiple viewers per remote session, but only one presenter.</p>\n<p>This API is permitted for for use by individuals for PERSONAL USE and business for INTERNAL USE. If you wish to sell or otherwise distribute a product which makes use of this API, you you must have a signed licenses agreement by Tier2 Technologies.</p>\n<p>Obtaining such a licenses agreement is easy and inexpensive; or in some cases free. Email <a href=\"mailto:support@tier2.tech\">support@tier2.tech</a> for more info.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"11345233","collectionId":"1a546be5-7f8c-43d7-bfb2-991dc754d825","publishedId":"TzshHkS2","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"publishDate":"2021-08-04T20:45:03.000Z"},"item":[{"name":"regions","id":"43348d94-bff1-497e-837e-0e879157bd66","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://www.loginwith.me/api/v1/regions","description":"<p>The first step of establishing a remote session is to decide which region you want to allocate the session in. This is important because remote-support is a latency-sensitive activity, so you want the session-host to be as low-latency as possible. That generally means that you want to pick a region as physically close to you as possible.</p>\n<p>This example shows how to query for the available regions, but to automatically determine which region among these is the best choice, you must perform a latency test on each region by querying a subdomain on the loginwith.me site which is named the same as the region: https://{region}.loginwith.me</p>\n<p>For example, to test the latency of \"us-east-1\" you would perform an HTTP GET on us-east-1.loginwith.me and you would time the milliseconds it takes to respond.</p>\n<p>Repeat this process for each region returned in the /regions query and choose the region with the lowest response time. (Note that it's best the perform the test multiple times on each region and pick the best of <em>all</em> results because things other than network latency can contribute to the response time -- such as server-load)</p>\n<p>Since doing this is a non-trivial development exercise, we have published a JavaScript library which will do the heavy-lifting for you:\n<a href=\"https://www.loginwith.me/resources/latency_test.js\">https://www.loginwith.me/resources/latency_test.js</a></p>\n<p>We also have an example of how to use the library:\n<a href=\"https://www.loginwith.me/resources/latency_example.html\">https://www.loginwith.me/resources/latency_example.html</a></p>\n","urlObject":{"protocol":"https","path":["api","v1","regions"],"host":["www","loginwith","me"],"query":[],"variable":[]}},"response":[{"id":"ebffd03e-e89e-41f1-bd5b-455d5cce7c39","name":"regions","originalRequest":{"method":"GET","header":[],"url":"https://www.loginwith.me/api/v1/regions"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Wed, 04 Aug 2021 22:55:48 GMT"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Content-Security-Policy","value":"default-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; child-src 'self'; connect-src *.loginwith.me *.tier2.tech; font-src 'self'; frame-src 'self'; img-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'self'; prefetch-src 'self'; script-src 'self'; script-src-elem 'self'; script-src-attr 'self'; style-src 'self'; style-src-elem 'self'; style-src-attr 'self'; worker-src 'self';"},{"key":"Strict-Transport-Security","value":"max-age=15768000; includeSubDomains; preload"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"},{"key":"Permissions-Policy","value":"geolocation=(self), camera=(self), fullscreen=(self), microphone=()"},{"key":"Cache-Control","value":"no-cache, no-store, must-revalidate"},{"key":"Expires","value":"0"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"CF-Cache-Status","value":"DYNAMIC"},{"key":"Expect-CT","value":"max-age=604800, report-uri=\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""},{"key":"Report-To","value":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=GXBWTQotMD5Nit%2FFhNLbDGk%2BRaKuKLBuQ%2Bxnmx9yz7zHm4vXjrHLghDI6pvA19tz0iZNNcvlLJd2bQIJk2h6HdKXckBCGzzblz9kMQS0hBC2cQeuy9H5p89%2B7FXBhGPzR9i%2F\"}],\"group\":\"cf-nel\",\"max_age\":604800}"},{"key":"NEL","value":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}"},{"key":"Server","value":"cloudflare"},{"key":"CF-RAY","value":"679b60168b2e1084-ATL"},{"key":"Content-Encoding","value":"br"},{"key":"alt-svc","value":"h3-27=\":443\"; ma=86400, h3-28=\":443\"; ma=86400, h3-29=\":443\"; ma=86400, h3=\":443\"; ma=86400"}],"cookie":[],"responseTime":null,"body":"[\n    \"ap-southeast-2\",\n    \"us-east-1\",\n    \"us-west-2\",\n    \"eu-west-2\",\n    \"ca-central-1\"\n]"}],"_postman_id":"43348d94-bff1-497e-837e-0e879157bd66"},{"name":"session_pin","id":"e235f2d4-c0d3-4d9f-96cd-76854d8305a9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://www.loginwith.me/api/v1/session_pin?region=us-east-1","description":"<p>After you have determined which region will best suite your needs by querying /regions, and performing a latency test, it's time to allocate a session within that region. Once the session is allocated, you will receive a \"Session PIN\" which is used to authenticate both the presenter and the viewer, and is important to keep private while the session is in progress. Anyone with the Session PIN can have access to the presenter's PC, so treat it with care.</p>\n","urlObject":{"protocol":"https","path":["api","v1","session_pin"],"host":["www","loginwith","me"],"query":[{"key":"region","value":"us-east-1"}],"variable":[]}},"response":[{"id":"1ce71185-39b7-41b2-8bae-1b223a8220b0","name":"session_pin","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://www.loginwith.me/api/v1/session_pin?region=us-east-1","protocol":"https","host":["www","loginwith","me"],"path":["api","v1","session_pin"],"query":[{"key":"region","value":"us-east-1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Wed, 04 Aug 2021 22:55:56 GMT"},{"key":"Server","value":"Apache/2.4.41 (Ubuntu)"},{"key":"Content-Security-Policy","value":"default-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; child-src 'self'; connect-src 'self'; font-src 'self'; frame-src 'self'; img-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'self'; prefetch-src 'self'; script-src 'self'; script-src-elem 'self'; script-src-attr 'self'; style-src 'self'; style-src-elem 'self'; style-src-attr 'self'; worker-src 'self';"},{"key":"Strict-Transport-Security","value":"max-age=15768000; includeSubDomains; preload"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"},{"key":"Permissions-Policy","value":"geolocation=(self), camera=(self), fullscreen=(self), microphone=()"},{"key":"Cache-Control","value":"no-cache, no-store, must-revalidate"},{"key":"Expires","value":"0"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Content-Length","value":"44"},{"key":"Keep-Alive","value":"timeout=5, max=99"},{"key":"Connection","value":"Keep-Alive"},{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"session_pin\": \"7W2-97-8570\"\n}"}],"_postman_id":"e235f2d4-c0d3-4d9f-96cd-76854d8305a9"},{"name":"hook","id":"85545628-ca64-4e1a-99eb-e6d4815712d4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n    \"type\": \"viewer_started\",\r\n    \"url\": \"https://www.loginwith.me/api/v1/email/loginwithme@example.com\",\r\n    \"session_pin\": \"7W2-97-8570\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://www.loginwith.me/api/v1/hook/","description":"<p>This API endpoint can be used to create webhooks for a given session. When a webhook is created for a given URL, that URL will receive a JSON POST from the loginwith.me session broker when certain events occur -- along with with information about the event.</p>\n<p>There are currently four types of events that are supported:</p>\n<h4 id=\"viewer_started\">viewer_started</h4>\n<p>This webhook is fired when a browser viewer is started (when a web browser navigates to the URL provided by the /session_url query). Note that loginwith.me supports multiple viewers on each session, and a viewer may end and then restart (such as if the page is refreshed), so this event can be made to fire multiple times throughout a session.</p>\n<p>Note that the output from this event is compatible with the input for the /email API endpoint, and can therefore be used to notify a presenter (by email) that a viewer is waiting for them as soon as the viewer connects.</p>\n<h4 id=\"presenter_started\">presenter_started</h4>\n<p>This webhook is fired when a presenter executable is in a state in which a viewer can now connect and view the screen. (when the user has run the program). Note that the exe could be clicked several times by the user, which would cause the app to restart each time; and so this event could be made to fire multiple times.</p>\n<p>Note that the output from this event is compatible with the input for the /email API endpoint, and can therefore be used to notify a viewer (by email) that a presenter is waiting for them as soon as the presenter connects.</p>\n<h4 id=\"presenter_offline\">presenter_offline</h4>\n<p>This webhook is fired when a presenter which had been online in the past (and submitted a presenter_started hook) is no longer online. This could be because the session was purposely ended, or from a network outage, computer crash, etc. Note that this will only fire after the presenter has been offline for &gt; 60 seconds to prevent false notification from presenters restarting to elevate to admin, or from short network-blips.</p>\n<h4 id=\"viewer_offline\">viewer_offline</h4>\n<p>This webhook is fired when a viweer which had been online in the past (and submitted a viewer_started hook) is no longer online. This could be because the session was purposely ended, or from a network outage, closed browser window, etc. Note that this will only fire after the viewer has been offline for &gt; 60 seconds to prevent false notification from viewers restarting from refreshing the page, or from short network-blips. Also note that loginwith.me supports multiple viewers for a single presenter, and this will only fire 60 seconds after <em>all</em> viewers are offline.</p>\n<h3 id=\"caveats\">caveats</h3>\n<p>Note that only four hooks can be set per-session at any given time. Calling the endpoint again will only <em>edit</em> a hook URL for a given type, not create an additional hook. If you need a single event to post a webhook to multiple URL's then you must design an external webhook relay, which can accept the single hook and then forward that request to your desired other URLs</p>\n<p>Note that once a hook fires, it has been \"consumed\" and will not <em>by default</em> fire a second time, even if the same event occurs again. It can, however, be <em>made</em> to fire again on subsequent events by having the receiver call this same API endpoint again with the same parameters to \"re-set\" the hook each time it is consumed.</p>\n","urlObject":{"protocol":"https","path":["api","v1","hook",""],"host":["www","loginwith","me"],"query":[],"variable":[]}},"response":[{"id":"3d1891fd-1ada-4f3c-9820-b49f85f9d721","name":"hook","originalRequest":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n    \"type\": \"viewer_started\",\r\n    \"url\": \"https://www.loginwith.me/api/v1/email/loginwithme@example.com\",\r\n    \"session_pin\": \"7W2-97-8570\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://www.loginwith.me/api/v1/hook/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Wed, 04 Aug 2021 22:56:13 GMT"},{"key":"Server","value":"Apache/2.4.41 (Ubuntu)"},{"key":"Content-Security-Policy","value":"default-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; child-src 'self'; connect-src 'self'; font-src 'self'; frame-src 'self'; img-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'self'; prefetch-src 'self'; script-src 'self'; script-src-elem 'self'; script-src-attr 'self'; style-src 'self'; style-src-elem 'self'; style-src-attr 'self'; worker-src 'self';"},{"key":"Strict-Transport-Security","value":"max-age=15768000; includeSubDomains; preload"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"},{"key":"Permissions-Policy","value":"geolocation=(self), camera=(self), fullscreen=(self), microphone=()"},{"key":"Cache-Control","value":"no-cache, no-store, must-revalidate"},{"key":"Expires","value":"0"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Content-Length","value":"23"},{"key":"Keep-Alive","value":"timeout=5, max=99"},{"key":"Connection","value":"Keep-Alive"},{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true\n}"}],"_postman_id":"85545628-ca64-4e1a-99eb-e6d4815712d4"},{"name":"session_url","id":"881b9868-cdf4-42dc-b1a2-8f72fc020f0a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://www.loginwith.me/api/v1/session_url?session_pin=7W2-97-8570&ro=false","description":"<p>In order for a viewer to be able to connect to the session, a browser must navigate to the Session URL. This is an example of how to retrieve the Session URL for a given Session PIN. The \"ro\" parameter stands for \"read only\" and will cause the viewer to ignore keyboard/mouse inputs. This is not a security feature - it is easy to bypass. It is meant to be used as a convenience feature to allow multiple \"passenger\" viewers to shadow a single \"driver\" viewer - so that people are not accidently taking control of the mouse when they only intended to be spectators.</p>\n","urlObject":{"protocol":"https","path":["api","v1","session_url"],"host":["www","loginwith","me"],"query":[{"key":"session_pin","value":"7W2-97-8570"},{"key":"ro","value":"false"}],"variable":[]}},"response":[{"id":"30a97249-45ed-45b9-98c3-b0338299f2fd","name":"session_url","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://www.loginwith.me/api/v1/session_url?session_pin=7W2-97-8570&ro=false","protocol":"https","host":["www","loginwith","me"],"path":["api","v1","session_url"],"query":[{"key":"session_pin","value":"7W2-97-8570"},{"key":"ro","value":"false"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Wed, 04 Aug 2021 22:56:23 GMT"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"content-security-policy","value":"default-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; child-src 'self'; connect-src *.loginwith.me *.tier2.tech; font-src 'self'; frame-src 'self'; img-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'self'; prefetch-src 'self'; script-src 'self'; script-src-elem 'self'; script-src-attr 'self'; style-src 'self'; style-src-elem 'self'; style-src-attr 'self'; worker-src 'self';"},{"key":"strict-transport-security","value":"max-age=15768000; includeSubDomains; preload"},{"key":"x-frame-options","value":"SAMEORIGIN"},{"key":"x-content-type-options","value":"nosniff"},{"key":"referrer-policy","value":"same-origin"},{"key":"permissions-policy","value":"geolocation=(self), camera=(self), fullscreen=(self), microphone=()"},{"key":"cache-control","value":"no-cache, no-store, must-revalidate"},{"key":"expires","value":"0"},{"key":"access-control-allow-origin","value":"*"},{"key":"CF-Cache-Status","value":"DYNAMIC"},{"key":"Expect-CT","value":"max-age=604800, report-uri=\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""},{"key":"Report-To","value":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=nVPdncDKcvLureJYM4ZyT4dzayYoF0CCFqsHiAcMt7OaDJyV0AHqPTwNUgCpXt4UEINC6T%2FHut3zSHHDlv0XJxxKPWwetJ6E%2B48%2BuXKAYZjKHtkH72N9dHBTQcxnwnpahaaG\"}],\"group\":\"cf-nel\",\"max_age\":604800}"},{"key":"NEL","value":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}"},{"key":"Server","value":"cloudflare"},{"key":"CF-RAY","value":"679b60f43eb91084-ATL"},{"key":"Content-Encoding","value":"br"},{"key":"alt-svc","value":"h3-27=\":443\"; ma=86400, h3-28=\":443\"; ma=86400, h3-29=\":443\"; ma=86400, h3=\":443\"; ma=86400"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"url\": \"https://connect.tier2.tech/view?session_pin=7W2-97-8570&un=&ro=false\"\n}"}],"_postman_id":"881b9868-cdf4-42dc-b1a2-8f72fc020f0a"},{"name":"session_parameters","id":"a8d21f0c-2e1b-4340-916e-a5a78eeedc3c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://www.loginwith.me/api/v1/session_parameters?session_pin=72F-35-1709","description":"<p>This API call is a prerequisite to the /session_exe call. This call allows you to gather all the information that is needed to compile a custom executable file which will be able to connect to a given session.</p>\n<p>Note that the information contained here is sensitive; and could allow an attacker to access the presenter's PC while bypassing the loginwith.me secure tunnel and other safeguards. Because of this, this API request should be performed <em>by the presenter machine</em> (we do so with JavaScript XMLHttpRequest from the presenter browser on the main site).</p>\n<p>Note that since this information is so sensitive, we only allow this call to happen a single time per session. This mitigates all practical attacks because it prevents an attacker from gathering this information even if they know the session pin.</p>\n<h3 id=\"caveats\">Caveats</h3>\n<p>Since this information is required to compile an executable to start the presenter-side of the session, and since it is only able to be queried a single time, it is necessary to cache this information in case the presenter needs to re-download a new exe file again. Just make sure that the information is cached <em>in a secure location on the presenter machine and nowhere else</em> to maintain high security.</p>\n","urlObject":{"protocol":"https","path":["api","v1","session_parameters"],"host":["www","loginwith","me"],"query":[{"key":"session_pin","value":"72F-35-1709"}],"variable":[]}},"response":[{"id":"15299b75-1372-4bbb-81b3-8214a0c113bc","name":"session_parameters","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://www.loginwith.me/api/v1/session_parameters?session_pin=72F-35-1709","protocol":"https","host":["www","loginwith","me"],"path":["api","v1","session_parameters"],"query":[{"key":"session_pin","value":"72F-35-1709"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Mon, 20 Dec 2021 16:46:47 GMT"},{"key":"Server","value":"Apache/2.4.41 (Ubuntu)"},{"key":"Content-Security-Policy","value":"default-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; child-src 'self'; connect-src *.loginwith.me 'self'; font-src 'self'; frame-src 'self'; img-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'self'; prefetch-src 'self'; script-src 'self'; script-src-elem 'self'; script-src-attr 'self'; style-src 'self'; style-src-elem 'self'; style-src-attr 'self'; worker-src 'self';"},{"key":"Strict-Transport-Security","value":"max-age=15768000; includeSubDomains; preload"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"},{"key":"Permissions-Policy","value":"geolocation=(self), camera=(self), fullscreen=(self), microphone=()"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Cache-Control","value":"no-cache, no-store, must-revalidate"},{"key":"Expires","value":"0"},{"key":"Content-Length","value":"521"},{"key":"Keep-Alive","value":"timeout=5, max=98"},{"key":"Connection","value":"Keep-Alive"},{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"conf\": \"eyJ0dGwiOjE2NDAxMDUyMDAsInNlc3Npb25faG9zdCI6InVzLWVhc3QtMWIubG9naW53aXRoLm1lIiwic3NoX3BvcnQiOjQ0Mywic2Z0cF91c2VyIjoiNWJhNjdkbmU1cHpicSIsInNmdHBfcGFzcyI6InpheGVydG9xZHM3dTIiLCJyZmJfcG9ydCI6NTY2ODksInJmYl9lbmNfa2V5IjoiYjllMWE4YzQwZDVjYjFjYSIsInB1bHNlYXVkaW9fcG9ydCI6NTY2OTAsInNmdHBfcG9ydCI6NTY2ODgsInNlc3Npb25fcGluIjoiNzJGLTM1LTE3MDkiLCJob3N0X2tleSI6ImUzOmEzOmU0OjI3OmY2OmQzOjUwOjlhOjQwOjNmOjUxOjg1OjNlOjAwOmZmOmRjIiwidmVyc2lvbiI6IjIxLjEyLjkuNDEzNzIifQ\",\n    \"version\": \"21.12.9.41372\"\n}"}],"_postman_id":"a8d21f0c-2e1b-4340-916e-a5a78eeedc3c"},{"name":"session_exe","id":"011d4432-1e84-4391-b604-4f6daae8b3c6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://www.loginwith.me/api/v1/session_exe?hide_progress=false&self_delete=true&conf=eyJ0dGwiOjE2NDAxMDUyMDAsInNlc3Npb25faG9zdCI6InVzLWVhc3QtMWIubG9naW53aXRoLm1lIiwic3NoX3BvcnQiOjQ0Mywic2Z0cF91c2VyIjoiNWJhNjdkbmU1cHpicSIsInNmdHBfcGFzcyI6InpheGVydG9xZHM3dTIiLCJyZmJfcG9ydCI6NTY2ODksInJmYl9lbmNfa2V5IjoiYjllMWE4YzQwZDVjYjFjYSIsInB1bHNlYXVkaW9fcG9ydCI6NTY2OTAsInNmdHBfcG9ydCI6NTY2ODgsInNlc3Npb25fcGluIjoiNzJGLTM1LTE3MDkiLCJob3N0X2tleSI6ImUzOmEzOmU0OjI3OmY2OmQzOjUwOjlhOjQwOjNmOjUxOjg1OjNlOjAwOmZmOmRjIiwidmVyc2lvbiI6IjIxLjEyLjkuNDEzNzIifQ","description":"<p>This request compiles and downloads the signed exe-file which allows the presenter to start the session. Note that it's response is the raw-binary of the exe-file. The conf parameter required to construct this request come from the /session_parameters API endpoint response.</p>\n<p>The \"hide_progress\" parameter builds an exe which does or does not have a progress-bar display while it is unpacking to temp. We recommend hide_progress=false for situations where the end-user is going to execute the file themselves and hide_progress=true for situations where a script of other external program will be doing it for them.</p>\n<p>The \"self_delete\" parameter controls weather the exe will delete itself after being ran. We generally recommend setting this to true. Since the usefulness of the executable is limited to the time the session TTL is valid, and leaving the exe on the machine serves little purpose.</p>\n","urlObject":{"protocol":"https","path":["api","v1","session_exe"],"host":["www","loginwith","me"],"query":[{"key":"hide_progress","value":"false"},{"key":"self_delete","value":"true"},{"key":"conf","value":"eyJ0dGwiOjE2NDAxMDUyMDAsInNlc3Npb25faG9zdCI6InVzLWVhc3QtMWIubG9naW53aXRoLm1lIiwic3NoX3BvcnQiOjQ0Mywic2Z0cF91c2VyIjoiNWJhNjdkbmU1cHpicSIsInNmdHBfcGFzcyI6InpheGVydG9xZHM3dTIiLCJyZmJfcG9ydCI6NTY2ODksInJmYl9lbmNfa2V5IjoiYjllMWE4YzQwZDVjYjFjYSIsInB1bHNlYXVkaW9fcG9ydCI6NTY2OTAsInNmdHBfcG9ydCI6NTY2ODgsInNlc3Npb25fcGluIjoiNzJGLTM1LTE3MDkiLCJob3N0X2tleSI6ImUzOmEzOmU0OjI3OmY2OmQzOjUwOjlhOjQwOjNmOjUxOjg1OjNlOjAwOmZmOmRjIiwidmVyc2lvbiI6IjIxLjEyLjkuNDEzNzIifQ"}],"variable":[]}},"response":[],"_postman_id":"011d4432-1e84-4391-b604-4f6daae8b3c6"},{"name":"chat","id":"26e7be2a-7f7d-4785-be64-c998d58af374","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://www.loginwith.me/api/v1/chat?session_pin=0LL-7L-8WY8","description":"<p>The /chat API endpoint allows you to programmatically retrieve the chat logs for a given session. An excellent use of this request would be to do so in response to the \"viewer_offline\" webhook (as set in the /hook API endpoint) because the \"viewer_offline\" webhook doesn't fire until a full-minute after all viewers have ended, which is a pretty good indication that the session is over. (\"presenter_offline\" is less reliable as such an indication since the viewers may have just just closed their tab - which leaves the presenter session active)</p>\n","urlObject":{"protocol":"https","path":["api","v1","chat"],"host":["www","loginwith","me"],"query":[{"key":"session_pin","value":"0LL-7L-8WY8"}],"variable":[]}},"response":[{"id":"2df9f75b-c6d4-4e37-be2b-a66b10de284b","name":"chat","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://www.loginwith.me/api/v1/chat?session_pin=Y4L-30-W32L","protocol":"https","host":["www","loginwith","me"],"path":["api","v1","chat"],"query":[{"key":"session_pin","value":"Y4L-30-W32L"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 06 Aug 2021 14:33:11 GMT"},{"key":"Server","value":"Apache/2.4.41 (Ubuntu)"},{"key":"Content-Security-Policy","value":"default-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; child-src 'self'; connect-src 'self'; font-src 'self'; frame-src 'self'; img-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'self'; prefetch-src 'self'; script-src 'self'; script-src-elem 'self'; script-src-attr 'self'; style-src 'self'; style-src-elem 'self'; style-src-attr 'self'; worker-src 'self';"},{"key":"Strict-Transport-Security","value":"max-age=15768000; includeSubDomains; preload"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"},{"key":"Permissions-Policy","value":"geolocation=(self), camera=(self), fullscreen=(self), microphone=()"},{"key":"Cache-Control","value":"no-cache, no-store, must-revalidate"},{"key":"Expires","value":"0"},{"key":"Content-Length","value":"823"},{"key":"Keep-Alive","value":"timeout=5, max=100"},{"key":"Connection","value":"Keep-Alive"},{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"chat\": [\n        {\n            \"guid\": \"67078871-065c-412c-8a3e-7751fddfb91f\",\n            \"ttl\": 1628346371,\n            \"timestamp\": 1628259971,\n            \"session_pin\": \"Y4L-30-W32L\",\n            \"subject\": \"Chris\",\n            \"body\": \"hey!\"\n        },\n        {\n            \"guid\": \"328643b0-6441-4e66-9ee8-587ee74b1048\",\n            \"ttl\": 1628346392,\n            \"timestamp\": 1628259992,\n            \"session_pin\": \"Y4L-30-W32L\",\n            \"subject\": \"space man@¿\",\n            \"body\": \"Oh, hi. How are you?\"\n        },\n        {\n            \"guid\": \"d187d19f-ee00-4d9c-aa05-18bf38c92478\",\n            \"ttl\": 1628346404,\n            \"timestamp\": 1628260004,\n            \"session_pin\": \"Y4L-30-W32L\",\n            \"subject\": \"Chris\",\n            \"body\": \"well...\"\n        }\n    ]\n}"}],"_postman_id":"26e7be2a-7f7d-4785-be64-c998d58af374"},{"name":"email","id":"23171830-ef6c-4406-b496-dd4316203b70","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"type\": \"presenter_started\",\r\n    \"name\": \"John\",\r\n    \"session_pin\": \"7W2-97-8570\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://www.loginwith.me/api/v1/email/john@example.com","description":"<p>The /email endpoint allows you to send email notifications through loginwith.me about a session being ready. There are two \"type\" templates which can be used to send a notification, the \"presenter_started\" and \"viewer_started\" type.</p>\n<p>The presenter_started type will send a template email telling the user that a remote session is ready for them to join and that the presenter (who is named \"name\") is already connected and ready for you - the viewer - to join. And provides a link to the viewer URL (as if from the /session_url endpoint).</p>\n<p>The viewer_started type will send a template email telling the user that a remote session is ready for them to join and that the viewer (who is named \"name\") is already connected and ready for you - the presenter - to join. And provides a link to the presenter URL (as if from the /session_exe endpoint). This one also handles all of the secure caching (as discussed in the /session_parameters endpoint documentation) for you.</p>\n","urlObject":{"protocol":"https","path":["api","v1","email","john@example.com"],"host":["www","loginwith","me"],"query":[],"variable":[]}},"response":[{"id":"11daf96a-0d8e-4f4f-a131-950a8d454817","name":"email","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"type\": \"presenter_started\",\r\n    \"name\": \"John\",\r\n    \"session_pin\": \"7W2-97-8570\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://www.loginwith.me/api/v1/email/john@example.com"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Wed, 04 Aug 2021 22:58:02 GMT"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"23"},{"key":"Connection","value":"keep-alive"},{"key":"Content-Security-Policy","value":"default-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; child-src 'self'; connect-src *.loginwith.me *.tier2.tech; font-src 'self'; frame-src 'self'; img-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'self'; prefetch-src 'self'; script-src 'self'; script-src-elem 'self'; script-src-attr 'self'; style-src 'self'; style-src-elem 'self'; style-src-attr 'self'; worker-src 'self';"},{"key":"Strict-Transport-Security","value":"max-age=15768000; includeSubDomains; preload"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"same-origin"},{"key":"Permissions-Policy","value":"geolocation=(self), camera=(self), fullscreen=(self), microphone=()"},{"key":"Cache-Control","value":"no-cache, no-store, must-revalidate"},{"key":"Expires","value":"0"},{"key":"CF-Cache-Status","value":"DYNAMIC"},{"key":"Expect-CT","value":"max-age=604800, report-uri=\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""},{"key":"Report-To","value":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=TLV0wkvULMu9hgH%2FwPUH%2BI5BNlu%2F71bgNVzKOKZiywH14NIT1p0BPrsT1a9b7%2B%2Bi4lusfioDG7WlTPaSfQ5ha1dU3nXiHrQf2rUNqLljp29nHkVmEgrcSc1RS9roI8EuETTl\"}],\"group\":\"cf-nel\",\"max_age\":604800}"},{"key":"NEL","value":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}"},{"key":"Server","value":"cloudflare"},{"key":"CF-RAY","value":"679b635d4adf1084-ATL"},{"key":"alt-svc","value":"h3-27=\":443\"; ma=86400, h3-28=\":443\"; ma=86400, h3-29=\":443\"; ma=86400, h3=\":443\"; ma=86400"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true\n}"}],"_postman_id":"23171830-ef6c-4406-b496-dd4316203b70"},{"name":"report_abuse","id":"c97ba6c6-aafb-4b0e-953a-326c0d02a584","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"user_agent\": \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36\",\r\n    \"session_pin\": \"0LL-7L-8WY8\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://www.loginwith.me/api/v1/report_abuse","description":"<p>The /report_abuse endpoint allows you to report scammers who are trying to use the platform for nefarious purposes to us.</p>\n<p>This is the endpoint used by the\n<a href=\"https://www.loginwith.me/abuse/\">https://www.loginwith.me/abuse/</a>\npage.</p>\n<p>We use a \"The Three Strikes and You're Out\" policy to abuse. If we get three reports that a given IP address has generated a Session PIN (via GET: /session_pin) which was then reported as abuseful, then we block that IP address from the platform automatically.</p>\n<p>Note that to count as a \"Strike\" it would have to be a report that is a unique IP address of the \"reporter\". So, for example, you could not get another user blocked by yourself by making three calls to this API endpoint; The /report_abuse calls must come from three different reporting IP addresses.</p>\n<p>Similarly, you if you happen to have access to three different IP addresses, you cannot get another user blocked by yourself by making one call to /report_abuse from each IP address using the same session_pin parameter. The abuse reports must have been unique both among three different Session PINs and reporting IP addresses.</p>\n","urlObject":{"protocol":"https","path":["api","v1","report_abuse"],"host":["www","loginwith","me"],"query":[],"variable":[]}},"response":[{"id":"672f0319-c7b1-475b-a16b-262725c16f80","name":"report_abuse","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"user_agent\": \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36\",\r\n    \"session_pin\": \"7W2-97-8570\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://www.loginwith.me/api/v1/report_abuse"},"status":"OK","code":200,"_postman_previewlanguage":"html","header":[{"key":"Date","value":"Wed, 04 Aug 2021 22:58:11 GMT"},{"key":"Content-Type","value":"text/html; charset=UTF-8"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"content-security-policy","value":"default-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; child-src 'self'; connect-src *.loginwith.me *.tier2.tech; font-src 'self'; frame-src 'self'; img-src 'self'; manifest-src 'self'; media-src 'self'; object-src 'self'; prefetch-src 'self'; script-src 'self'; script-src-elem 'self'; script-src-attr 'self'; style-src 'self'; style-src-elem 'self'; style-src-attr 'self'; worker-src 'self';"},{"key":"strict-transport-security","value":"max-age=15768000; includeSubDomains; preload"},{"key":"x-frame-options","value":"SAMEORIGIN"},{"key":"x-content-type-options","value":"nosniff"},{"key":"referrer-policy","value":"same-origin"},{"key":"permissions-policy","value":"geolocation=(self), camera=(self), fullscreen=(self), microphone=()"},{"key":"cache-control","value":"no-cache, no-store, must-revalidate"},{"key":"expires","value":"0"},{"key":"CF-Cache-Status","value":"DYNAMIC"},{"key":"Expect-CT","value":"max-age=604800, report-uri=\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""},{"key":"Report-To","value":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=BpIQSn1PlnWhSiO8qqpO7ZyVs0KdahC0%2FjvPXhluz%2F%2F1xc5CP%2FJLOVfPYBrtZCEjGEav6CyPMG869sKYMj6eqe7CocgD%2BN9nLuwWWpPrw9WNwu2K9qxVfqGc3Of2aBwpRtDS\"}],\"group\":\"cf-nel\",\"max_age\":604800}"},{"key":"NEL","value":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}"},{"key":"Server","value":"cloudflare"},{"key":"CF-RAY","value":"679b6393fb761084-ATL"},{"key":"Content-Encoding","value":"br"},{"key":"alt-svc","value":"h3-27=\":443\"; ma=86400, h3-28=\":443\"; ma=86400, h3-29=\":443\"; ma=86400, h3=\":443\"; ma=86400"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true\n}"}],"_postman_id":"c97ba6c6-aafb-4b0e-953a-326c0d02a584"}]}