{"id":39664,"date":"2026-01-06T07:00:00","date_gmt":"2026-01-06T15:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=39664"},"modified":"2026-01-06T10:25:43","modified_gmt":"2026-01-06T18:25:43","slug":"integrating-cloudinary-workfront","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront","title":{"rendered":"Integrating Cloudinary and Workfront"},"content":{"rendered":"\n<p>Adobe Workfront is a work management platform for enterprises to centralize, streamline, and automate project lifecycles, from creative review applications, time tracking, and more. Digital assets go through an approval process on Workfront and then are pushed to <a href=\"https:\/\/cloudinary.com\/products\/digital_asset_management\">Cloudinary Assets<\/a> for storage and delivery. In this post, I\u2019ll show you how to design and implement the integration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Workfront Overview<\/h2>\n\n\n\n<p>Workfront helps teams plan, execute, and track their work. Each entity is an <em>object<\/em> that\u2019s accessible through the <a href=\"https:\/\/experienceleague.adobe.com\/en\/docs\/workfront\/using\/adobe-workfront-api\/api-general-information\/api-explorer\">REST APIs<\/a>. Here are some common objects when working with Workfront:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Object Name<\/strong><\/td><td><strong>Purpose<\/strong><\/td><td><strong>Object Code<\/strong><\/td><\/tr><tr><td>Project<\/td><td>The top-level container for a body of work.<\/td><td>PROJ<\/td><\/tr><tr><td>Task<\/td><td>A unit of work assigned to a user or team. Has a status, assignee, and due dates.<\/td><td>TASK<\/td><\/tr><tr><td>Document<\/td><td>A file or attachment uploaded to a task or project. Each document has one or more versions.<\/td><td>DOCU<\/td><\/tr><tr><td>User<\/td><td>Represents an individual with access to Workfront. Includes profile info, roles, permissions, and assignments.<\/td><td>USER<\/td><\/tr><tr><td>Company<\/td><td>Logical grouping of users, often representing a client or internal department.*<br>*I have seen this used for different brands and departments.<\/td><td>CMPY<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>You can find details about the APIs on the <a href=\"https:\/\/developer.adobe.com\/workfront\/api-explorer\/\">Workfront API Explorer<\/a> page, and more details on <a href=\"https:\/\/medium.com\/@vipinjayanarayanan\/workfront-api-basics-and-api-explorer-a7856a2dea4e\">how to use the API explorer page here<\/a>.<\/p>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Integration Workflow<\/h2>\n\n\n\n<p>We\u2019ll implement the following workflow:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Scan Workfront tasks. Check if we have a task for uploading to Cloudinary.<\/li>\n\n\n\n<li>If yes, pull the task and document details. Use this to create the correct metadata fields for Cloudinary.<\/li>\n\n\n\n<li>Upload the documents to Cloudinary.<\/li>\n\n\n\n<li>Update the status on the Workfront task to indicate whether the step succeeds or fails.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1767723031\/blog-integrating_cloudinary_and_workfront-1.png\" alt=\"flow chart showing the integration workflow\"\/><\/figure><\/div>\n\n\n<p>In this image, orange blocks use Workfront API while the blue block uses Cloudinary API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Building the Integration<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>The complete code is available at the git repository: <a href=\"https:\/\/github.com\/akshay-ranganath\/workfront-to-cloudinary-integration-tool\">https:\/\/github.com\/akshay-ranganath\/workfront-to-cloudinary-integration-tool<\/a>.&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Authentication<\/h3>\n\n\n\n<p>Workfront allows the use of API Key\/API Secret as well as OAuth2 authentication. Most operations can be performed using the API Key\/API Secret. However, the process to download a document is a bit more involved. You\u2019ll need to do the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use the OAuth credentials to receive a <strong>bearer token<\/strong>.<\/li>\n\n\n\n<li>Using the bearer token, receive a <strong>session id<\/strong>.<\/li>\n\n\n\n<li>Using the session id, download documents.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Generating Bearer Token and Session Id<\/h3>\n\n\n\n<p>Here\u2019s a short snippet to generate the bearer token.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">CLIENT_ID = secrets&#91;<span class=\"hljs-string\">\"CLIENT_ID\"<\/span>]\n\nCLIENT_SECRET = secrets&#91;<span class=\"hljs-string\">\"CLIENT_SECRET\"<\/span>]\n\nCUSTOMER_ID = secrets&#91;<span class=\"hljs-string\">\"CUSTOMER_ID\"<\/span>]\n\nUSER_ID = secrets&#91;<span class=\"hljs-string\">\"USER_ID\"<\/span>]\n\nprivate_key = secrets&#91;<span class=\"hljs-string\">\"PRIVATE_KEY\"<\/span>]\n\nnow = int(time.time())\n\npayload = {\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"iss\"<\/span>: CUSTOMER_ID, \u00a0 \u00a0 \u00a0 <span class=\"hljs-comment\"># issuer<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"sub\"<\/span>: USER_ID, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-comment\"># subject<\/span>\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"exp\"<\/span>: now + <span class=\"hljs-number\">180<\/span>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-comment\"># 3 minutes is typical; keep it short<\/span>\n\n}\n\njwt_token = jwt.encode(payload, private_key, algorithm=<span class=\"hljs-string\">\"RS256\"<\/span>)\n\nlogging.info(<span class=\"hljs-string\">\"Requesting Workfront OAuth session ID\"<\/span>)\n\n<span class=\"hljs-comment\"># Exchange JWT for access token (sessionID)<\/span>\n\nresp = requests.post(\n\n\u00a0\u00a0\u00a0\u00a0f<span class=\"hljs-string\">\"https:\/\/{BASE}.my.workfront.com\/integrations\/oauth2\/api\/v1\/jwt\/exchange\"<\/span>,\n\n\u00a0\u00a0\u00a0\u00a0headers={<span class=\"hljs-string\">\"Content-Type\"<\/span>: <span class=\"hljs-string\">\"application\/x-www-form-urlencoded\"<\/span>},\n\n\u00a0\u00a0\u00a0\u00a0data={\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"client_id\"<\/span>: CLIENT_ID,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"client_secret\"<\/span>: CLIENT_SECRET,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"jwt_token\"<\/span>: jwt_token\n\n\u00a0\u00a0\u00a0\u00a0},\n\n\u00a0\u00a0\u00a0\u00a0timeout=<span class=\"hljs-number\">30<\/span>\n\n)\n\nresp.raise_for_status()\n\nsession_id = resp.json()&#91;<span class=\"hljs-string\">\"access_token\"<\/span>]\u00a0 <span class=\"hljs-comment\"># this IS the sessionID\u00a0\u00a0<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Retrieving Objects<\/h3>\n\n\n\n<p>Workfront has a clean API to retrieve objects. Each request expects the four-letter code for the object type. Each API also allows passing additional parameters for operations, like search, to include additional parameters within the result and pagination. In general, a function like this can support most API GET requests.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">def get_object(\n\n\u00a0\u00a0\u00a0\u00a0uri_base: str,\n\n\u00a0\u00a0\u00a0\u00a0headers: dict,\n\n\u00a0\u00a0\u00a0\u00a0object_name: str,\n\n\u00a0\u00a0\u00a0\u00a0action: str,\n\n\u00a0\u00a0\u00a0\u00a0params: str\u00a0\u00a0\u00a0\u00a0\n\n):\n\n\u00a0\u00a0\u00a0\u00a0result = None\n\n\u00a0\u00a0\u00a0\u00a0url = f<span class=\"hljs-string\">\"{uri_base}\/{object_name}\/{action}?{params}\"<\/span>\u00a0\u00a0\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-keyword\">print<\/span>(url)\u00a0\u00a0\n\n\u00a0\u00a0\u00a0\u00a0response = requests.get(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0headers = headers\n\n\u00a0\u00a0\u00a0\u00a0)\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-keyword\">if<\/span> response.status_code == <span class=\"hljs-number\">200<\/span>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"\u2705 GET Successful\"<\/span>)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result = response.json()\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-keyword\">else<\/span>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"\u274c Failed to GET\"<\/span>)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-keyword\">print<\/span>(response.text)\n\n\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-keyword\">return<\/span> result<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For example, we can use this function to retrieve all the tasks that have a status of \u201cUPL\u201d. \u201cUPL\u201d is the status code for \u201cUpload to Cloudinary\u201d.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">headers = {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"Content-Type\"<\/span>: <span class=\"hljs-string\">\"application\/json\"<\/span>,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"apiKey\"<\/span>: os.getenv(<span class=\"hljs-string\">'WORKFRONT_API_KEY'<\/span>)\n\n\u00a0\u00a0\u00a0\u00a0}\n\nresp = get_object(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uri_base=uri_base,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0headers=headers,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0object_name=<span class=\"hljs-string\">'TASK'<\/span>,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0action=<span class=\"hljs-string\">'search'<\/span>,\n\nparams=<span class=\"hljs-string\">'fields=*,documents&amp;isComplete=false&amp;$$LIMIT=100&amp;status_Sort=desc&amp;status=UPL)<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this case, I\u2019m requesting the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Give me the task object.<\/li>\n\n\n\n<li>I want to execute a search.<\/li>\n\n\n\n<li>In the result, I want all fields (<code>fields=*<\/code>).<\/li>\n\n\n\n<li>I want details about embedded documents (<code>,documents<\/code>).<\/li>\n\n\n\n<li>The task is incomplete and the status is set to UPL.<\/li>\n\n\n\n<li>Limit to the first 100 results.<\/li>\n<\/ul>\n\n\n\n<p>Here\u2019s how I can get details of a single document.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">id = <span class=\"hljs-string\">'6148c8aa00207c256e25d7d6a918f244'<\/span>\n\n<span class=\"hljs-comment\"># headers - same as above<\/span>\n\nresp = get_object(\n\n\u00a0\u00a0\u00a0\u00a0uri_base=uri_base,\n\n\u00a0\u00a0\u00a0\u00a0headers=headers,\n\n\u00a0\u00a0\u00a0\u00a0object_name=<span class=\"hljs-string\">'DOCU'<\/span>,\n\n\u00a0\u00a0\u00a0\u00a0action=id\u00a0\u00a0\u00a0\u00a0\n\n)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the action, we\u2019ll just pass the document id.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Uploading Documents<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Download From Workfront<\/h3>\n\n\n\n<p>For most API calls, we can pass the API Secret in a HTTP Header and get back a response. However, when trying to download a document, we\u2019ll need to pass the session id. We already saw this code in the <a href=\"https:\/\/docs.google.com\/document\/d\/1mNk5R6nqfoyBewkU0iAakuMaz4LbPSJGL3yporQRUtw\/edit?tab=t.0#heading=h.mzzuql1kkic5\">authentication section<\/a>. We\u2019ll require the document\u2019s ID, so we can download the document from <code>https:\/\/&lt;&lt;workfront url&gt;\/document\/download<\/code> and pass the session id as the header sessionID.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">resp = requests.get(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0f<span class=\"hljs-string\">\"{os.getenv('WORKFRONT_BASE_URL')}\/document\/download\"<\/span>,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0params = {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"ID\"<\/span>: <span class=\"hljs-built_in\">document<\/span>&#91;<span class=\"hljs-string\">'ID'<\/span>]\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0headers = {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"sessionID\"<\/span>: session_id\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\n\u00a0\u00a0\u00a0\u00a0)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>We can use the response bytes directly for uploading to Cloudinary. For simplicity, I\u2019ll save it as a temporary file and pass this information for the upload.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\"># Create a temporary file to store the downloaded document<\/span>\n\ntemp_file = tempfile.NamedTemporaryFile(delete=<span class=\"hljs-keyword\">False<\/span>)\n\ntemp_file.write(resp.content)\n\ntemp_file.flush()\n\n<span class=\"hljs-keyword\">return<\/span> temp_file.name<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Upload to Cloudinary<\/h3>\n\n\n\n<p>The final step is to upload this document to Cloudinary. We\u2019ll pass the temporary file as the source.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">resp = cloudinary.uploader.upload(\n\n\u00a0\u00a0\u00a0\u00a0local_path, <span class=\"hljs-comment\"># the temporary file with the path<\/span>\n\n\u00a0\u00a0\u00a0\u00a0resource_type = <span class=\"hljs-string\">'auto'<\/span>,\u00a0 <span class=\"hljs-comment\"># Auto-detect file type<\/span>\n\n\u00a0\u00a0\u00a0\u00a0asset_folder = <span class=\"hljs-string\">'workfront'<\/span>,\u00a0 <span class=\"hljs-comment\"># Organize files in workfront folder<\/span>\n\n\u00a0\u00a0\u00a0\u00a0display_name = document&#91;<span class=\"hljs-string\">'name'<\/span>],\u00a0 <span class=\"hljs-comment\"># Use document name as display name<\/span>\n\n\u00a0\u00a0\u00a0\u00a0public_id = document&#91;<span class=\"hljs-string\">'ID'<\/span>]\u00a0 <span class=\"hljs-comment\"># Use Workfront document ID as public ID<\/span>\n\n)\n\n<span class=\"hljs-keyword\">return<\/span> resp&#91;<span class=\"hljs-string\">'secure_url'<\/span>]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Later on, we\u2019ll use the secure_url and update Workfront\u2019s Document object to hold this information.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Handling Metadata<\/h3>\n\n\n\n<p>In most applications, the integration will consist of an additional step. The payload from Workfront will contain various metadata items that will need to be carried over to Cloudinary. This will require specific business rules to map from the Workfront field names and values to Cloudinary metadata\u2019s names and values.<\/p>\n\n\n\n<p>If you have the flexibility, it will be simpler to retain the same <code>name=value<\/code> pairs on both systems. If that isn\u2019t possible, you may consider various mechanisms to map the objects. I\u2019d suggest using either of these approaches.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Use JQ Mapping<\/h3>\n\n\n\n<p><a href=\"https:\/\/jqlang.org\/\">JQ<\/a> is a CLI tool that handles various kinds of text manipulation. The advantage is its compatibility across programming languages. Libraries like <a href=\"https:\/\/pypi.org\/project\/jq\/\">jq<\/a> offer support for the JQ-based manipulation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Use Pydantic Objects<\/h3>\n\n\n\n<p>Another alternative is to use <a href=\"https:\/\/docs.pydantic.dev\/latest\/\">pydantic<\/a> objects. Such objects will offer multiple advantages.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You can directly map from incoming JSON to python objects.<\/li>\n\n\n\n<li>It offers strict type-checking.<\/li>\n\n\n\n<li>Code is self-documenting, so you can extract JSON schema. This can help if you want to extend the ingestion to other systems.<\/li>\n<\/ul>\n\n\n\n<p>Regardless of the approach used, we\u2019ll finally arrive at an object that can be passed to the cloudinary.uploader.upload method. Once done, we can push metadata from Workfront to Cloudinary.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Updating Workfront<\/h2>\n\n\n\n<p>The final step in the process is to update Workfront. We need to do this for two reasons:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Update the task status so we don\u2019t process it again.<\/li>\n\n\n\n<li>Add the Cloudinary object information like <code>public_id<\/code> and <code>secure_url<\/code> so users on Workfront can easily find the resource on Cloudinary.<\/li>\n<\/ul>\n\n\n\n<p>In our case, we\u2019ll update an existing task and document. So this is a PUT request.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Update Workfront Document<\/h3>\n\n\n\n<p>After uploading each document, we can update the Document object in Workfront. As a simple step, we\u2019ll update the \u201cDescription\u201d to hold the Cloudinary URL.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">status_code = api_request(\n\n\u00a0\u00a0\u00a0\u00a0uri_base=uri_base,\n\n\u00a0\u00a0\u00a0\u00a0headers=headers,\n\n\u00a0\u00a0\u00a0\u00a0object_name=<span class=\"hljs-string\">\"document\"<\/span>,\n\n\u00a0\u00a0\u00a0\u00a0object_id=<span class=\"hljs-built_in\">document<\/span>&#91;<span class=\"hljs-string\">'ID'<\/span>],\n\n\u00a0\u00a0\u00a0\u00a0method=<span class=\"hljs-string\">\"PUT\"<\/span>,\n\n\u00a0\u00a0\u00a0\u00a0data=update_data\n\n)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Update Workfront Task<\/h3>\n\n\n\n<p>Once all the documents have been processed, we can update the task status. For this, we\u2019ll need to track whether all the documents have been uploaded successfully. Even if one document fails, we\u2019ll need to set the task as an error so that the user can check and try to upload again.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">status_code = api_request(\n\n\u00a0\u00a0\u00a0\u00a0uri_base=uri_base,\n\n\u00a0\u00a0\u00a0\u00a0headers=headers,\n\n\u00a0\u00a0\u00a0\u00a0object_name=<span class=\"hljs-string\">\"task\"<\/span>,\n\n\u00a0\u00a0\u00a0\u00a0object_id=task_id,\n\n\u00a0\u00a0\u00a0\u00a0method=<span class=\"hljs-string\">\"PUT\"<\/span>,\n\n\u00a0\u00a0\u00a0\u00a0data=update_data\n\n)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Scheduling Uploads<\/h2>\n\n\n\n<p>We have now seen how to search and download documents from Workfront, upload them to Cloudinary, and update Workfront on the status. The next question is the trigger for this process.<\/p>\n\n\n\n<p>Although Workfront exposes some notifications, they aren\u2019t granular enough to help our use case. In most of the integrations, I\u2019ve seen customers using a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cron\">cron<\/a> job. The simplest approach is to schedule the process to run at a frequency that matches the volume of document creation. Perhaps this can be two to three times per week, or more. Both Workfront and Cloudinary APIs can handle the API request volumes easily.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Workfront has a robust set of APIs that allows Cloudinary to easily integrate and pull the project and document information. By scheduling the process as a recurring job, customers can easily integrate Cloudinary and Workfront by deploying the solution on their own compute platforms like AWS Lambda.<\/p>\n\n\n\n<p>To learn more about how to use Cloudinary to streamline your creative workflows, <a href=\"https:\/\/cloudinary.com\/contact\">contact us today<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Adobe Workfront is a work management platform for enterprises to centralize, streamline, and automate project lifecycles, from creative review applications, time tracking, and more. Digital assets go through an approval process on Workfront and then are pushed to Cloudinary Assets for storage and delivery. In this post, I\u2019ll show you how to design and implement [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":39666,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[332,428],"class_list":["post-39664","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-api","tag-integration"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Integrating Cloudinary and Workfront<\/title>\n<meta name=\"description\" content=\"Adobe Workfront is a work management platform for enterprises to centralize, streamline, and automate project lifecycles, from creative review\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integrating Cloudinary and Workfront\" \/>\n<meta property=\"og:description\" content=\"Adobe Workfront is a work management platform for enterprises to centralize, streamline, and automate project lifecycles, from creative review\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-06T15:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-06T18:25:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"melindapham\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"Integrating Cloudinary and Workfront\",\"datePublished\":\"2026-01-06T15:00:00+00:00\",\"dateModified\":\"2026-01-06T18:25:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront\"},\"wordCount\":1179,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA\",\"keywords\":[\"API\",\"Integration\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront\",\"url\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront\",\"name\":\"Integrating Cloudinary and Workfront\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA\",\"datePublished\":\"2026-01-06T15:00:00+00:00\",\"dateModified\":\"2026-01-06T18:25:43+00:00\",\"description\":\"Adobe Workfront is a work management platform for enterprises to centralize, streamline, and automate project lifecycles, from creative review\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integrating Cloudinary and Workfront\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Integrating Cloudinary and Workfront","description":"Adobe Workfront is a work management platform for enterprises to centralize, streamline, and automate project lifecycles, from creative review","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:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront","og_locale":"en_US","og_type":"article","og_title":"Integrating Cloudinary and Workfront","og_description":"Adobe Workfront is a work management platform for enterprises to centralize, streamline, and automate project lifecycles, from creative review","og_url":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront","og_site_name":"Cloudinary Blog","article_published_time":"2026-01-06T15:00:00+00:00","article_modified_time":"2026-01-06T18:25:43+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"Integrating Cloudinary and Workfront","datePublished":"2026-01-06T15:00:00+00:00","dateModified":"2026-01-06T18:25:43+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront"},"wordCount":1179,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA","keywords":["API","Integration"],"inLanguage":"en-US","copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront","url":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront","name":"Integrating Cloudinary and Workfront","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA","datePublished":"2026-01-06T15:00:00+00:00","dateModified":"2026-01-06T18:25:43+00:00","description":"Adobe Workfront is a work management platform for enterprises to centralize, streamline, and automate project lifecycles, from creative review","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/integrating-cloudinary-workfront#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Integrating Cloudinary and Workfront"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1764964594\/Blog_Integrate_Workfront_with_Cloudinary\/Blog_Integrate_Workfront_with_Cloudinary.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=39664"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39664\/revisions"}],"predecessor-version":[{"id":39673,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39664\/revisions\/39673"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/39666"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=39664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=39664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=39664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}