[{"id":3286,"date":"2024-04-06T12:35:29","date_gmt":"2024-04-06T17:35:29","guid":{"rendered":"https:\/\/digitalborn.org\/?p=3286"},"modified":"2024-11-07T11:13:18","modified_gmt":"2024-11-07T16:13:18","slug":"converting-books-to-json-a-digital-humanities-project","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/converting-books-to-json-a-digital-humanities-project\/","title":{"rendered":"Converting Books to JSON: A Digital Humanities Project"},"content":{"rendered":"\n<p>Note: This post is adapted on November 6, 2024, from my ACH2024 presentation titled, &#8220;A hybrid approach to digitizing and structuring complex print texts using AI.&#8221;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Introduction<\/h3>\n\n\n\n<p>If you&#8217;re reading this, you are probably in a situation similar to the one I found myself in&#8211;I had a set of books that had not been digitized, and I wanted to perform document analysis across this dataset. Converting historical documents from their original formats into structured, machine-readable data is a crucial step in enabling data analysis. However, the path from print book to machine-readable data presents several challenges including digitization, optical character recognition (OCR), data cleaning, structure and formatting, data extraction, and variations and special cases across issues or volumes. This was particularly tricky for this project because each issue had 1. different standard listing fields, and 2. individual listings that included or omitted different parts of the listing information. I couldn&#8217;t manually capture all of this information without spending several weeks of painful data scraping and cleaning. I couldn&#8217;t use my typical approach to define the document structure because there was so much variation between issues and listing information. <\/p>\n\n\n\n<p>So&#8230; this seemed like a good scenario for combining traditional digitization and computer vision approaches with emergent generative AI models.<\/p>\n\n\n\n<p>This post discusses a recent project where I scanned PDF issues of the Council of Literary Magazines and Presses (CLMP) <em>Directory of Literary Magazines<\/em> from 1995 to 2005 and converted those 10 directories into clean, well-structured JSON. The process encompassed several stages, including PDF to text conversion, data cleaning, and data extraction using Python scripts and AI-powered tools like GPT. <\/p>\n\n\n\n<p>I cover the options for three different potential audiences: 1. Novice, 2. Intermediate, and 3. Developer.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Planning<\/h3>\n\n\n\n<p>The initial step, regardless of your skill level, involves: 1) Physical Document Assessment, and 2) Digitization Strategy.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Physical Document Assessment\n<ul class=\"wp-block-list\">\n<li>Evaluate your document conditions and quality<\/li>\n\n\n\n<li>Make note of recurring patterns and structures<\/li>\n\n\n\n<li>Identify special formatting and tables<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Digitization Strategy\n<ul class=\"wp-block-list\">\n<li>Defined desired output format (e.g., JSON, CSV, XML, TXT)<\/li>\n\n\n\n<li>Identify data you want to extract<\/li>\n\n\n\n<li>Establish data validation requirements<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>In my case, my documents were in good condition but were complex because they lacked a uniform set of patterns and structures between issues. This prevented me from using a single schema or template across the issues.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Digitization<\/h3>\n\n\n\n<p>This step in the project involves converting the print documents into digital format. For this step, you will need a scanner or a smartphone with a scanning app (e.g., Adobe Scan, Microsoft Lens). <\/p>\n\n\n\n<p>Before I go through the steps of digitizing the directories, here is a view of the 1996 issue of <em>Directory of Literary Magazines<\/em> before digitization. All 10 issues of the directory looked very similar to this issue.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/directory-clmp-1996.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"448\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/directory-clmp-1996-1024x448.jpg\" alt=\"Photo of a 1996 issue of CLMP Directory of Literary Magazines. It has a purple cover, and light blue and green text.\" class=\"wp-image-3291\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/directory-clmp-1996-1024x448.jpg 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/directory-clmp-1996-300x131.jpg 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/directory-clmp-1996-768x336.jpg 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/directory-clmp-1996.jpg 1320w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>In order to prepare the book for scanning, I first loosened the binding glue in order to remove the cover. I applied the hot metal on the end of my soldering iron to the spine of the book, which allowed me to non-destructively remove the cover. Next, I used a razor blade to scrape the glue from the spine. <\/p>\n\n\n\n<p>I then pulled the pages away from the binding in sections of between 80 to 100 pages, and the removal of approximately 1\/4 inch from the binding edge was performed using a paper trimmer.<\/p>\n\n\n\n<figure class=\"wp-block-image size-medium\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.13.38\u202fPM.png\"><img loading=\"lazy\" decoding=\"async\" width=\"239\" height=\"300\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.13.38\u202fPM-239x300.png\" alt=\"Photo of a CLMP directory on a paper cutter.\" class=\"wp-image-3292\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.13.38\u202fPM-239x300.png 239w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.13.38\u202fPM-815x1024.png 815w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.13.38\u202fPM-768x965.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.13.38\u202fPM-1223x1536.png 1223w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.13.38\u202fPM.png 1280w\" sizes=\"auto, (max-width: 239px) 100vw, 239px\" \/><\/a><\/figure>\n\n\n\n<p>The resulting trimmed pages provided me with a consistent and a clean page edge that prevented jamming the document scanner, albeit at the expense of the periodical&#8217;s original margins.<\/p>\n\n\n\n<p>After trimming the binding edge, I manually checked pages to ensure they were unbound to other pages. I then put the pages into the document scanner (in this case, a Raven Pro Document Scanner), and set the scanning for two-sided, color, and 300 dots per inch (dpi). I used 300 dpi because this is what was recommended for scan resolution for improved accuracy of Optical Character Recognition (OCR) processing in the Adobe Acrobat Pro documentation (Adobe, 2024).<\/p>\n\n\n\n<figure class=\"wp-block-image size-medium\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.16.52\u202fPM.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"274\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.16.52\u202fPM-300x274.png\" alt=\"\" class=\"wp-image-3293\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.16.52\u202fPM-300x274.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.16.52\u202fPM-1024x936.png 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.16.52\u202fPM-768x702.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.16.52\u202fPM.png 1234w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: PDF to Text Conversion<\/h3>\n\n\n\n<p>The next step in the project is to convert the scanned PDF files into plain text format. In the scenario that we&#8217;re describing, the documents will typically be &#8220;flat&#8221; in an image format. This requires some type of OCR to extract the information. It&#8217;s at this stage, that the approach starts to diverge depending on your background and resources:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Novice<br \/>Use a cloud service that allows you to upload files and define a document schema. The best option for this in my experience is Airparser, which provides multiple upload options, simple schema creation and validation, and multiple output options.<\/li>\n\n\n\n<li>Intermediate<br \/>You can use existing python libraries such as <a href=\"https:\/\/github.com\/tesseract-ocr\/tesseract\">Tesseract<\/a> to OCR the files. You can also purpose-built software for this such as Adobe Acrobat Pro or pdf2go. <\/li>\n\n\n\n<li>Developer<br \/>Claude recently released a beta feature called <a href=\"https:\/\/docs.anthropic.com\/en\/docs\/build-with-claude\/pdf-support\">Claude PDF Support<\/a>. Depending on the complexity of your documents, this API simplifies the process because you can send any PDF file to the endpoint and it will both extract the text and provide parsing. Another route is to convert the scans into base64 and send these to OpenAI API or Claude API for extraction and output.<\/li>\n<\/ul>\n\n\n\n<p>In my case, I used Azure Vision for the OCR step. If I were to do this today, I would use Claude PDF Support. At the time I was choosing between Adobe Acrobat Pro and Azure Vision. I used Azure Vision image-to-text processing because it was much more accurate than Adobe Acrobat Pro OCR (in January 2024, anyway). However, if you do not want to spend money on Azure Vision or Adobe Acrobat Pro, I have had good success with pdf2go. This process laid the foundation for the subsequent data cleaning and extraction stages.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Data Cleaning<\/h3>\n\n\n\n<p>Once the PDFs are converted to text files, the next step involves cleaning the data to ensure its usability. This step differs somewhat depending on experience and resources:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Novice<br \/>If you use Airparser, you will need to manually spot check your output to make sure it is outputting accurately. If you notice errors, you should adjust your document template in Airparser and iterate on your prompt. <\/li>\n\n\n\n<li>Intermediate &amp; Developer<br \/>For this step, I would recommend sending the extracted text to either Claude or OpenAI API for review and cleaning. After that step, manually review the output to ensure it is accurate. If there are accuracy errors, revise your prompt.<\/li>\n<\/ul>\n\n\n\n<p>Regardless of which approach you take, you should provide the expected output and validation for the model to review. For example, if you are using JSON, provide the objects and values you expect to be returned and examples of the type of information that would be included as values. Use this information in your prompt to validate and set requirements.<\/p>\n\n\n\n<p>In my project, this process included:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Extracting the main content by removing the foreword and indices of the original book.<\/li>\n\n\n\n<li>Eliminating page numbers and headers that were not part of the listing data.<\/li>\n\n\n\n<li>Manually identifying and correcting errors in the text resulting from the AI conversion process.<\/li>\n\n\n\n<li>Utilizing a code script to remove any extra spaces in the text files.<\/li>\n<\/ol>\n\n\n\n<p>These cleaning steps were crucial in preparing the data for the extraction phase.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5: Data Parsing<\/h3>\n\n\n\n<p>Now that you have clean and accurate text, you can perform parsing and logic on the information. For example, say you were extracting information from academic transcripts. Once you have extracted the data, cleaned it, and have a reliable JSON output, you could then perform calculations or analysis. In the academic transcript example, this could include something like calculating &#8220;last half GPA&#8221; and providing some logic in the prompt for determining how to add up the last half of credits from the transcript and averaging the GPA.<\/p>\n\n\n\n<p>In my project, the data parsing process was divided into two types: non-predefined keys and predefined keys.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5.1 Non-Predefined Keys<\/h4>\n\n\n\n<p>After the data cleaning stage, extracting data with non-predefined keys was relatively straightforward. A Python script was used to process the cleaned text files and extract the relevant information. The script, as shown in the code snippet included at the end of the article, performed the following tasks:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Reading the cleaned text file and removing any unusable characters or short numeric strings.<\/li>\n\n\n\n<li>Defining exact match patterns to identify the beginning of each magazine entry (e.g., &#8220;Magazine:&#8221;, &#8220;Online:&#8221;, &#8220;Press:&#8221;).<\/li>\n\n\n\n<li>Splitting the text into individual magazine entries based on the match patterns.<\/li>\n\n\n\n<li>Extracting key-value pairs from each magazine entry, handling cases where values span multiple lines.<\/li>\n\n\n\n<li>Storing the extracted data in a dictionary format, with each magazine entry represented as a separate object.<\/li>\n\n\n\n<li>Converting the dictionary to a JSON string and writing it to an output file.<\/li>\n<\/ol>\n\n\n\n<p>This process successfully extracted the non-predefined key data from the cleaned text files.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import json\nimport codecs\n\n# Open the input text file containing the cleaned data from the OCR PDFs and the output file for the JSON.\nIN = codecs.open(\"clmp-2005-2006.txt\", \"r\", encoding=\"utf8\")\nOUT = codecs.open(\"clmp-2005-2006-submit.txt\", \"w\", encoding=\"utf8\")\n\n# Read the input file, split it into lines, and filter out lines that are either too short (likely errors) or page numbers.\nin_list = &#91;\n    s.strip()\n    for s in IN.read().split(\"\\n\")\n    if not (len(s.strip()) &lt;= 1 or (len(s.strip()) &lt;= 3 and s.isnumeric()))\n]\n\nIN.close()\n\ndatas = {}\n\n# Patterns to identify the beginning of new entries in the text file. Define the exact matches.\npatterns = &#91;\"Magazine:\", \"Online:\", \"Press:\"]\nmatch_list = &#91;]  # This list will contain the indices of lines where patterns are found.\n\n# Loop through each line in the input list to find matches to the patterns.\nfor index, st in enumerate(in_list):\n    match = &#91;(True if st.find(pattern) == 0 else False) for pattern in patterns]\n    if any(match):\n        match_list.append(index)\n\nlength = len(in_list)\nmatch_length = len(match_list)\n\nprint(length, match_length)  # Debugging print to check sizes.\n\ncurrentIndex = 0\nfor i in range(0, match_length - 1):\n    st, en = match_list&#91;i], match_list&#91;i + 1]\n    currentIndex += 1\n    data = {}\n    idx = st\n    while idx &lt; en:\n        # Split each line into a key-value pair at the first colon.\n        key, value = map(str.strip, in_list&#91;idx].split(\":\", 1))\n        idx += 1\n        # If the following line doesn't contain a colon, it's part of the previous value.\n        while idx &lt; en and \":\" not in in_list&#91;idx]:\n            if not value.endswith(\"-\"):\n                value += f\" {in_list&#91;idx]}\"\n            else:\n                value = value&#91;:-1] + in_list&#91;idx]\n            idx += 1\n        data&#91;key] = value\n    datas&#91;currentIndex] = data\n\nprint(currentIndex)  # Debugging print to ensure the expected number of entries are processed. This must be the same as the first match_length. \n\n# Convert the dictionary to a JSON string, ensuring pretty printing.\ndatas_string = json.dumps(datas, sort_keys=False, indent=4, ensure_ascii=False)\n\n# Write the JSON string to the output file and close it.\nOUT.write(datas_string)\nOUT.close()\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.2 Predefined Keys<\/h4>\n\n\n\n<p>Extracting data with predefined keys proved to be the most challenging aspect of the project. The keys were sometimes embedded within the text, requiring human analysis rather than automated script processing. This led to numerous missing values and multi-line comments.<\/p>\n\n\n\n<p>To tackle this challenge, I integrated OpenAI API and GPT4, an AI-powered language model, was into the workflow. However, due to the large volume of data, direct processing was not feasible. Instead, the data was segmented into manageable chunks of around 70 lines each. These segments were then sent to GPT4 along with a prompt to extract the predefined keys within the specified context.<\/p>\n\n\n\n<p>The prompt provided to GPT4 included instructions on the expected format of the extracted data (JSON) and the specific fields that might appear in the magazine listings. GPT4 analyzed each chunk of data and returned the extracted information in the desired JSON format, handling missing information and anticipating the beginning of the next article.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Define a string 'to_system' that describes the role of the user and the type of data to be processed. This string serves as a structured set of instructions for an AI model to understand the context and the required output format.\nto_system = \"\"\"\nYou are a programmer.\n...\n\"\"\"\n\n# Define a function 'evaluate_JSON' that takes a text input and returns formatted JSON.\ndef evaluate_JSON(text):\n    # Initialize the flag, return dictionary, and title holder.\n    f, ret, next_title = False, {}, \"\"\n    \n    try:\n        # Call the OpenAI API client to generate completions using the provided model. Here, the conversation messages are structured to pass the 'to_system' instructions and the given 'text' as input for the AI to process.\n        response = client.chat.completions.create(\n            model=\"gpt-3.5-turbo\",\n            messages=&#91;\n                {\"role\": \"system\", \"content\": to_system},\n                {\"role\": \"user\", \"content\": f\"'''\\n{text}\\n ... ...\\n'''\"},\n            ],\n        )\n\n        # Process the response to extract the content, and format the JSON with newlines to make it more readable. This step assumes that the response from the AI will be in a string format that resembles JSON.\n        rlt = response.choices&#91;0].message.content\n        rlt = rlt.replace(\"{\", \"\\n{\\n\")\n        rlt = rlt.replace(\"},\", \"\\n},\\n\")\n\n        # ... rest of the processing code should go here ...\n        \n    # Exception handling in case of an error during the API call or processing.\n    except Exception as e:\n        print(f\"An error occurred: {e}\")\n\n    # The function would return the formatted JSON content.\n    return ret<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>Converting scanned PDFs of the CLMP <em>Directory of Literary Magazines<\/em> into clean, well-structured JSON was a multi-step process that involved digitization of the directories, PDF to text conversion, data cleaning, and data extraction. The project utilized Python scripts and AI-powered tools like GPT to overcome challenges such as embedded keys and large data volumes.<\/p>\n\n\n\n<p>By segmenting the data into manageable chunks and providing clear instructions to GPT4, I successfully extracted the desired information in a structured JSON format.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Result Example<\/h4>\n\n\n\n<p>I started with print issues that contained thousands of magazines that included variations of listing information like this<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/Screenshot-2024-03-06-at-4.16.49\u202fPM-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1006\" height=\"1024\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/Screenshot-2024-03-06-at-4.16.49\u202fPM-2-1006x1024.png\" alt=\"Screenshot of the listing information for a single literary magazine called ABACUS.\" class=\"wp-image-3295\" style=\"width:620px;height:auto\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-03-06-at-4.16.49\u202fPM-2-1006x1024.png 1006w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-03-06-at-4.16.49\u202fPM-2-295x300.png 295w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-03-06-at-4.16.49\u202fPM-2-768x781.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-03-06-at-4.16.49\u202fPM-2.png 1148w\" sizes=\"auto, (max-width: 1006px) 100vw, 1006px\" \/><\/a><\/figure>\n\n\n\n<p>And I was able to turn all of the listing information across the issues into JSON like this<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.52.31\u202fPM.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"563\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.52.31\u202fPM-1024x563.png\" alt=\"\" class=\"wp-image-3297\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.52.31\u202fPM-1024x563.png 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.52.31\u202fPM-300x165.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.52.31\u202fPM-768x422.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.52.31\u202fPM-1536x844.png 1536w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/04\/Screenshot-2024-04-07-at-5.52.31\u202fPM.png 1710w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>This project demonstrates the potential of combining traditional programming techniques with AI-powered tools to tackle complex data extraction tasks in the digital humanities field. The resulting JSON data can now be used for further analysis and research, opening up new possibilities for exploring the historical content of the CLMP <em>Directory of Literary Magazines<\/em>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post discusses a recent project where I scanned PDF issues of the Council of Literary Magazines and Presses (CLMP) Directory of Literary Magazines from 1995 to 2005 and converted those 10 directories into clean, well-structured JSON. The process encompassed several stages, including PDF to text conversion, data cleaning, and data extraction using Python scripts and AI-powered tools like ChatGPT.<\/p>\n","protected":false},"author":5,"featured_media":3288,"comment_status":"open","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143],"tags":[150,202,203,152,201,204],"class_list":["post-3286","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data","tag-api","tag-clmp","tag-gpt","tag-json","tag-ocr","tag-openai"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3286"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3286\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3288"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":3209,"date":"2024-01-03T15:52:17","date_gmt":"2024-01-03T20:52:17","guid":{"rendered":"https:\/\/digitalborn.org\/?p=3209"},"modified":"2024-01-08T17:22:28","modified_gmt":"2024-01-08T22:22:28","slug":"echo-show-15-poe-setup","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/echo-show-15-poe-setup\/","title":{"rendered":"Power over Ethernet for Amazon Echo Show 15"},"content":{"rendered":"\n<p>If you&#8217;re reading this article, you&#8217;ve encountered a similar problem to the one that I recently solved: you bought an Echo Show 15 and wanted to either 1. power the device without wires showing, 2. deliver power to the device over a long distance (the included power supply is only 6 feet in length), or 3. avoid installing an AC power outlet. For me, I wanted to accomplish all three of these items: I wanted to run a single Cat6a cable from my PoE network switch in the basement through the wall and power the Echo Show 15 in the kitchen.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/echo-show-15-before-1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"771\" data-id=\"3212\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/echo-show-15-before-1-1024x771.jpg\" alt=\"Photo of Echo Show 15 mounted on the wall with wire from power supply showing.\" class=\"wp-image-3212\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-before-1-1024x771.jpg 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-before-1-300x226.jpg 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-before-1-768x578.jpg 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-before-1-645x486.jpg 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-before-1-662x498.jpg 662w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-before-1.jpg 1400w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Before<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/echo-show-15-after.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"771\" data-id=\"3211\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/echo-show-15-after-1024x771.jpg\" alt=\"Photo of amazon echo show 15 mounted on the wall without any wires showing from the power supply\" class=\"wp-image-3211\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-after-1024x771.jpg 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-after-300x226.jpg 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-after-768x578.jpg 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-after-645x486.jpg 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-after-662x498.jpg 662w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-after.jpg 1400w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">After<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Power Your Echo Show 15 with PoE: Easy Guide to a Clean Installation Without an Electrician\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/Sb3hz4_n0Qc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">Quick video guide of what is included in this article<\/figcaption><\/figure>\n\n\n\n<p>After reading dozens of threads online, I couldn&#8217;t find any answers to this niche problem. I have experience powering IT equipment over PoE+ (e.g., PTZ cameras, HDMI extenders, etc.) so I decided to give this a try. The typical disclaimer applies &#8212; try the below at your own risk. <\/p>\n\n\n\n<p>If you do not know what Power over Ethernet means or how it functions, you will gain a very basic understanding through this guide. Recently there have been advancements in the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Power_over_Ethernet#Standard_implementation\" target=\"_blank\" rel=\"noreferrer noopener\">PoE standard (PoE+, PoE++)<\/a> and you can deliver significant power over low voltage cables (e.g., Cat6a). You can use a network switch with integrated PoE or a dedicated PoE injector to deliver power over the Ethernet cable. The benefits to PoE for this particular project: You can run Cat6a cable through the wall and at a distance of 328 feet, and provide power and data over a single cable. Also, you don&#8217;t need to work with high voltage wiring or pay someone else to work with high voltage wiring. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Challenges<\/h3>\n\n\n\n<p>After reading the manual to the Echo Show 15, I realized this would be tricky for a few reasons. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It uses 18V. Most PoE splitters operate at 5v and 12v.<\/li>\n\n\n\n<li>It operates at 30 watts. Most PoE splitters provide max 25 watts.<\/li>\n\n\n\n<li>It uses a very odd dc barrel plug size of 6.5mm x 2.5mm. Most devices use either 5.5mm x 2.5mm or 5.5mm x 2.1mm.<br \/><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Solution<\/h3>\n\n\n\n<p>After some initial research, I found two PoE splitters that seemed like they would work:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.amazon.com\/dp\/B004ZWFS4W\" target=\"_blank\" rel=\"noreferrer noopener\">ALFA Networks PoE Splitter<\/a><br \/>This splitter has a selected output to 18v and max power that exceeded 30 watts. When I tested, it outputs slightly more than 18v at 18.45v. I liked its form factor because it will fit inside a wall mounted to a 2&#215;4 stud.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.amazon.com\/dp\/B07LGVPRBM\" target=\"_blank\" rel=\"noreferrer noopener\">Centropower PoE Splitter<\/a><br \/>While the ALFA Networks splitter has a better form factor, the Centopower is more available online (around $24) and is closer to the mark on 18v in my tests at 18.01v.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-16-06.png\"><img loading=\"lazy\" decoding=\"async\" width=\"580\" height=\"580\" data-id=\"3221\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-16-06-edited.png\" alt=\"ALFA Networks PoE Splitter set to 18v and tested. Displays 18.45v.\" class=\"wp-image-3221\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-16-06-edited.png 580w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-16-06-edited-300x300.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-16-06-edited-150x150.png 150w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-16-06-edited-55x55.png 55w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><figcaption class=\"wp-element-caption\">ALFA Networks PoE Splitter set to 18v<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-15-40.png\"><img loading=\"lazy\" decoding=\"async\" width=\"562\" height=\"558\" data-id=\"3218\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-15-40.png\" alt=\"Centopower tested with a PoE tester showing DC power of 18.01v.\" class=\"wp-image-3218\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-15-40.png 562w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-15-40-300x298.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-15-40-150x150.png 150w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/Screenshot-from-2024-01-03-16-15-40-55x55.png 55w\" sizes=\"auto, (max-width: 562px) 100vw, 562px\" \/><\/a><figcaption class=\"wp-element-caption\">Centopower PoE Splitter set to 18v<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p>Important: The barrel plug cables included in the product boxes do not fit into the  Echo Show 15. You will need to order a separate male to male <a href=\"https:\/\/www.amazon.com\/gp\/product\/B09TXQQS8Z\/\" target=\"_blank\" rel=\"noreferrer noopener\">5.5mm x 2.5mm DC barrel plug cable<\/a> that is rated to handle 18v. <\/p>\n\n\n\n<p>Keep in mind that this still won&#8217;t fit perfectly into the Echo Show 15 because it wants a 6.5mm x 2.5mm. But I didn&#8217;t have any problems with the slight &#8220;jiggle&#8221; in the connection. It&#8217;s very difficult to find a 6.5mm x 2.5mm but, if you were feeling ambitious, you could splice the cable that comes with one of the splitters above with the end of the Echo Show 15 power supply that ships with the device. I used this <a href=\"https:\/\/www.amazon.com\/dp\/B09TXQQS8Z\" data-type=\"link\" data-id=\"https:\/\/www.amazon.com\/dp\/B09TXQQS8Z\" target=\"_blank\" rel=\"noreferrer noopener\">male to male 5.5mm x 2.5mm<\/a> and it worked great.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Putting It All Together<\/h3>\n\n\n\n<p>You will run an Ethernet cable from a PoE+ integrated network switch (that provides at least 30 watts per port) to the Centropower PoE splitter (make sure you set it to 18v) and then run a male dc barrel plug to the Echo Show 15. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/echo-show-15-poe-diagram1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"169\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2024\/01\/echo-show-15-poe-diagram1-1024x169.png\" alt=\"Diagram of plugging network switch into AC outlet, plugging switch into Cat6a cable which connects to Centopower PoE Splitter, and then male to male 5.5mm x 2.5mm barrel plug connecting splitter to echo show 15.\" class=\"wp-image-3215\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-poe-diagram1-1024x169.png 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-poe-diagram1-300x50.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-poe-diagram1-768x127.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-poe-diagram1-1536x254.png 1536w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-poe-diagram1-645x107.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-poe-diagram1-662x109.png 662w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2024\/01\/echo-show-15-poe-diagram1.png 1766w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Equipment That I Used<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>TP-Link TL-SG108PE <a href=\"https:\/\/www.amazon.com\/TP-Link-TL-SG108PE-Shielded-Lifetime-Protection\/dp\/B01BW0AD1W\/\" target=\"_blank\" rel=\"noreferrer noopener\">PoE+ Network Switch<\/a><\/li>\n\n\n\n<li>Cat6a <a href=\"https:\/\/www.amazon.com\/Cable-Matters-Snagless-Shielded-Ethernet\/dp\/B00HEM5YJE\/\" target=\"_blank\" rel=\"noreferrer noopener\">30 ft cable<\/a><\/li>\n\n\n\n<li>Centropower <a href=\"https:\/\/www.amazon.com\/dp\/B07LGVPRBM\" target=\"_blank\" rel=\"noreferrer noopener\">PoE splitter <\/a><\/li>\n\n\n\n<li>Male to male <a href=\"https:\/\/www.amazon.com\/dp\/B09TXQQS8Z\" target=\"_blank\" rel=\"noreferrer noopener\">5.5mm to 2.5mm DC cord<\/a><\/li>\n\n\n\n<li>Echo Show 15<\/li>\n\n\n\n<li>Optional: I used a <a href=\"https:\/\/www.homedepot.com\/p\/Commercial-Electric-1-Gang-Flexible-Opening-Cable-Wall-Plate-White-5028-WH\/305090873\" data-type=\"link\" data-id=\"https:\/\/www.homedepot.com\/p\/Commercial-Electric-1-Gang-Flexible-Opening-Cable-Wall-Plate-White-5028-WH\/305090873\" target=\"_blank\" rel=\"noreferrer noopener\">Commercial Electric 1-gang flexible opening wall plate<\/a> behind the Echo Show<\/li>\n<\/ul>\n\n\n\n<p>Hopefully this is helpful to other people looking to do something similar. This general approach works for most PoE gear. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is a brief guide on how to power your Amazon Echo Show 15 using Power over Ethernet (PoE). This step-by-step tutorial is designed for anyone looking to 1. power the device without wires showing, 2. deliver power to the device over a long distance, or 3. avoid installing an AC power outlet.<\/p>\n","protected":false},"author":5,"featured_media":3257,"comment_status":"open","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[114],"tags":[191,192,190,193],"class_list":["post-3209","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-tips","tag-echo-show","tag-echo-show-15","tag-poe","tag-power-over-ethernet"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3209","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3209"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3209\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3257"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3209"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":3192,"date":"2020-08-28T10:23:00","date_gmt":"2020-08-28T15:23:00","guid":{"rendered":"https:\/\/digitalborn.org\/?p=3192"},"modified":"2024-01-15T10:27:49","modified_gmt":"2024-01-15T15:27:49","slug":"building-studios-for-teachers-johns-hopkins-university-instructional-studios","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/building-studios-for-teachers-johns-hopkins-university-instructional-studios\/","title":{"rendered":"Building Studios for Faculty: Johns Hopkins University Instructional Studios"},"content":{"rendered":"\n<p>In April 2020, our media engineering group was asked to design and develop an implementation plan for 35 instructional studios that would be located on two campuses. Our instructional studios were highlighted in the\u00a0<em><a href=\"https:\/\/www.nytimes.com\/2020\/07\/06\/us\/coronavirus-universities-colleges-reopening.html\" target=\"_blank\" rel=\"noreferrer noopener\">New York Times<\/a><\/em>,\u00a0<em><a href=\"https:\/\/engineering.jhu.edu\/magazine\/2021\/02\/tech-tools-live-from-jhu\/#.YN249BNKhTZ\">JHU Engineering Magazine<\/a><\/em>, and other\u00a0<a href=\"https:\/\/www.avnetwork.com\/features\/elevating-your-streaming-production-quality\">publications<\/a>. They were also featured in two separate videos:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-vimeo wp-block-embed-vimeo wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"JH Engineering Instructional Studios\" src=\"https:\/\/player.vimeo.com\/video\/684728552?dnt=1&amp;app_id=122963\" width=\"500\" height=\"281\" frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture; clipboard-write\"><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">Demonstration of the studios for the public.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"JHU&#039;s New Studios for Remote Learning\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/1T1P4sA_1_M?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">Demonstration for JHU students.<\/figcaption><\/figure>\n\n\n\n<p>This project had several high-level requirements:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Adaptability for different spaces<\/strong>&nbsp;(four different buildings, two campuses, drastically different room sizes)<\/li>\n\n\n\n<li><strong>Flexible content sharing<\/strong>&nbsp;(laptop, main camera, document camera, whiteboard camera)<\/li>\n\n\n\n<li><strong>Unified interface for controlling and recording live online courses<\/strong>&nbsp;(reduced support load, simplified documentation, easy of use)<\/li>\n\n\n\n<li><strong>Mobile&nbsp;<\/strong>(can be quickly moved when space needs change)<\/li>\n\n\n\n<li><strong>Modular and vendor agnostic<\/strong>&nbsp;(inventory was limited during the pandemic with long backorders so components needed to be easily exchanged)<\/li>\n<\/ul>\n\n\n\n<p>In addition, supplemental studio support would be provided by the school\u2019s IT group, which meant using equipment that was familiar to their team. Leaning on prior experience delivering live courses from the Applied Physics Laboratory (APL), we partnered with Johns Hopkins Engineering faculty to envision a new approach to live online course delivery.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/instructional-studio-zr-Natalia-Trayanova-discussion-scaled-1024x390-1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"390\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/instructional-studio-zr-Natalia-Trayanova-discussion-scaled-1024x390-1.jpg\" alt=\"\" class=\"wp-image-3195\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/instructional-studio-zr-Natalia-Trayanova-discussion-scaled-1024x390-1.jpg 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/instructional-studio-zr-Natalia-Trayanova-discussion-scaled-1024x390-1-300x114.jpg 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/instructional-studio-zr-Natalia-Trayanova-discussion-scaled-1024x390-1-768x293.jpg 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/instructional-studio-zr-Natalia-Trayanova-discussion-scaled-1024x390-1-645x246.jpg 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/instructional-studio-zr-Natalia-Trayanova-discussion-scaled-1024x390-1-662x252.jpg 662w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Professor Natalia A. Trayanova of the Biomedical Engineering department delivers a class to remote students.<\/figcaption><\/figure>\n\n\n\n<p>The instructional studios started with a mobile standing desk, which serves as the command center for instruction. The desk has a room controller, document camera, and an interactive display with adapter for laptop content share. Behind the desk is a whiteboard with whiteboard camera. In front of the desk, we designed an AV cart that includes a shotgun mic pair, LED light panels, two large displays, one off-lens teleprompter, and PTZ camera.<\/p>\n\n\n\n<p>Every aspect of the studio design was focused on reducing external factors introduced with differing spaces, while supporting the delivery of engaging learning experiences. The light panels guarantee consistent lighting regardless of the space. Using two shotgun mics provides professional audio and allows instructors to freely move around, while reducing noise pickup from other directions. Positioning the main camera below the small monitor (off-lens teleprompter) creates the feeling of direct eye contact with the audience, and the two larger displays provide a large view of students and shared content.<\/p>\n\n\n\n<p>The studios put the instructor in control of the meeting using a Zoom Rooms controller\u2013allowing them to easily switch between and share multiple types of content simultaneously: main camera, document camera, laptop content, digital annotations, and whiteboard writing.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/front-desk-jhu-wse-studios-pandemic.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"769\" data-id=\"3201\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/front-desk-jhu-wse-studios-pandemic-1024x769.png\" alt=\"\" class=\"wp-image-3201\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/front-desk-jhu-wse-studios-pandemic-1024x769.png 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/front-desk-jhu-wse-studios-pandemic-300x225.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/front-desk-jhu-wse-studios-pandemic-768x576.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/front-desk-jhu-wse-studios-pandemic-1536x1153.png 1536w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/front-desk-jhu-wse-studios-pandemic-2048x1537.png 2048w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/front-desk-jhu-wse-studios-pandemic-645x484.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/front-desk-jhu-wse-studios-pandemic-662x497.png 662w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/box-mountain-jhu-wse-studios-768x570-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"570\" data-id=\"3200\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/box-mountain-jhu-wse-studios-768x570-1.png\" alt=\"\" class=\"wp-image-3200\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/box-mountain-jhu-wse-studios-768x570-1.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/box-mountain-jhu-wse-studios-768x570-1-300x223.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/box-mountain-jhu-wse-studios-768x570-1-645x479.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/box-mountain-jhu-wse-studios-768x570-1-662x491.png 662w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-testing-1024x639-1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"639\" data-id=\"3198\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-testing-1024x639-1.jpg\" alt=\"\" class=\"wp-image-3198\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-testing-1024x639-1.jpg 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-testing-1024x639-1-300x187.jpg 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-testing-1024x639-1-768x479.jpg 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-testing-1024x639-1-645x402.jpg 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-testing-1024x639-1-662x413.jpg 662w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/building-studios-jhu-wse-2.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"209\" height=\"179\" data-id=\"3196\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/building-studios-jhu-wse-2.jpg\" alt=\"\" class=\"wp-image-3196\"\/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-eb-844x1024-1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"844\" height=\"1024\" data-id=\"3199\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-eb-844x1024-1.jpg\" alt=\"\" class=\"wp-image-3199\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-eb-844x1024-1.jpg 844w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-eb-844x1024-1-247x300.jpg 247w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-eb-844x1024-1-768x932.jpg 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-eb-844x1024-1-645x783.jpg 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-eb-844x1024-1-662x803.jpg 662w\" sizes=\"auto, (max-width: 844px) 100vw, 844px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-ba-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"992\" height=\"1024\" data-id=\"3203\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-ba-2-992x1024.png\" alt=\"\" class=\"wp-image-3203\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-ba-2-992x1024.png 992w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-ba-2-291x300.png 291w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-ba-2-768x792.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-ba-2-1489x1536.png 1489w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-ba-2-645x666.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-ba-2-662x683.png 662w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/build-studios-jhu-wse-ba-2.png 1756w\" sizes=\"auto, (max-width: 992px) 100vw, 992px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-jhu-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"885\" data-id=\"3202\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-jhu-2-1024x885.png\" alt=\"\" class=\"wp-image-3202\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-jhu-2-1024x885.png 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-jhu-2-300x259.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-jhu-2-768x663.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-jhu-2-1536x1327.png 1536w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-jhu-2-2048x1769.png 2048w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-jhu-2-645x557.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-jhu-2-662x572.png 662w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-malone-jhu-2.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"285\" height=\"253\" data-id=\"3197\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/studio-support-pandemic-malone-jhu-2.jpg\" alt=\"\" class=\"wp-image-3197\"\/><\/a><\/figure>\n<figcaption class=\"blocks-gallery-caption wp-element-caption\">CLDT team ordering equipment, building, testing, and training.<\/figcaption><\/figure>\n\n\n\n<p>Ultimately these studios enable flexible, high-quality live direct-to-device and direct-to-classroom content delivery and recording that improves the learning experience for students.&nbsp;<\/p>\n\n\n\n<p>We went through a thorough, accelerated design and deployment process where we planned and pitched the approach to leadership, designed and tested with faculty, and built and supported with our media staff in collaboration with internal partners.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/studio-plan-and-build-jhu-wse-2048x959-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"480\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2022\/04\/studio-plan-and-build-jhu-wse-2048x959-1-1024x480.png\" alt=\"\" class=\"wp-image-3204\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-plan-and-build-jhu-wse-2048x959-1-1024x480.png 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-plan-and-build-jhu-wse-2048x959-1-300x140.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-plan-and-build-jhu-wse-2048x959-1-768x360.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-plan-and-build-jhu-wse-2048x959-1-1536x719.png 1536w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-plan-and-build-jhu-wse-2048x959-1-645x302.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-plan-and-build-jhu-wse-2048x959-1-662x310.png 662w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2022\/04\/studio-plan-and-build-jhu-wse-2048x959-1.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Design, build, and support process in action by the Center for Learning Design &amp; Technology<\/figcaption><\/figure>\n\n\n\n<p>Over the summer of 2022, we worked in parallel building the studios, while also training faculty to deliver their courses during the Fall term. We created a&nbsp;<a href=\"https:\/\/support.cldt.jhu.edu\/hc\/en-us\/articles\/360046696212-WSE-Instructional-Studio-Guide\" target=\"_blank\" rel=\"noreferrer noopener\">support article<\/a> and assigned support at a 4 -to-1 ratio (four studios for each support staff). Overall this effort was a tremendous success, helping maintain continuity during an extended pandemic.&nbsp;<\/p>\n\n\n\n<p>In an effort to help support similar initiatives across the JHU system and universities across the nation, our team has assembled this&nbsp;<a href=\"https:\/\/engineering.jhu.edu\/cldt\/wp-content\/uploads\/2022\/03\/JHU-2009-001_Manual_Final-DRAFT_2020-0806_lr.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">Overview and Assembly Manual<\/a>. This manual is intended to be a resource so that others may quickly deploy these studios in other settings.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"\" target=\"_blank\" rel=\"noreferrer noopener\">Studio Manual<\/a><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>This article provides information to enable other media systems and AV teams to meet large challenges using an agile, user-centered approach.<\/p>\n","protected":false},"author":5,"featured_media":3194,"comment_status":"open","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[114],"tags":[200,20,199],"class_list":["post-3192","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-tips","tag-av","tag-instructional","tag-studios"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3192"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3192\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3194"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":3125,"date":"2017-10-27T11:12:12","date_gmt":"2017-10-27T16:12:12","guid":{"rendered":"https:\/\/digitalborn.org\/?p=3125"},"modified":"2024-01-08T21:47:49","modified_gmt":"2024-01-09T02:47:49","slug":"post-requests-excel-power-bi","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/post-requests-excel-power-bi\/","title":{"rendered":"Excel Web Services and POST Requests"},"content":{"rendered":"<h2>Overview<\/h2>\n<p>Excel Get and Transform (Power Query) and Microsoft Power BI provide data analysts with flexible data connection and transformation options in a familiar environment. The purpose of this post is to demonstrate a less common approach to accessing data from a REST API with Excel and Power BI. While this post isn&#8217;t for the Excel beginner, it doesn&#8217;t require deep development knowledge. Any tech savvy user with some knowledge of web data sources and Excel should be able to follow this quick guide.<\/p>\n<p>By default Web.Contents() generates a GET request, which works great for most scenarios (e.g., <a href=\"https:\/\/digitalborn.org\/data-insights-wordpress-api-power-bi\/\" target=\"_blank\" rel=\"noopener\">getting data from a WordPress site<\/a>). But what if you need to make a POST request? By combining <a href=\"https:\/\/msdn.microsoft.com\/library\/mt260892?CTT=5&amp;origin=HA104122363&amp;CorrelationId=68050207-414f-4baf-875a-4874c1836f7a&amp;ui=en-US&amp;rs=en-GB&amp;ad=GB\" target=\"_blank\" rel=\"noopener\">Web.Contents() with the Content option<\/a>, you can also make POST requests. It&#8217;s not well documented so here&#8217;s a quick rundown of how you can accomplish this using a real-world example: getting daily report data from Zoom REST API.<\/p>\n<p>Zoom is a good example because it only uses POST requests, which forces us to use Content in Web.Contents() request in Excel.<\/p>\n<p>First, I would recommend scanning these two relevant resources:<\/p>\n<p>1. Chris Webb&#8217;s post on working with <a href=\"https:\/\/blog.crossjoin.co.uk\/2014\/04\/19\/web-services-and-post-requests-in-power-query\/\" target=\"_blank\" rel=\"noopener\">Web Services and Power Query<\/a><\/p>\n<p>2. <a href=\"https:\/\/social.msdn.microsoft.com\/Forums\/en-US\/029fed1d-56fe-476a-9d7d-f367c5036b6e\/posting-xml-to-a-restful-service?forum=dataexplorer\" target=\"_blank\" rel=\"noopener\">This thread<\/a> on posting XML to a RESTful service<\/p>\n<p>Note: You will need a Power BI Pro account if you are interested in actually using Zoom for this example. You can find the Zoom REST API <a href=\"https:\/\/zoom.github.io\/api\/#get-a-sub-account\" target=\"_blank\" rel=\"noopener\">docs here<\/a>.<\/p>\n<h2>How It Works in Excel<\/h2>\n<p>1. Open <strong>Excel<\/strong><br \/>\n2. Click on <strong>Data<\/strong> in the ribbon<br \/>\n3. Select <strong>Get Data<\/strong> &gt; <strong>From Other Sources<\/strong> &gt; <strong>Blank Query<\/strong><br \/>\n4. Click on <strong>Advanced Editor<\/strong><br \/>\n5. Enter your POST request, which could be simple like this query string<\/p>\n<pre><code>= Json.Document\n(Web.Contents(\"https:\/\/api.zoom.us\/v1\/report\/getdailyreport?api_key\n=apikeywouldgohere&amp;api_secret=apisecretwouldgohere&amp;year=2017&amp;\nmonth=8\", [Content=Text.ToBinary(\"content\")]))<\/code><\/pre>\n<p><strong>Or more complex<\/strong><br \/>\n<code>let<br \/>\nAPIURL=\"https:\/\/api.zoom.us\/v1\/report\/getdailyreport\",<br \/>\nAPIKey = \"apikeyhere\",<br \/>\nAPISecret = \"apisecrethere\",<br \/>\nYearValue = \"2017\",<br \/>\nMonthValue = \"5\",<br \/>\nPostContent =\"\",<br \/>\nStringToUse = \"api_key=\" &amp; APIKey &amp; \"&amp;api_secret=\" &amp; APISecret &amp; \"&amp;year=\" &amp; YearValue &amp; \"&amp;month=\" &amp; MonthValue,<br \/>\nFullURL = APIURL &amp; \"?\" &amp; StringToUse,<br \/>\nSource = Json.Document(Web.Contents(FullURL, [Content=Text.ToBinary(PostContent)])),<br \/>\ndates = Source[dates],<br \/>\nConvertedToTable = Table.FromList(dates, Splitter.SplitByNothing(), null, null, ExtraValues.Error),<br \/>\nExpandedColumn1 = Table.ExpandRecordColumn(ConvertedToTable, \"Column1\", {\"date\", \"new_user\", \"meetings\", \"participants\", \"meeting_minutes\"}, {\"date\", \"new_user\", \"meetings\", \"participants\", \"meeting_minutes\"})<br \/>\nin<br \/>\nExpandedColumn1<\/code><\/p>\n<h2>Breaking it Down<\/h2>\n<p>The essential parts of the above script is<\/p>\n<pre><code>Json.Document(Web.Contents(url, [Content=Text.ToBinary(content)]))<\/code><\/pre>\n<hr \/>\n<p>Web.Contents() alone will attempt to GET from the endpoint you provide. By adding Content after the url, you are telling Excel to make a POST request. This is the only way to make a POST request in Excel at the moment for this type of data source. Hopefully this saves someone time.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The purpose of this post is to demonstrate a less common approach to accessing data from a REST API with Excel and Power BI.<\/p>\n","protected":false},"author":5,"featured_media":3126,"comment_status":"open","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[162,143],"tags":[181,178,180,179,134,163,182],"class_list":["post-3125","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-api","category-data","tag-data-analysis","tag-excel","tag-get-and-transform","tag-pbi","tag-power-bi","tag-rest-api","tag-zoom"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3125"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3125\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3126"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":3117,"date":"2017-10-04T22:36:41","date_gmt":"2017-10-05T03:36:41","guid":{"rendered":"https:\/\/digitalborn.org\/?p=3117"},"modified":"2024-01-15T10:29:04","modified_gmt":"2024-01-15T15:29:04","slug":"post-from-mastodon-to-twitter-and-facebook","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/post-from-mastodon-to-twitter-and-facebook\/","title":{"rendered":"Post from Mastodon to Twitter: Using Mastodon to Tweet"},"content":{"rendered":"<h2>Overview<\/h2>\n<p><a href=\"https:\/\/mastodon.social\/about\" target=\"_blank\" rel=\"noopener\">Mastodon<\/a> is an open-source and decentralized social network that feels similar to Twitter. Unlike Twitter, Mastodon is a network of interconnected communities instead of a single site. There are more granular privacy controls and a 500-character limit. There are also no advertisements. While most social networks have deep integration with each other, Mastodon requires a little more effort from the user. In this quick guide, we&#8217;re going to use a simple web feed from Mastodon and a free web automation tool to publish content to other services (e.g., Twitter, Facebook, Google Sheets, email, etc.). <\/p>\n<p>For our purposes, you will need an account on an instance of Mastodon and a <a href=\"https:\/\/zapier.com\/\">Zapier<\/a> account. If you are new to Mastodon, I would recommend <a href=\"http:\/\/2ality.com\/2017\/04\/mastodon.html\">reading more<\/a> about Mastodon since there are some key differences.<\/p>\n<p>Note that you can also use <a href=\"https:\/\/ifttt.com\/\">IFTTT,<\/a>\u00a0<a href=\"https:\/\/flow.microsoft.com\/en-us\/\">Microsoft Flow<\/a>, etc., if you prefer. Here is a good tutorial for <a href=\"https:\/\/discours.es\/2017\/mastodon-pinboard\/\">IFTTT and Mastodon<\/a>.<\/p>\n<hr \/>\n<h3>Connect Mastodon to Other Services<\/h3>\n<ol>\n<li>Determine your <strong>username<\/strong><br \/>\n<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/10\/username-mastodon.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3118\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/10\/username-mastodon.png\" alt=\"Your username is displayed next to your profile photo\" width=\"281\" height=\"198\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/10\/username-mastodon.png 281w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/10\/username-mastodon-197x140.png 197w\" sizes=\"auto, (max-width: 281px) 100vw, 281px\" \/><\/a><\/li>\n<p><\/p>\n<li>Construct your Atom feed url: <strong>https:\/\/instance\/users\/username.atom<\/strong>&nbsp;<br \/>\nor <strong>https:\/\/instance\/@username.atom<\/strong><\/p>\n<p>Examples:<br \/>\nhttps:\/\/mastodon.social\/users\/nathangraham.atom<br \/>\nhttps:\/\/mastodon.social\/@nathangraham.atom<\/li>\n<p><\/p>\n<li>Log in to <strong>Zapier<\/strong> and click <strong><\/strong><strong>Make a Zap<\/strong><\/li>\n<p><\/p>\n<li>Select <strong>RSS by Zapier<\/strong> as your Trigger<\/li>\n<p><\/p>\n<li>Select <strong>New Item in Feed<\/strong> and click Continue<\/li>\n<p><\/p>\n<li>Paste the Atom feed url from step #2<\/li>\n<p><\/p>\n<li>Select <strong>Twitter<\/strong> (or another app where you would like to send Mastodon posts)<\/li>\n<p><\/p>\n<li>Select <strong><\/strong><strong>Create Tweet<\/strong><\/li>\n<p><\/p>\n<li>Connect to your Twitter account<\/li>\n<p><\/p>\n<li>Use the message field to add Mastodon content<br \/>\n<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/10\/mastodon-zapier.gif\"><br \/>\n<\/a><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/10\/mastodon-zapier.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3119 size-full\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/10\/mastodon-zapier.gif\" alt=\"Use the message field to add Mastodon content\" width=\"1176\" height=\"233\" \/><\/a>&nbsp;<\/li>\n<p><\/p>\n<li>Click <strong><\/strong><strong>Create and Continue<\/strong><\/li>\n<p><\/p>\n<li>Turn your <strong>Zap On<\/strong><\/li>\n<p>\n<\/ol>\n<p>\nThat&#8217;s it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article will show you how to use Zapier to post to Twitter from Mastodon.<\/p>\n","protected":false},"author":5,"featured_media":3121,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[174,176,175,177,167],"class_list":["post-3117","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-social-media","tag-mastodon","tag-social-automation","tag-twitter","tag-web-automation","tag-zapier"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3117"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3117\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3121"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":3087,"date":"2017-03-22T17:34:12","date_gmt":"2017-03-22T22:34:12","guid":{"rendered":"https:\/\/digitalborn.org\/?p=3087"},"modified":"2024-01-15T10:34:23","modified_gmt":"2024-01-15T15:34:23","slug":"data-analysts-get-data-from-the-airtable-api","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/data-analysts-get-data-from-the-airtable-api\/","title":{"rendered":"Get Data from the Airtable API the Easy Way"},"content":{"rendered":"\n<p>Airtable is part spreadsheet and part relational database management system. It makes a good, simple tool for analysts to organize basic data. While Airtable provides the option to export to CSV, let&#8217;s look at how to get the data in real time through the API.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Sign in&nbsp;to Airtable<br \/><a href=\"https:\/\/airtable.com\/login\">https:\/\/airtable.com\/login<\/a><\/li>\n<\/ol>\n\n\n\n<ol class=\"wp-block-list\">\n<li>If you haven&#8217;t already, go to <a href=\"https:\/\/airtable.com\/account\" target=\"_blank\" rel=\"noopener\">your account settings<\/a> and click &#8220;Generate API key&#8221;<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-22-at-5.23.25-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3088 size-large\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-22-at-5.23.25-PM-1024x226.png\" alt=\"generate API key image\" width=\"960\" height=\"212\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-22-at-5.23.25-PM-1024x226.png 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-22-at-5.23.25-PM-300x66.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-22-at-5.23.25-PM-768x170.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-22-at-5.23.25-PM-645x142.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-22-at-5.23.25-PM-662x146.png 662w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/Screen-Shot-2017-03-22-at-5.23.25-PM.png 1522w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/a><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to the API hub for your bases<br \/><a href=\"https:\/\/airtable.com\/api\">https:\/\/airtable.com\/api<\/a>&nbsp;and select the base where you want to retrieve data.<br \/>Note: use a base that already has some entries or add a few test entries<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Scroll down to the Authentication section and note the base id<br \/><span class=\"hljs-variable ng-scope\">$ <\/span><span class=\"ng-binding ng-scope\">curl https:\/\/api.airtable.com\/v0\/[highlight]app0LWmcz9Bjd56KV[\/highlight]\/<\/span><span class=\"hljs-constant ng-scope\">Donations<\/span><span class=\"ng-scope\"> \\ &#8211;<\/span><span class=\"hljs-constant ng-scope\">H<\/span> <span class=\"hljs-string ng-binding ng-scope\"><span class=\"hljs-string ng-binding ng-scope\">&#8220;Authorization: Bearer YOUR_API_KEY&#8221;<\/span><\/span><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Now we will use your API key and this base id to form our request<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Examples<\/h4>\n\n\n\n<p>In the below examples we will get five records from a view called &#8220;Main View&#8221; and a base called &#8220;Donations&#8221;.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Python<\/h4>\n\n\n\n<p><code>import requests<\/code><\/p>\n\n\n\n<p>headers = {<br \/>&#8216;Authorization&#8217;: &#8216;Bearer yourapikey&#8217;,<br \/>}<\/p>\n\n\n\n<p>params = (<br \/>(&#8216;maxRecords&#8217;, &#8216;5&#8217;),<br \/>(&#8216;view&#8217;, &#8216;Main View&#8217;),<br \/>)<\/p>\n\n\n\n<p>r = requests.get(&#8216;https:\/\/api.airtable.com\/v0\/app0LWmcz9Bjd56KV\/Donations&#8217;, headers=headers, params=params)<br \/>from pprint import pprint<br \/>pprint(r.json())<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Excel<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open Excel (comes default in Excel 2016 but otherwise you&#8217;ll need to download the Power Query Addon)<\/li>\n\n\n\n<li>Click on Data -&gt; New Query -&gt; From Other Sources -&gt; From Web<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/excel_api_connect.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3091\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/excel_api_connect.png\" alt=\"\" width=\"570\" height=\"491\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/excel_api_connect.png 570w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/excel_api_connect-300x258.png 300w\" sizes=\"auto, (max-width: 570px) 100vw, 570px\" \/><\/a><\/li>\n\n\n\n<li>Select Advanced<\/li>\n\n\n\n<li>Add the URL for the base to the URL field<\/li>\n\n\n\n<li>Select Authorization for the Header and use &#8220;Bearer yourapikey&#8221;<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/airtable_excel_from_web.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3092\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/airtable_excel_from_web.png\" alt=\"\" width=\"598\" height=\"398\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/airtable_excel_from_web.png 598w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/airtable_excel_from_web-300x200.png 300w\" sizes=\"auto, (max-width: 598px) 100vw, 598px\" \/><\/a><\/li>\n\n\n\n<li>Select OK<\/li>\n\n\n\n<li>Convert Into Table<br \/><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/airtable_into_table.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3093\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/airtable_into_table.png\" alt=\"\" width=\"151\" height=\"172\"\/><\/a><\/li>\n\n\n\n<li>Click on arrows in column header to Expand to New Rows<br \/>Note: repeat this step on any additional columns with arrows in the header<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/airtable_excel_expand.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3094\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/airtable_excel_expand.png\" alt=\"\" width=\"528\" height=\"135\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/airtable_excel_expand.png 528w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2017\/03\/airtable_excel_expand-300x77.png 300w\" sizes=\"auto, (max-width: 528px) 100vw, 528px\" \/><\/a><\/li>\n<\/ol>\n\n\n\n<p>That&#8217;s it. Here&#8217;s a quick screencast of me doing this in a minute<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/airtable-api-excel.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"1861\" height=\"899\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2017\/03\/airtable-api-excel.gif\" alt=\"\" class=\"wp-image-3090\"\/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Power BI<\/h4>\n\n\n\n<p>The steps in Power BI are almost identical to Excel.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open Power BI Desktop<\/li>\n\n\n\n<li>Select Get Data -&gt; Web<\/li>\n\n\n\n<li>Follow the connect and expand steps in the Excel instructions above<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">R<\/h4>\n\n\n\n<p># See https:\/\/github.com\/bergant\/airtabler for how to use this R package<\/p>\n\n\n\n<p>library(pacman)<br \/>p_load(devtools)<br \/>devtools::install_github(&#8220;bergant\/airtabler&#8221;) # if not yet installed<br \/>p_load(airtabler)<br \/># This won&#8217;t work unless you have a one-line file .Renviron in your home directory. To check where your home is, type path.expand(&#8220;~&#8221;)<br \/># You will get your API key and base id from your Airtable account<br \/>base_id &lt;- &#8220;pp0LWmcz9Bjd56KV&#8221;<br \/>dat<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">curl<\/h4>\n\n\n\n<p><code>$ curl \"https:\/\/api.airtable.com\/v0\/app0LWmcz9Bjd56KV\/Donations?maxRecords=5&amp;view=Main%20View\" \\<br \/>\n-H \"Authorization: Bearer YOUR_API_KEY\"<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article shows you how to engage with the AirTable API to pull data into your preferred analysis tool such as Excel Get and Transform or Power BI.<\/p>\n","protected":false},"author":5,"featured_media":3095,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[162,143,114],"tags":[173,150],"class_list":["post-3087","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-api","category-data","category-tech-tips","tag-airtable","tag-api"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3087"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3087\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3095"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":3076,"date":"2016-11-18T17:13:50","date_gmt":"2016-11-18T22:13:50","guid":{"rendered":"https:\/\/digitalborn.org\/?p=3076"},"modified":"2024-01-15T10:36:46","modified_gmt":"2024-01-15T15:36:46","slug":"get-survey-monkey-data-using-the-rest-api","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/get-survey-monkey-data-using-the-rest-api\/","title":{"rendered":"Get Survey Monkey Data Using the REST API"},"content":{"rendered":"<p><strong>Update 12\/22\/17<\/strong> Survey Monkey requires you to alter the OAuth redirect url and update the scopes before you can deploy your app. I&#8217;ve updated the post to reflect these changes.<br \/>\n<strong>Update 3\/31\/17:<\/strong> Survey Monkey now provides an access token for 90 days when you create an app. So unless you need to use the API for more than 90 days and you have a Platinum plan, then you can just read these long story short instructions.<\/p>\n<h2>Long Story Short<\/h2>\n<p>When we talk about an &#8220;app&#8221; in our case, we&#8217;re just sort of faking it so that we can get an access token. <\/p>\n<p>Instead of generating a &#8220;long lived&#8221; token (i.e., lasts more than 90 days), I would recommend just following these simple steps:<\/p>\n<p><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/survey-monkey-api.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/survey-monkey-api.gif\" alt=\"Click on add a new app and then make sure to change OAuth redirect url and add scopes\" width=\"1228\" height=\"627\" class=\"alignnone size-full wp-image-3139\" \/><\/a><\/p>\n<p>1. Go to My Apps and click <strong>Add a New App<\/strong><br \/>\n<a href=\"https:\/\/developer.surveymonkey.com\/apps\/\">https:\/\/developer.surveymonkey.com\/apps\/<\/a><\/p>\n<p>2. Give your app a <strong>nickname<\/strong><\/p>\n<p>3. Set it to <strong>Public App<\/strong><\/p>\n<p>4. Click <strong>Create App<\/strong><\/p>\n<p>5. Click on <strong>Settings<\/strong><\/p>\n<p>6. Change the <strong>OAuth Redirect URL<\/strong> to anything (e.g., your personal site, https:\/\/google.com, etc.)<\/p>\n<p>7. Click <strong>Submit Changes<\/strong><\/p>\n<p>8. Modify the scopes (e.g., set them to &#8220;Optional&#8221;><\/p>\n<p>9. Click <strong>Update Scopes<\/strong><\/p>\n<p>10. Click <strong>Deploy<\/strong><\/p>\n<p>11. Copy your access token and use it for authorization in your request<\/p>\n<p>That&#8217;s it. You don&#8217;t need to do anything else in terms of the app set up and configuration for our purposes. <\/p>\n<p><strong>Now that you have your access token you can request your survey data.<\/strong><br \/>\nIf you like Python you could use this:<\/p>\n<p><code>import requests<br \/>\nimport json<\/p>\n<p>client = requests.session()<\/p>\n<p>headers = {<br \/>\n    \"Authorization\": \"bearer %s\" % \"YOUR_ACCESS_TOKEN\",<br \/>\n    \"Content-Type\": \"application\/json\"<br \/>\n}<\/p>\n<p>data = {}<\/p>\n<p>HOST = \"https:\/\/api.surveymonkey.net\"<br \/>\nSURVEY_LIST_ENDPOINT = \"\/v3\/surveys\"<\/p>\n<p>uri = \"%s%s\" % (HOST, SURVEY_LIST_ENDPOINT)<\/p>\n<p>response = client.get(uri, headers=headers)<\/p>\n<p>response_json = response.json()<br \/>\n#survey_list = response_json[\"data\"][\"surveys\"]<\/p>\n<p>print(response_json)<\/code><\/p>\n<p>and replace &#8220;YOUR_ACCESS_TOKEN&#8221; with the access token in your app. <\/p>\n<p><strong>For cURL<\/strong><\/p>\n<p><code>curl -i -X GET -H \"Authorization:bearer YOUR_ACCESS_TOKEN\" -H \"Content-Type\": \"application\/json\" https:\/\/api.surveymonkey.net\/v3\/surveys<\/code><\/p>\n<p>Similarly, if you were using this in <strong>Power BI or Excel&#8217;s Get &#038; Transform<\/strong>, you could<\/p>\n<p>1. Get Data -> Web<br \/>\n2. Paste https:\/\/api.surveymonkey.net\/v3\/surveys into the web source field<br \/>\n3. Click Advanced<br \/>\n4. Select Authorization in the dropdown and then in the field enter Bearer YOUR_ACCESS_TOKEN<\/p>\n<hr \/>\n<p>Recently Survey Monkey updated their REST API to version 3, which increases the difficulty of requesting data for use in your analysis tools (e.g., R, Power BI, etc.). The language and instructions used in this post should be easy enough for a non-developer (with patience) to understand.\u00a0The goal is to allow Survey Monkey account administrators to create Survey Monkey apps that then allow authenticating and getting data from their Survey Monkey account.<\/p>\n<p>Why would you want to do this? Well there could be several reasons but, for most people, the main benefit is to get real-time, updated data while eliminating the\u00a0need to login to Survey Monkey to perform several manual steps to get your data.<\/p>\n<p>There are two parts of this process: 1. Authentication, and 2. Getting the data<\/p>\n<p>You only need to authenticate occasionally since you can use a long lived token. For most people, the authentication part is the most difficult. Once we generate a token, getting data is pretty straightforward.<\/p>\n<h2 id=\"GetSurveyMonkeyDataUsingtheRESTAPI-High-LevelWorkflow\">High-Level Workflow<\/h2>\n<ol>\n<li>Survey Monkey account administrator creates a Survey Monkey app (or uses an existing app)<\/li>\n<li>Using the information provided with that app, get an access token to use for authentication with a data analysis tool<\/li>\n<li>Once access token has been acquired, use data analysis tool to authenticate into Survey Monkey REST API<\/li>\n<li>Retrieve Survey list to get survey ID<\/li>\n<li>Retrieve survey responses<\/li>\n<\/ol>\n<h2>Authenticate<\/h2>\n<p>Note: for the purposes of this guide, we will use Postman. You could choose a number of other routes but I think this is one of the more simple approaches for data analysts.<\/p>\n<ol>\n<li>Log in to <strong>Survey Monkey<\/strong><br \/>\n<a class=\"external-link\" href=\"https:\/\/www.surveymonkey.com\/\" rel=\"nofollow\">https:\/\/www.surveymonkey.com<\/a><\/li>\n<li>Go to <strong>My Apps<\/strong> in the Developer area<br \/>\nhttps:\/\/developer.surveymonkey.com\/apps\/<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/my_apps_survey_monkey_dev.png\"><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3077 alignnone\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/my_apps_survey_monkey_dev.png\" alt=\"my_apps_survey_monkey_dev\" width=\"461\" height=\"84\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps_survey_monkey_dev.png 796w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps_survey_monkey_dev-300x55.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps_survey_monkey_dev-768x140.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps_survey_monkey_dev-645x117.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps_survey_monkey_dev-662x121.png 662w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/a><\/li>\n<li>Either <strong>create a new app<\/strong> or <strong>use an existing app<br \/>\n<\/strong><a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/my_apps.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3078\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/my_apps.png\" alt=\"my_apps\" width=\"454\" height=\"150\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps.png 999w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps-300x99.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps-768x254.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps-645x213.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/my_apps-662x219.png 662w\" sizes=\"auto, (max-width: 454px) 100vw, 454px\" \/><\/a><\/li>\n<li>Click on <strong>Settings<\/strong> for your app and use this OAuth Redirect URL<br \/>\nhttps:\/\/www.getpostman.com\/oauth2\/callback<br \/>\n<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/oauth_redirect.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3079\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/oauth_redirect.png\" alt=\"oauth_redirect\" width=\"449\" height=\"137\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/oauth_redirect.png 747w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/oauth_redirect-300x92.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/oauth_redirect-645x197.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/oauth_redirect-662x202.png 662w\" sizes=\"auto, (max-width: 449px) 100vw, 449px\" \/><\/a><\/li>\n<li><strong>Install Postman<\/strong> on your computer<br \/>\nhttps:\/\/www.getpostman.com\/<br \/>\nOkay, this is where it gets complicated. I won&#8217;t go into details about why you have to use Postman. You could actually create a real app to interface with Survey Monkey but, since we just need to get data, this would be a lot of unnecessary work. So we fake it in order to get our access token using Postman.<\/li>\n<li><strong>Open Postman <\/strong>and enter basic info<br \/>\n<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/survey_monkey_Postman_connect.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3080\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/survey_monkey_Postman_connect.png\" alt=\"survey_monkey_postman_connect\" width=\"712\" height=\"183\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/survey_monkey_Postman_connect.png 899w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/survey_monkey_Postman_connect-300x77.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/survey_monkey_Postman_connect-768x197.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/survey_monkey_Postman_connect-645x166.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/survey_monkey_Postman_connect-662x170.png 662w\" sizes=\"auto, (max-width: 712px) 100vw, 712px\" \/><br \/>\n<\/a>a. Add this <strong>URL<\/strong> to GET<br \/>\nhttps:\/\/api.surveymonkey.net\/oauth\/authorize<\/p>\n<p>b. Select <strong>OAuth 2.0<\/strong><\/p>\n<p>c. click <strong>Get New Access Token<\/strong><\/li>\n<li>Now use the information from your Survey Monkey app in My Apps to complete the info and click Request Token<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/access_token_postman_sm.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3081\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/access_token_postman_sm.png\" alt=\"access_token_postman_sm\" width=\"512\" height=\"608\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/access_token_postman_sm.png 512w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/access_token_postman_sm-253x300.png 253w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/li>\n<li>It will prompt you to login using your Survey Monkey admin credentials and ask you to complete a captcha in order to <strong><\/strong><strong>Authorize<\/strong><\/li>\n<li>At long last, we will get our token. Use access_token to authenticate in your data analysis tool<a href=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/access_token_long_lived.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3082\" src=\"https:\/\/digitalborn.org\/wp-content\/uploads\/2016\/11\/access_token_long_lived.png\" alt=\"access_token_long_lived\" width=\"831\" height=\"170\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/access_token_long_lived.png 831w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/access_token_long_lived-300x61.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/access_token_long_lived-768x157.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/access_token_long_lived-645x132.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/11\/access_token_long_lived-662x135.png 662w\" sizes=\"auto, (max-width: 831px) 100vw, 831px\" \/><\/a><br \/>\nNote: you can create tokens that expire at a given date but that&#8217;s for another dayWhew! So with that out of the way, we can reuse this forever. You only have to do this once. Onward!<\/li>\n<\/ol>\n<h4>Examples<\/h4>\n<h4>Power BI Authentication Example<\/h4>\n<ol>\n<li>In Power BI Desktop, click on Get Data -&gt; Blank Query<\/li>\n<li>Click on Advanced Editor and use this to get a list of surveys from your Survey Monkey account. The two parts of this that are important are the Survey Monkey API URL and you will replace &#8220;&lt;&lt;API-TOKEN&gt;&gt;&#8221; with the access token you generated using Postman.\n<pre>let\r\n\u00a0\u00a0\u00a0 Source = Web.Contents(\"https:\/\/api.surveymonkey.net\/v3\/surveys\", [Headers=[#\"Authorization\"=\"bearer &lt;&lt;API-TOKEN&gt;&gt;\"]]),\r\n\u00a0\u00a0\u00a0 convertToJson = Json.Document(Source),\r\n\u00a0\u00a0\u00a0 toTable = Table.FromRecords({convertToJson})\r\nin\r\n\u00a0\u00a0\u00a0 toTable<\/pre>\n<\/li>\n<\/ol>\n<h4>R Authentication Example<\/h4>\n<p>You will enter your access token you painstakingly generated in Postman in the space where it says &#8220;Enter your access token for SurveyMonkey&#8221; below:<\/p>\n<pre>sm_get_surveys &lt;- function(auth_token, page = 1, per_page = 250) {\r\n if (missing(auth_token)) {\r\n auth_token &lt;- readline('Enter your access token for SurveyMonkey: ')\r\n }\r\n auth &lt;- paste(\"bearer\", auth_token, sep=\" \");\r\n url &lt;- paste('https:\/\/api.surveymonkey.net\/v3\/surveys?page=', page, '&amp;per_page=', per_page, sep='')\r\n survey_list_response &lt;- httr::GET(url=url, add_headers(\"Content-Type\" = \"application\/json\", \"Authorization\" = auth ))\r\n \r\n if (survey_list_response$status_code != 200) {\r\n stop(paste('Bad response from server: ', httr::http_status(survey_list_response)))\r\n }\r\n json &lt;- httr::content(survey_list_response, as = 'text')\r\n survey_list &lt;- jsonlite::fromJSON(json)\r\n survey_list\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<h2>Get the Data<\/h2>\n<p>So after you authenticate, you have to request the data. I&#8217;ll show you how to get all of the responses for a survey but there are a lot of options available:<br \/>\n<a href=\"https:\/\/developer.surveymonkey.com\/api\/v3\/\">https:\/\/developer.surveymonkey.com\/api\/v3\/<\/a><\/p>\n<ol>\n<li>Get survey list (list of survey ids)<br \/>\n<a href=\"https:\/\/api.surveymonkey.net\/v3\/surveys\">https:\/\/api.surveymonkey.net\/v3\/surveys<\/a><\/li>\n<li>Use a specific survey id from the list retrieved in #1 to get responses in bulk<br \/>\n<a href=\"https:\/\/api.surveymonkey.net\/v3\/surveys\/{survey_id}\/responses\/bulk\">https:\/\/api.surveymonkey.net\/v3\/surveys\/{survey_id}\/responses\/bulk<\/a><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article demonstrates how to engage with the Survey Monkey API to get form data.<\/p>\n","protected":false},"author":5,"featured_media":3084,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[162,143,114],"tags":[150,172,171,170],"class_list":["post-3076","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-api","category-data","category-tech-tips","tag-api","tag-oauth","tag-postman","tag-survey-monkey"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3076","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3076"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3076\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3084"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":3044,"date":"2016-07-05T16:00:18","date_gmt":"2016-07-05T20:00:18","guid":{"rendered":"http:\/\/digitalborn.org\/?p=3044"},"modified":"2016-07-05T18:25:12","modified_gmt":"2016-07-05T22:25:12","slug":"unlock-form-data-formidable-zapier-webhooks","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/unlock-form-data-formidable-zapier-webhooks\/","title":{"rendered":"Unlock Form Data: Formidable and Webhooks by Zapier"},"content":{"rendered":"<p>Want to send Formidable form data using Zapier? If you&#8217;re using WordPress and Formidable forms, then you will likely find this guide helpful. This quick how-to guide walks you through easily sending your form data to other apps and services.<\/p>\n<p>Examples:<\/p>\n<ul>\n<li>When someone submits a form, add the entry to Google Sheets<\/li>\n<li>When someone updates an entry, add a new line to a DropBox text file<\/li>\n<li>When someone creates an entry, add a row to a PostgreSQL database<\/li>\n<\/ul>\n<p>The options are really only limited to the available apps in Zapier.<\/p>\n<h3>What You Need<\/h3>\n<ul>\n<li>WordPress site<\/li>\n<li>Formidable Pro plugin<\/li>\n<li>Formidable API plugin<\/li>\n<li>Zapier account<\/li>\n<\/ul>\n<h3>How It Works<\/h3>\n<ol>\n<li>Go to Form you want to collect reporting data from<\/li>\n<li>Add a Form Action to form in Settings -&gt; Form Actions<\/li>\n<li>Select the action &#8220;Send API data&#8221;<br \/>\n<a href=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/send_data_to_api_formidable.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3047\" src=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/send_data_to_api_formidable.png\" alt=\"send_data_to_api_formidable\" width=\"500\" height=\"197\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/send_data_to_api_formidable.png 718w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/send_data_to_api_formidable-300x118.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/send_data_to_api_formidable-645x254.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/send_data_to_api_formidable-662x261.png 662w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/li>\n<li>Click the &#8220;Insert Default&#8221; button for Data Format in your &#8220;Send API data&#8221; form action<br \/>\n<a href=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/insert_default_formidable.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3048\" src=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/insert_default_formidable-1024x210.png\" alt=\"insert_default_formidable\" width=\"604\" height=\"124\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/insert_default_formidable-1024x210.png 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/insert_default_formidable-300x62.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/insert_default_formidable-768x158.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/insert_default_formidable-645x132.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/insert_default_formidable-662x136.png 662w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/insert_default_formidable.png 1214w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/li>\n<li>For &#8220;Trigger this action&#8221;, select &#8220;Create&#8221; and &#8220;Update&#8221; in the form action<br \/>\n<a href=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/trigger_action_formidable.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3049\" src=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/trigger_action_formidable.gif\" alt=\"trigger_action_formidable\" width=\"373\" height=\"113\" \/><\/a><\/li>\n<li>Log into Zapier, and click &#8220;Make a Zap&#8221;<\/li>\n<li>Select Webhooks by Zapier<\/li>\n<li>For Trigger, select &#8220;Catch Hook&#8221; and Continue<\/li>\n<li>Just skip the optional &#8220;Pick off a child key&#8221; by clicking Continue<\/li>\n<li>Copy the Webhook URL provided by Zapier<br \/>\n<a href=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/zapier_webhooks.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3051 size-full\" src=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/zapier_webhooks.gif\" alt=\"zapier_webhooks\" width=\"1610\" height=\"760\" \/><\/a><\/li>\n<li>Paste this webhook URL into my &#8220;Send API data&#8221; form action in the Notification URL field<br \/>\n<a href=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/notification_url_formidable-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3053\" src=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/07\/notification_url_formidable-1.png\" alt=\"notification_url_formidable (1)\" width=\"512\" height=\"150\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/notification_url_formidable-1.png 974w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/notification_url_formidable-1-300x88.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/notification_url_formidable-1-768x225.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/notification_url_formidable-1-645x189.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/07\/notification_url_formidable-1-662x194.png 662w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/li>\n<li>Click Continue in Zapier and then select your action app (e.g., Excel, Google Sheets, MySQL, etc.)<\/li>\n<li>Create a test entry in Formidable<\/li>\n<li>Do the necessary mapping<\/li>\n<li>Turn the Zap to On<\/li>\n<\/ol>\n<p>That&#8217;s it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Want to send Formidable form data using Zapier? If you&#8217;re using WordPress and Formidable forms, then you will likely find this guide helpful. This quick how-to guide walks you through easily sending your form data to other apps and services. Examples: When someone submits a form, add the entry to Google Sheets When someone updates [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":3055,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[162,114],"tags":[150,159,168,145,167],"class_list":["post-3044","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-api","category-tech-tips","tag-api","tag-formidable","tag-webhooks","tag-wordpress","tag-zapier"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3044","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3044"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3044\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3055"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3044"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3044"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3044"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":3030,"date":"2016-06-27T12:36:34","date_gmt":"2016-06-27T16:36:34","guid":{"rendered":"http:\/\/digitalborn.org\/?p=3030"},"modified":"2016-06-30T17:21:18","modified_gmt":"2016-06-30T21:21:18","slug":"send-wordpress-multisite-emails-mailgun","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/send-wordpress-multisite-emails-mailgun\/","title":{"rendered":"How to Send WordPress Multisite Emails with Mailgun"},"content":{"rendered":"<p>What is Mailgun and why would you want to use it on your WordPress network? Like Mandrill, AWS Simple Email Service (SES), and Mailjet, Mailgun is a transactional email service that allows you to offload the complex and frustrating task of email routing and delivery. While you can send emails directly from your WordPress server, this can be 1. risky because you (or your host) could end up labeled as a spam originator, and 2. your mail is less likely to be delivered from a shared IP or server. \u00a0You know those envelopes you receive with a generic return label or addressed to &#8220;current resident&#8221;? That&#8217;s what your email looks like to other email services if you aren&#8217;t using a transactional email service like Mailgun.<\/p>\n<p>I recommend Mailgun to most clients because Mandrill, which is owned by MailChimp, decided to start charging everyone for a MailChimp account even if they were only using the transactional mail service. If you already pay for MailChimp, it may make sense for you to use Mandrill instead of Mailgun. If you don&#8217;t already pay for a MailChimp account, it is much cheaper (mostly likely free) to use Mailgun.<\/p>\n<p>In addition, in my experience Mailgun is the easiest to configure, especially for WordPress Multisite. Plus, you get 10,000 free emails per month. Unless you have a really large network, you will get tracking and logging features as well as improved rates of delivery without paying a dime.<\/p>\n<h2>Get Started<\/h2>\n<ol>\n<li>Create a <a href=\"https:\/\/www.mailgun.com\/\">Mailgun account<\/a><\/li>\n<li>Add your domain (e.g., example.com)<a href=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/06\/add_new_domain.png\"><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3031\" src=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/06\/add_new_domain.png\" alt=\"Add New Domain Mailgun\" width=\"279\" height=\"164\" \/><br \/>\n<\/a><\/li>\n<li>Mailgun will provide you with records to add to your domain: 2 TXT, 1 CNAME, and 2 MX records.<br \/>\nDepending on your domain registrar, this may differ slightly but you will login to GoDaddy or Bluehost or Namecheap, etc., click on Domain Manager. You will then follow the instructions in Mailgun<\/li>\n<li>Once these are added, click Check DNS Records Now<a href=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/06\/check_dns_records.png\"><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3032 size-medium\" src=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/06\/check_dns_records-300x84.png\" alt=\"check_dns_records\" width=\"300\" height=\"84\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/06\/check_dns_records-300x84.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/06\/check_dns_records.png 329w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><br \/>\n<\/a>If all goes well, you will see a green Active notice, which indicates that you&#8217;ve correctly verified your domain.<\/li>\n<li>Add the Mailgun WordPress plugin to your site<br \/>\n[button link=&#8221;https:\/\/wordpress.org\/plugins\/mailgun\/&#8221; bg_color=&#8221;#ffffff&#8221; border=&#8221;#676767&#8243; text=&#8221;dark&#8221;\u00a0window=&#8221;yes&#8221;]Mailgun Plugin[\/button]<\/li>\n<li>Open your wp-config.php file and enter these six lines:<br \/>\n<code>define('MAILGUN_USEAPI', true);<br \/>\ndefine('MAILGUN_APIKEY', 'key-yourkeyhere');<br \/>\ndefine('MAILGUN_DOMAIN', 'mydomain.com' );<br \/>\ndefine('MAILGUN_USERNAME', 'postmaster');<br \/>\ndefine('MAILGUN_PASSWORD', 'yourMailgunSMTPpasswordhere');<br \/>\ndefine('MAILGUN_SECURE', false);<\/code>You can find this information by clicking on Domains and then click on your verified domain<\/li>\n<li>Go back to your WP network admin dashboard and Network Activate the Mailgun plugin.<\/li>\n<\/ol>\n<p>That&#8217;s it.<\/p>\n<p>Now your emails will be sent using Mailgun instead of your server.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>What is Mailgun and why would you want to use it on your WordPress network? Like Mandrill, AWS Simple Email Service (SES), and Mailjet, Mailgun is a transactional email service that allows you to offload the complex and frustrating task of email routing and delivery. While you can send emails directly from your WordPress server, [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":3037,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[114],"tags":[165,166,145],"class_list":["post-3030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-tips","tag-email","tag-mailgun","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3030"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3030\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3037"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":3017,"date":"2016-06-20T14:01:51","date_gmt":"2016-06-20T18:01:51","guid":{"rendered":"http:\/\/digitalborn.org\/?p=3017"},"modified":"2025-02-22T11:24:15","modified_gmt":"2025-02-22T16:24:15","slug":"display-wp-posts-rest-api","status":"publish","type":"post","link":"https:\/\/digitalborn.org\/display-wp-posts-rest-api\/","title":{"rendered":"Display WordPress Posts on Another Site with WP REST API"},"content":{"rendered":"<h2>Overview<\/h2>\n<p>Have a WordPress site and want to include\u00a0your posts on an external site? In this tutorial, I will show you how to use the WordPress REST API to display your posts on a static site with just HTML, CSS, and Javascript.<\/p>\n<p>There are several scenarios where this might be useful but here are the two directly applicable to this tutorial:<\/p>\n<ul>\n<li>You want to display a feed of posts on static web hosting\u00a0(e.g., GitHub Pages, AWS S3, etc.) for your professional web presence<\/li>\n<li>You want to use posts from a particular author, category, or tag for separate site(s)<\/li>\n<\/ul>\n<p>Skill Level: Beginner<\/p>\n<h2>Getting Started<\/h2>\n<p><strong>Update 3\/31\/17:<\/strong> If you are using WP 4.7 or above you can skip to step 3. The WP REST API is now part of core. No need for a plugin.<\/p>\n<ol>\n<li>Login to your WordPress site and add the <a href=\"https:\/\/wordpress.org\/plugins\/rest-api\/\">WP REST API V2 plugin<\/a><\/li>\n<li>Activate the plugin<br \/>\n<a href=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-20-at-1.11.13-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-3018\" src=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-20-at-1.11.13-PM-1024x77.png\" alt=\"Activate WP REST API Plugin\" width=\"960\" height=\"72\" srcset=\"https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-20-at-1.11.13-PM-1024x77.png 1024w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-20-at-1.11.13-PM-300x23.png 300w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-20-at-1.11.13-PM-768x58.png 768w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-20-at-1.11.13-PM-645x49.png 645w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-20-at-1.11.13-PM-662x50.png 662w, https:\/\/digitalborn.wpenginepowered.com\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-20-at-1.11.13-PM.png 1960w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/a><\/li>\n<li>Find your route and define any endpoints. For our purposes, we&#8217;re going to retrieve all posts so we will use\n<pre>http:\/\/example.com\/wp-json\/wp\/v2\/posts\/<\/pre>\n<p>For example, to get all posts for this site, I will use<\/p>\n<pre><a href=\"http:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\">http:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts<\/a><\/pre>\n<p>Go ahead and copy and paste that URL into your browser. You&#8217;ll get a bunch of JSON data. That&#8217;s exactly what we want.<\/p>\n<p>Note that you can narrow down your results by\u00a0adding to the route. Quick terminology refresher:<\/p>\n<p>Base path of API:\u00a0http:\/\/example.com\/wp-json\/<br \/>\nRoute:\u00a0wp\/v2\/posts<\/p>\n<p>For example, we can grab just one post with the ID 2985 like this<\/p>\n<pre><a href=\"http:\/\/digitalborn.org\/wp-json\/wp-v2\/posts\/2985\">http:\/\/digitalborn.org\/wp-json\/wp-v2\/posts\/2985<\/a><\/pre>\n<p>Or, if we want to get posts with tag ID 139<\/p>\n<pre><a href=\"http:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts?tags=139\">http:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts?tags=139<\/a><\/pre>\n<p>For the full reference you can see the <a href=\"http:\/\/v2.wp-api.org\/reference\/posts\/\" target=\"_blank\" rel=\"noopener\">WP REST API documentation for posts<\/a><\/li>\n<li>Test the route in your browser. If you get post data, then we can move to the next step.Note: Only public posts will display. You can also display private posts but this is more complex and we won&#8217;t deal with private posts in this tutorial.<\/li>\n<\/ol>\n<h2>Get the Sample Files<\/h2>\n<p>I&#8217;ve added some files to get you started that allow you to simply paste the route you identified above and display posts.<\/p>\n<ol>\n<li>Clone or <strong>download the tutorial files<\/strong> located here<a href=\"https:\/\/github.com\/nathanegraham\/wp-rest-api-post-getter\">https:\/\/github.com\/nathanegraham\/wp-rest-api-post-getter<\/a>For those using the GitHub client you will click Open in Desktop. For those who do not use GitHub, just click Download Zip and then extract\/unzip the files<a href=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/06\/github_repo_download.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3019\" src=\"http:\/\/digitalborn.org\/wp-content\/uploads\/2016\/06\/github_repo_download.gif\" alt=\"GitHub repo download\" width=\"474\" height=\"205\" \/><\/a><\/li>\n<li><strong>Open script.js<\/strong> in your favorite editor (Brackets is pretty great)<\/li>\n<li><strong>In Line 2, change the route<\/strong> to the one you identified in the Getting Started section above<\/li>\n<li>Hit <strong>Save<\/strong><\/li>\n<li>Now <strong>open index.html<\/strong> in your browser<\/li>\n<\/ol>\n<h2>Putting It All Together<\/h2>\n<p>Now that you have your JSON post data and you have the files to display this data on a webpage, you can add it to your site.<\/p>\n<ol>\n<li>Upload the Javascript files to your site&#8217;s directory.<br \/>\nIf you don&#8217;t have static web hosting I would recommend using AWS S3 or GitHub Pages. Both are free and easy to set up. I won&#8217;t go into the details but you can find instructions for <a href=\"http:\/\/docs.aws.amazon.com\/gettingstarted\/latest\/swh\/website-hosting-intro.html\">AWS S3 site hosting here<\/a> and <a href=\"https:\/\/pages.github.com\/\">GitHub Pages hosting here<\/a>.<\/li>\n<li>Open index.html and copy everything between the &lt;body&gt; tags<\/li>\n<li>Paste that HTML wherever you would like inside your webpage<\/li>\n<li>Now you will need to tweak the styles and formatting to match the rest of your existing site.For an example of a modified version of of the HTML in this tutorial, see my site<a href=\"http:\/\/nathanegraham.github.io\/\">http:\/\/nathanegraham.github.io\/<\/a>Notice that I have removed the image thumbnail and the excerpt. I&#8217;ve also moved the date before the post title.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Overview Have a WordPress site and want to include\u00a0your posts on an external site? In this tutorial, I will show you how to use the WordPress REST API to display your posts on a static site with just HTML, CSS, and Javascript. There are several scenarios where this might be useful but here are the [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":3020,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[162,143,49,114],"tags":[163,164,145],"class_list":["post-3017","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-api","category-data","category-design-2","category-tech-tips","tag-rest-api","tag-tutorial","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3017","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/comments?post=3017"}],"version-history":[{"count":0,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/posts\/3017\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media\/3020"}],"wp:attachment":[{"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/media?parent=3017"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/categories?post=3017"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalborn.org\/wp-json\/wp\/v2\/tags?post=3017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}]