{"id":13423,"date":"2023-06-24T12:56:22","date_gmt":"2023-06-24T02:56:22","guid":{"rendered":"https:\/\/terem.tech\/?p=13423"},"modified":"2023-06-27T09:25:09","modified_gmt":"2023-06-26T23:25:09","slug":"api-file-upload-best-practice","status":"publish","type":"post","link":"https:\/\/terem.tech\/api-file-upload-best-practice\/","title":{"rendered":"REST API File Upload Best Practice"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"800\" height=\"600\" src=\"https:\/\/terem.tech\/wp-content\/uploads\/2023\/06\/api-upload.png\" alt=\"api upload\" class=\"wp-image-13432\"\/><\/figure><\/div>\n\n\n\n<p>Uploading files to an API might seem like a solved problem, and mostly it is, but the trick is selecting the best practice solution for your situation.&nbsp;&nbsp;<\/p>\n\n\n\n<p>This post provides a view of REST API file upload best practice for engineers <em>and <\/em>managers.<\/p>\n\n\n\n<p>We\u2019ll give an overview of the solutions for those that are less technical as well as dive into some of the technical details. This is essential to help engineers and managers understand each other, what is being proposed and how to decide on a solution.<\/p>\n\n\n\n<p>Let\u2019s establish some context first, what do we mean by a REST API file upload and why does it matter?<\/p>\n\n\n\n<h2><strong>REST API File Upload: What is It, Why It Matters<\/strong><\/h2>\n\n\n\n<p>Before we can get into discussing how to handle file uploads specifically we need to cover off some explanations and background:<\/p>\n\n\n\n<ul><li><strong>APIs<\/strong> are interfaces that define and enable two computer systems to communicate.&nbsp;<\/li><li><strong>REST<\/strong> is a common and highly popular approach to designing and building APIs.&nbsp;<\/li><li><strong>Files<\/strong> come in all different shapes and sizes. They could be a few bytes through to megabytes or gigabytes in size.<\/li><\/ul>\n\n\n\n<p>Going into detail on these is beyond the scope of this post.&nbsp;<\/p>\n\n\n\n<p>So now, why do we need to discuss file uploads and APIs? There are a few reasons:<\/p>\n\n\n\n<ol><li><strong>Response times<\/strong>: It\u2019s generally best practice for APIs, particularly RESTful APIs, to respond quickly. Even if an API call initiates a long running operation, the API should respond quickly with something like \u201cI\u2019ve successfully started the job that will take a while\u201d. Files can make this challenging because they can take time to upload.<\/li><li><strong>Blocking resources:<\/strong> With the need for APIs to have short response times and be available to respond, file uploads tend to consume API service resources and block them out from use by other consumers or API calls. That is, while a file is uploading an API service worker is busy receiving the file and unable to respond to requests.&nbsp;<\/li><li><strong>Compute usage:<\/strong> Given API services usually have some functionality or smarts built in, receiving files usually isn\u2019t the best use of compute power. \u2018Dumber\u2019 or fit for purpose file upload and receive services are better suited.<\/li><\/ol>\n\n\n\n<h2><strong>API File Upload Solutions<\/strong><\/h2>\n\n\n\n<p>Now that we\u2019ve covered the context and the problem we can now look at different solutions you can provide for your API.&nbsp;<\/p>\n\n\n\n<p>The solutions we\u2019ll cover:<\/p>\n\n\n\n<ol><li>Embed File<\/li><li>Link File&nbsp;<\/li><li>Upload then Link<\/li><li>API Call then Upload<\/li><\/ol>\n\n\n\n<p>We\u2019ll then close out by looking at some of the other considerations around files and APIs.<\/p>\n\n\n\n<p>To help work through the solutions let\u2019s establish an example API we can come back to throughout the solutions.<\/p>\n\n\n\n<p><strong>Example API: PetCo<\/strong><\/p>\n\n\n\n<p>We need to deliver APIs for a pet insurance company, PetCo. We will mostly focus on PetCo\u2019s Quote API, a fictitious API that we can call to get an insurance quote from PetCo.&nbsp;<\/p>\n\n\n\n<p>For engineers the endpoint might be: GET <code>api.petco.com\/quote<\/code><\/p>\n\n\n\n<h3><strong>Embed File in API Call<\/strong><\/h3>\n\n\n\n<p>You can embed a file directly into an API call. When the API consumer sends their request for a quote they include the file in the API call itself, so there is just one query.&nbsp;<\/p>\n\n\n\n<p>In our PetCo Quote API example, if we required a CSV of past medical expenses as part of the quote and we expect it to be fairly small for a pet then there are merits to embedding this in the API call of GET api.petco.com\/quote.<\/p>\n\n\n\n<p>The benefit of this is simplicity. It\u2019s all in one. Easy to understand. Easy to use. Easy to build.<\/p>\n\n\n\n<p>The downside is you are consuming smarter compute resources doing something simpler, often at a higher cost than purposely designed resources. The other downside is, file processing time slows down responding to your consumer.<\/p>\n\n\n\n<p>This can be suitable for small file sizes.&nbsp;<\/p>\n\n\n\n<p>This isn\u2019t suitable where you will have one or more files that start to measure in megabytes.<\/p>\n\n\n\n<h3><strong>Link File as URI in API Call<\/strong><\/h3>\n\n\n\n<p>You can link to a file within the API call using a URI (essentially a URL like www.site.com\/file-123.pdf). The API service then knows to go and fetch the file from the URI specified and can download it in whatever the best way is.<\/p>\n\n\n\n<p>In our PetCo Quote API example, if we want a photo of the dog as part of the quote then someone developing against the API could make the photo available on a public cloud bucket (e.g. AWS S3 or GCP Storage Bucket). Then just put the link to it in the API call.\u00a0<\/p>\n\n\n\n<p>The benefit of this is simplicity for the API provider (PetCo in our example). It also allows you to use appropriate compute resources for downloading the file to where you need it.<\/p>\n\n\n\n<p>The downside is that, on its own, can be difficult for API consumers &#8211; the people developing against and using your API. They need to develop a solution to hold the files that your API needs access to and this location must be accessible by your API. It\u2019s possible this introduces some security risks on their side if not implemented well (e.g. photos of anyone that got a quote is publicly available).<\/p>\n\n\n\n<p>These downsides make this an unattractive solution in most cases, however it gives us the foundation for some more solution options that we will cover next.<\/p>\n\n\n\n<h3><strong>Upload Then Link<\/strong><\/h3>\n\n\n\n<p>You can build on the Link File solution by providing an upload service to your API consumers.<\/p>\n\n\n\n<p>The way it would work is this:<\/p>\n\n\n\n<ol><li><strong>Consumer uploads files: <\/strong>API consumer uses your file upload service to upload their file(s) (e.g. PUT <code>files.petco.com\/quote\/photos<\/code>)<\/li><li><strong>Call API<\/strong>: API consumer then calls your API, giving it the links to the files that were uploaded. (e.g. GET <code>api.petco.com\/quote<\/code>)<\/li><\/ol>\n\n\n\n<p>The API call itself can respond quickly and you\u2019ve made it easy for users to upload files. Compute resources are used effectively. So we\u2019ve overcome some of the challenges with the approaches we\u2019ve already covered.<\/p>\n\n\n\n<p>The challenge with this approach is you\u2019re relying on the user to associate files properly and you are potentially allowing file uploads from people that should not be allowed to do so (which makes various attacks possible, not to mention handling files unnecessarily).&nbsp;<\/p>\n\n\n\n<h3><strong>API Call Then Upload<\/strong><\/h3>\n\n\n\n<p>This solution works in the following steps:<\/p>\n\n\n\n<ol><li><strong>Call the API:<\/strong> A consumer calls your API which gives you a token or location as well as authorisation to upload.<\/li><li><strong>Upload files:<\/strong> A consumer then uploads the files to or with the appropriate location(s) and token(s) respectively. They also have authorisation to do so.<\/li><\/ol>\n\n\n\n<p>To continue the PetCo Quote example, here is how we would do a quote with a photo of the dog as well as the CSV with past expenses. Let\u2019s step through it:<\/p>\n\n\n\n<ol><li>An API consumer could call the Quote API to get a quote (e.g. GET api.petco.com\/quote)<\/li><li>The Get Quote API would respond quickly with a quote identifier or token to use.<\/li><li>The API consumer then calls Get Quote File Upload Service, specifying the quote identifier and file type.<br>e.g. PUT <code>files.petco.com\/quote\/{quote-id}\/photos<\/code><\/li><li>After some time authorisation to upload is revoked from this API consumer.<\/li><\/ol>\n\n\n\n<p>The API call itself can respond quickly and compute resources are used most effectively. You can also control data processing.<\/p>\n\n\n\n<p>The downside is relatively minor in that you\u2019ve introduced an extra step. So it\u2019s not as simple as embedding the file. However, this extra step outweighs the downsides of embedding, even with smaller files.<\/p>\n\n\n\n<h2><strong>Other Considerations for API File Uploads<\/strong><\/h2>\n\n\n\n<p>Some of the other considerations for uploading files and APIs are:<\/p>\n\n\n\n<ol><li><strong>File Security<\/strong>: the file you are accepting, however you accept it, introduces security risks. Consider how your preferred solution needs to be secured.<\/li><li><strong>Authentication<\/strong>: if you have a separate service for file uploads, you will need to consider how you authenticate and secure this service.<\/li><li><strong>Transfers<\/strong>: there may be use cases where, independent of the API, you allow for files to be transferred to you before or after the API call.<\/li><\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Uploading files to an API might seem like a solved problem, and mostly it is, but the trick is selecting the best practice solution for your situation.&nbsp;&nbsp; This post provides a view of REST API file upload best practice for engineers and managers. We\u2019ll give an overview of the solutions for those that are less [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":13432,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[361,364,677],"tags":[199,678,117],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v17.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>REST API File Upload Best Practice - Terem<\/title>\n<meta name=\"description\" content=\"This post provides a view of REST API file upload best practice for engineers and managers.We\u2019ll give an overview of the solutions for those that are less technical as well as dive into some of the technical details.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/terem.tech\/api-file-upload-best-practice\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"REST API File Upload Best Practice - Terem\" \/>\n<meta property=\"og:description\" content=\"This post provides a view of REST API file upload best practice for engineers and managers.We\u2019ll give an overview of the solutions for those that are less technical as well as dive into some of the technical details.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/terem.tech\/api-file-upload-best-practice\/\" \/>\n<meta property=\"og:site_name\" content=\"Terem\" \/>\n<meta property=\"article:publisher\" content=\"http:\/\/www.facebook.com\/pages\/Terem-Technologies\/260762007388800\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-24T02:56:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-26T23:25:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/terem.tech\/wp-content\/uploads\/2023\/06\/api-upload.png\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@scottmiddleton\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Scott Middleton\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/terem.tech\/#organization\",\"name\":\"Terem\",\"url\":\"https:\/\/terem.tech\/\",\"sameAs\":[\"http:\/\/www.facebook.com\/pages\/Terem-Technologies\/260762007388800\",\"https:\/\/www.linkedin.com\/company\/terem-technologies\",\"https:\/\/www.youtube.com\/channel\/UClTRWiXCjzWnQUMJ3HAJK8w\"],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/terem.tech\/#logo\",\"inLanguage\":\"en-AU\",\"url\":\"https:\/\/terem.tech\/wp-content\/uploads\/2022\/01\/terem_logo_dark_1.png\",\"contentUrl\":\"https:\/\/terem.tech\/wp-content\/uploads\/2022\/01\/terem_logo_dark_1.png\",\"width\":512,\"height\":204,\"caption\":\"Terem\"},\"image\":{\"@id\":\"https:\/\/terem.tech\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/terem.tech\/#website\",\"url\":\"https:\/\/terem.tech\/\",\"name\":\"Terem\",\"description\":\"Tech Product Development and Strategy Firm\",\"publisher\":{\"@id\":\"https:\/\/terem.tech\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/terem.tech\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-AU\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/#primaryimage\",\"inLanguage\":\"en-AU\",\"url\":\"https:\/\/terem.tech\/wp-content\/uploads\/2023\/06\/api-upload.png\",\"contentUrl\":\"https:\/\/terem.tech\/wp-content\/uploads\/2023\/06\/api-upload.png\",\"width\":800,\"height\":600},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/#webpage\",\"url\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/\",\"name\":\"REST API File Upload Best Practice - Terem\",\"isPartOf\":{\"@id\":\"https:\/\/terem.tech\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/#primaryimage\"},\"datePublished\":\"2023-06-24T02:56:22+00:00\",\"dateModified\":\"2023-06-26T23:25:09+00:00\",\"description\":\"This post provides a view of REST API file upload best practice for engineers and managers.We\\u2019ll give an overview of the solutions for those that are less technical as well as dive into some of the technical details.\",\"breadcrumb\":{\"@id\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/#breadcrumb\"},\"inLanguage\":\"en-AU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/terem.tech\/api-file-upload-best-practice\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/terem.tech\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"APIs\",\"item\":\"https:\/\/terem.tech\/category\/apis\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"REST API File Upload Best Practice\"}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/#webpage\"},\"author\":{\"@id\":\"https:\/\/terem.tech\/#\/schema\/person\/278030081e1ebb2223e3b19592d3f2d0\"},\"headline\":\"REST API File Upload Best Practice\",\"datePublished\":\"2023-06-24T02:56:22+00:00\",\"dateModified\":\"2023-06-26T23:25:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/#webpage\"},\"wordCount\":1365,\"publisher\":{\"@id\":\"https:\/\/terem.tech\/#organization\"},\"image\":{\"@id\":\"https:\/\/terem.tech\/api-file-upload-best-practice\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/terem.tech\/wp-content\/uploads\/2023\/06\/api-upload.png\",\"keywords\":[\"API\",\"REST\",\"Software development\"],\"articleSection\":[\"APIs\",\"Blog\",\"Software Development\"],\"inLanguage\":\"en-AU\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/terem.tech\/#\/schema\/person\/278030081e1ebb2223e3b19592d3f2d0\",\"name\":\"Scott Middleton\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/terem.tech\/#personlogo\",\"inLanguage\":\"en-AU\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/807433305f086334607897e7652187ca?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/807433305f086334607897e7652187ca?s=96&r=g\",\"caption\":\"Scott Middleton\"},\"description\":\"Scott Middleton is the CEO and founder of Terem, Australia\\u2019s leading tech product development firm. Terem has featured on the Financial Review\\u2019s Fast 100 for two years running. Scott has been involved in the launch and growth of 61+ products.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/scottmiddleton\/\",\"https:\/\/twitter.com\/scottmiddleton\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"REST API File Upload Best Practice - Terem","description":"This post provides a view of REST API file upload best practice for engineers and managers.We\u2019ll give an overview of the solutions for those that are less technical as well as dive into some of the technical details.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/terem.tech\/api-file-upload-best-practice\/","og_locale":"en_US","og_type":"article","og_title":"REST API File Upload Best Practice - Terem","og_description":"This post provides a view of REST API file upload best practice for engineers and managers.We\u2019ll give an overview of the solutions for those that are less technical as well as dive into some of the technical details.","og_url":"https:\/\/terem.tech\/api-file-upload-best-practice\/","og_site_name":"Terem","article_publisher":"http:\/\/www.facebook.com\/pages\/Terem-Technologies\/260762007388800","article_published_time":"2023-06-24T02:56:22+00:00","article_modified_time":"2023-06-26T23:25:09+00:00","og_image":[{"width":800,"height":600,"url":"https:\/\/terem.tech\/wp-content\/uploads\/2023\/06\/api-upload.png","path":"\/home\/teremtec\/public_html\/wp-content\/uploads\/2023\/06\/api-upload.png","size":"full","id":13432,"alt":"","pixels":480000,"type":"image\/png"}],"twitter_card":"summary_large_image","twitter_creator":"@scottmiddleton","twitter_misc":{"Written by":"Scott Middleton","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Organization","@id":"https:\/\/terem.tech\/#organization","name":"Terem","url":"https:\/\/terem.tech\/","sameAs":["http:\/\/www.facebook.com\/pages\/Terem-Technologies\/260762007388800","https:\/\/www.linkedin.com\/company\/terem-technologies","https:\/\/www.youtube.com\/channel\/UClTRWiXCjzWnQUMJ3HAJK8w"],"logo":{"@type":"ImageObject","@id":"https:\/\/terem.tech\/#logo","inLanguage":"en-AU","url":"https:\/\/terem.tech\/wp-content\/uploads\/2022\/01\/terem_logo_dark_1.png","contentUrl":"https:\/\/terem.tech\/wp-content\/uploads\/2022\/01\/terem_logo_dark_1.png","width":512,"height":204,"caption":"Terem"},"image":{"@id":"https:\/\/terem.tech\/#logo"}},{"@type":"WebSite","@id":"https:\/\/terem.tech\/#website","url":"https:\/\/terem.tech\/","name":"Terem","description":"Tech Product Development and Strategy Firm","publisher":{"@id":"https:\/\/terem.tech\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/terem.tech\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-AU"},{"@type":"ImageObject","@id":"https:\/\/terem.tech\/api-file-upload-best-practice\/#primaryimage","inLanguage":"en-AU","url":"https:\/\/terem.tech\/wp-content\/uploads\/2023\/06\/api-upload.png","contentUrl":"https:\/\/terem.tech\/wp-content\/uploads\/2023\/06\/api-upload.png","width":800,"height":600},{"@type":"WebPage","@id":"https:\/\/terem.tech\/api-file-upload-best-practice\/#webpage","url":"https:\/\/terem.tech\/api-file-upload-best-practice\/","name":"REST API File Upload Best Practice - Terem","isPartOf":{"@id":"https:\/\/terem.tech\/#website"},"primaryImageOfPage":{"@id":"https:\/\/terem.tech\/api-file-upload-best-practice\/#primaryimage"},"datePublished":"2023-06-24T02:56:22+00:00","dateModified":"2023-06-26T23:25:09+00:00","description":"This post provides a view of REST API file upload best practice for engineers and managers.We\u2019ll give an overview of the solutions for those that are less technical as well as dive into some of the technical details.","breadcrumb":{"@id":"https:\/\/terem.tech\/api-file-upload-best-practice\/#breadcrumb"},"inLanguage":"en-AU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/terem.tech\/api-file-upload-best-practice\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/terem.tech\/api-file-upload-best-practice\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/terem.tech\/"},{"@type":"ListItem","position":2,"name":"APIs","item":"https:\/\/terem.tech\/category\/apis\/"},{"@type":"ListItem","position":3,"name":"REST API File Upload Best Practice"}]},{"@type":"Article","@id":"https:\/\/terem.tech\/api-file-upload-best-practice\/#article","isPartOf":{"@id":"https:\/\/terem.tech\/api-file-upload-best-practice\/#webpage"},"author":{"@id":"https:\/\/terem.tech\/#\/schema\/person\/278030081e1ebb2223e3b19592d3f2d0"},"headline":"REST API File Upload Best Practice","datePublished":"2023-06-24T02:56:22+00:00","dateModified":"2023-06-26T23:25:09+00:00","mainEntityOfPage":{"@id":"https:\/\/terem.tech\/api-file-upload-best-practice\/#webpage"},"wordCount":1365,"publisher":{"@id":"https:\/\/terem.tech\/#organization"},"image":{"@id":"https:\/\/terem.tech\/api-file-upload-best-practice\/#primaryimage"},"thumbnailUrl":"https:\/\/terem.tech\/wp-content\/uploads\/2023\/06\/api-upload.png","keywords":["API","REST","Software development"],"articleSection":["APIs","Blog","Software Development"],"inLanguage":"en-AU"},{"@type":"Person","@id":"https:\/\/terem.tech\/#\/schema\/person\/278030081e1ebb2223e3b19592d3f2d0","name":"Scott Middleton","image":{"@type":"ImageObject","@id":"https:\/\/terem.tech\/#personlogo","inLanguage":"en-AU","url":"https:\/\/secure.gravatar.com\/avatar\/807433305f086334607897e7652187ca?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/807433305f086334607897e7652187ca?s=96&r=g","caption":"Scott Middleton"},"description":"Scott Middleton is the CEO and founder of Terem, Australia\u2019s leading tech product development firm. Terem has featured on the Financial Review\u2019s Fast 100 for two years running. Scott has been involved in the launch and growth of 61+ products.","sameAs":["https:\/\/www.linkedin.com\/in\/scottmiddleton\/","https:\/\/twitter.com\/scottmiddleton"]}]}},"_links":{"self":[{"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/posts\/13423"}],"collection":[{"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/comments?post=13423"}],"version-history":[{"count":8,"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/posts\/13423\/revisions"}],"predecessor-version":[{"id":13436,"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/posts\/13423\/revisions\/13436"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/media\/13432"}],"wp:attachment":[{"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/media?parent=13423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/categories?post=13423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/terem.tech\/wp-json\/wp\/v2\/tags?post=13423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}