{"id":21231,"date":"2014-05-16T13:27:11","date_gmt":"2014-05-16T13:27:11","guid":{"rendered":"http:\/\/image_moderation_made_easy_using_cloud_based_ui_and_api"},"modified":"2025-03-30T12:32:59","modified_gmt":"2025-03-30T19:32:59","slug":"image_moderation_made_easy_using_cloud_based_ui_and_api","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api","title":{"rendered":"Image moderation made easy using cloud-based UI and Cloudinary API"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Many websites and mobile apps today allow their visitors to share their own photos. Users upload their profile images to dating sites, photos of their personal belongings to second hand market websites and real estate billboards. Users share their personal photos on social networks, and upload images to their favorite eCommerce websites, showcasing and reviewing their latest purchases.<\/p>\n<p>It\u2019s sometimes quite important to moderate these images. You might want to keep out offensive content. You may want to actively reject images that do not answer your website\u2019s needs, for example, make sure there are visible faces in profile images, or that only photos of your brand appear on a shared marketing campaign. You may also want to make sure that photos are of high enough quality before making them available on your website.<\/p>\n<p>In addition to image moderation, it\u2019s crucial to consider the moderation of other user-generated content, such as text in comments or chat interfaces. Chat moderation involves overseeing and managing online conversations to ensure they align with established guidelines and standards. This can be especially important in live interaction scenarios, where a moderation interface can allow a speaker or moderator to view requests to ask questions and grant the floor to remote participants in real-time.<\/p>\n<h2>A complete image moderation solution with Cloudinary<\/h2>\n<p>While image moderation can be very important, from the developer\u2019s perspective, implementing such a flow can be very time consuming.<\/p>\n<p>To eliminate all the hassle from implementing your own image moderation solution, we\u2019ve built a complete image moderation solution into Cloudinary\u2019s cloud-based image management service.<\/p>\n<p>Besides, a comprehensive content moderation tool is necessary for platforms that require moderation of diverse content types, including social media posts. This involves controlling the desired content on online platforms like social media networking sites, ensuring it adheres to community guidelines and terms of service. A good moderation interface for such platforms would allow for adding new words and variations, moderating messages that were flagged, and building automations for more efficient content management.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_625\/moderation_post_pending_queue_full_bm1ka1.jpg\" alt=\"Manual image moderation console\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"625\" height=\"179\"\/><\/p>\n<p>You can start using Cloudinary\u2019s image moderation in minutes, with a straightforward integration.<\/p>\n<h2>Upload images to Cloudinary for image moderation<\/h2>\n<p>Cloudinary is an end-to-end cloud-based image management solution. To start moderating your images with Cloudinary, start by tagging them as \u201crequiring moderation\u201d during upload. Your moderators will then be able to view all the images that require moderation, and accept or reject them, in our online interface.<\/p>\n<p>To upload images to Cloudinary, use the server-side upload API call, or allow users to upload the images directly from their browser using our jQuery plugin.<\/p>\n<p>In the upload call, set the <code>moderation<\/code> parameter to <code>manual<\/code>. This tells Cloudinary to mark this image as pending manual moderation.<\/p>\n<p>Check out the simple upload code below in Ruby, PHP, Node.js, Python and Java.<\/p>\n<cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;Cloudinary::Uploader.upload(\\&quot;user_photo.jpg\\&quot;, :moderation =&gt; &#039;manual&#039;)&quot;,&quot;codeSnippet&quot;:&quot;Cloudinary::Uploader.upload(\\&quot;user_photo.jpg\\&quot;, :moderation =&gt; &#039;manual&#039;)&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;rawCodeSnippet&quot;:&quot;\\\\Cloudinary\\\\Uploader::upload(\\&quot;user_photo.jpg\\&quot;,\\n    array( \\&quot;moderation\\&quot; =&gt; \\&quot;manual\\&quot; ));&quot;,&quot;codeSnippet&quot;:&quot;\\\\Cloudinary\\\\Uploader::upload(\\&quot;user_photo.jpg\\&quot;,\\n    array( \\&quot;moderation\\&quot; =&gt; \\&quot;manual\\&quot; ));&quot;},{&quot;sdkId&quot;:&quot;python&quot;,&quot;framework&quot;:&quot;python&quot;,&quot;language&quot;:&quot;python&quot;,&quot;displayName&quot;:&quot;Python&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.uploader.upload(\\n  \\&quot;user_photo.jpg\\&quot;,\\n  moderation = &#039;manual&#039;\\n)&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.uploader.upload(\\n  \\&quot;user_photo.jpg\\&quot;,\\n  moderation = &#039;manual&#039;\\n)&quot;},{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;javascript&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.uploader.upload(\\n  \\&quot;user_photo.jpg\\&quot;,\\n  function(result) { console.log(result); },\\n  { moderation: &#039;manual&#039; }\\n);&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.uploader.upload(\\n  \\&quot;user_photo.jpg\\&quot;,\\n  function(result) { console.log(result); },\\n  { moderation: &#039;manual&#039; }\\n);&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.uploader().upload(new File(\\&quot;user_photo.jpg\\&quot;), Cloudinary.asMap(\\n  \\&quot;moderation\\&quot;, \\&quot;manual\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.uploader().upload(new File(\\&quot;user_photo.jpg\\&quot;), Cloudinary.asMap(\\n  \\&quot;moderation\\&quot;, \\&quot;manual\\&quot;));&quot;}]\"\n      parsed-url=\"[]\"\n      with-url=\"false\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget>\n<p>The response includes all image details and URLs by which you can deliver the image to your users, including the moderation status:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">{ \n  <span class=\"hljs-string\">\"public_id\"<\/span>: <span class=\"hljs-string\">\"zutqljpun3qc37asxbgi\"<\/span>,`\n  <span class=\"hljs-string\">\"version\"<\/span>: <span class=\"hljs-number\">1398848882<\/span>, \n  <span class=\"hljs-string\">\"url\"<\/span>:  \n    <span class=\"hljs-string\">\"https:\/\/...\/image\/upload\/v1398848882\/zutqljpun3qc37asxbgi.jpg\"<\/span>, \n  <span class=\"hljs-string\">\"moderation\"<\/span>: &#91;{<span class=\"hljs-string\">\"status\"<\/span>: <span class=\"hljs-string\">\"pending\"<\/span>, <span class=\"hljs-string\">\"kind\"<\/span>: <span class=\"hljs-string\">\"manual\"<\/span>}],  \n    \u2026\n}\n<\/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<h2>Cloudinary\u2019s image moderation UI<\/h2>\n<p>Images that are uploaded to Cloudinary, and tagged for manual moderation, can be viewed by moderators using <a href=\"https:\/\/cloudinary.com\/blog\/the_rise_of_the_media_experience_cloud\">Cloudinary\u2019s Media Library<\/a>. Moderators can browse recently uploaded images and decide to accept or reject them.<\/p>\n<p>You can use Cloudinary\u2019s user management capabilities to define multiple moderator users that can access only the image moderation console, and do not have access to other Cloudinary features such as image transformations, reports, etc.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_625\/moderation_post_pending_images_ful1vx.jpg\" alt=\"Queue of pending images\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"625\" height=\"180\"\/><\/p>\n<p>In this scenario, a social web app asked that users upload a front-facing photo of themselves. While all the images might seem valid at first glance, a moderator might opt to reject some of them.<\/p>\n<p>The first photo shows two people, however the social app specified a photo of a single person, so the image would be rejected.<\/p>\n<p>The second and fourth photos show a front-facing person. The moderator should decide, based on site policy, whether both the close-up and the longer distance photo should be approved.<\/p>\n<p>The third photo shows a front facing person, however there is an offensive symbol on the person\u2019s T-shirt, which would cause it to be rejected. The fifth photo would also be rejected, as it is too blurry.<\/p>\n<p>Rejecting and approving pending images can be done simply by hovering over a thumbnail in the media library, and clicking on the <strong>Reject<\/strong> (red) or <strong>Approve<\/strong> (green) button. Moderators can also click on an image to view further details, see a larger view and approve \/ reject the image in expanded mode.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_625\/moderation_post_pending_image_xiofts.jpg\" alt=\"Pending moderation photo\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"625\" height=\"229\"\/><\/p>\n<p>The list of approved images can be viewed from the same web interface, and moderators can change their minds at any time, and choose to reject a previously-approved image. Note that it can take up to ten minutes for cached copies to be updated.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_625\/moderation_post_approved_vgxght.jpg\" alt=\"Approved images queue\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"625\" height=\"189\"\/><\/p>\n<p>Rejected images are still saved in your cloud-based media library, using Cloudinary\u2019s backup repository. Only the moderator can access and view the original uploaded images. If the moderator changes his mind, the originally rejected images will be recovered from backup and made available for delivery on your site.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_625\/moderation_post_rejected_o4kos5.jpg\" alt=\"Rejected images queue\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"625\" height=\"182\"\/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_625\/moderation_post_rejected_view_e77scs.jpg\" alt=\"Rejected image\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"625\" height=\"154\"\/><\/p>\n<p>You can add a <code>notification_url<\/code> parameter while uploading the image, which instructs Cloudinary to notify your application of changes to moderation status, at this point your application will receive a notification with the details of the moderation event (approval or rejection).<\/p>\n<h2>Replacing a rejected images with a placeholder image<\/h2>\n<p>When an image is rejected, you can use Cloudinary\u2019s default image mechanism to display a placeholder image instead.<\/p>\n<p>The <code>default_image<\/code> parameter (or <code>d<\/code> for URLs) allows you to specify a placeholder image to display, in case an image was rejected by your moderator.<\/p>\n<p>The following sample code creates a 150&#215;150 face-detection-based thumbnail of the uploaded images, then rounds the corner of the photos and increases color saturation. This is all done on-the-fly using Cloudinary\u2019s image transformation feature. The example below also specified an alternative image to show if the original has been actively rejected.<\/p>\n<p><cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;nodejs&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;, {width: 150, height: 150, gravity: \\&quot;face\\&quot;, radius: 30, effect: \\&quot;saturation:50\\&quot;, default_image: \\&quot;avatar.png\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;, {width: 150, height: 150, gravity: \\&quot;face\\&quot;, radius: 30, effect: \\&quot;saturation:50\\&quot;, default_image: \\&quot;avatar.png\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_2&quot;,&quot;framework&quot;:&quot;react_2&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;react&quot;,&quot;framework&quot;:&quot;react&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot; &gt; &lt;Transformation width=\\&quot;150\\&quot; height=\\&quot;150\\&quot; gravity=\\&quot;face\\&quot; radius=\\&quot;30\\&quot; effect=\\&quot;saturation:50\\&quot; defaultImage=\\&quot;avatar.png\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt; &lt;\\\/Image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot; &gt;\\n\\t&lt;Transformation width=\\&quot;150\\&quot; height=\\&quot;150\\&quot; gravity=\\&quot;face\\&quot; radius=\\&quot;30\\&quot; effect=\\&quot;saturation:50\\&quot; defaultImage=\\&quot;avatar.png\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt;\\n&lt;\\\/Image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;cloudinary-react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue_2&quot;,&quot;framework&quot;:&quot;vue_2&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/vue&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue&quot;,&quot;framework&quot;:&quot;vue&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot; &gt; &lt;cld-transformation width=\\&quot;150\\&quot; height=\\&quot;150\\&quot; gravity=\\&quot;face\\&quot; radius=\\&quot;30\\&quot; effect=\\&quot;saturation:50\\&quot; default-image=\\&quot;avatar.png\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt; &lt;\\\/cld-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot; &gt;\\n\\t&lt;cld-transformation width=\\&quot;150\\&quot; height=\\&quot;150\\&quot; gravity=\\&quot;face\\&quot; radius=\\&quot;30\\&quot; effect=\\&quot;saturation:50\\&quot; default-image=\\&quot;avatar.png\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt;\\n&lt;\\\/cld-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;cloudinary-vue&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular_2&quot;,&quot;framework&quot;:&quot;angular_2&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/ng&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular&quot;,&quot;framework&quot;:&quot;angular&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot; &gt; &lt;cl-transformation width=\\&quot;150\\&quot; height=\\&quot;150\\&quot; gravity=\\&quot;face\\&quot; radius=\\&quot;30\\&quot; effect=\\&quot;saturation:50\\&quot; default-image=\\&quot;avatar.png\\&quot; crop=\\&quot;fill\\&quot;&gt; &lt;\\\/cl-transformation&gt; &lt;\\\/cl-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot; &gt;\\n\\t&lt;cl-transformation width=\\&quot;150\\&quot; height=\\&quot;150\\&quot; gravity=\\&quot;face\\&quot; radius=\\&quot;30\\&quot; effect=\\&quot;saturation:50\\&quot; default-image=\\&quot;avatar.png\\&quot; crop=\\&quot;fill\\&quot;&gt;\\n\\t&lt;\\\/cl-transformation&gt;\\n&lt;\\\/cl-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/angular-5.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js_2&quot;,&quot;framework&quot;:&quot;js_2&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js&quot;,&quot;framework&quot;:&quot;js&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.imageTag(&#039;j6ayuxwr76qwvyjioq7b.jpg&#039;, {width: 150, height: 150, gravity: \\&quot;face\\&quot;, radius: 30, effect: \\&quot;saturation:50\\&quot;, defaultImage: \\&quot;avatar.png\\&quot;, crop: \\&quot;fill\\&quot;}).toHtml();&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.imageTag(&#039;j6ayuxwr76qwvyjioq7b.jpg&#039;, {width: 150, height: 150, gravity: \\&quot;face\\&quot;, radius: 30, effect: \\&quot;saturation:50\\&quot;, defaultImage: \\&quot;avatar.png\\&quot;, crop: \\&quot;fill\\&quot;}).toHtml();&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;cloudinary-core&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;python&quot;,&quot;framework&quot;:&quot;python&quot;,&quot;language&quot;:&quot;python&quot;,&quot;rawCodeSnippet&quot;:&quot;CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;).image(width=150, height=150, gravity=\\&quot;face\\&quot;, radius=30, effect=\\&quot;saturation:50\\&quot;, default_image=\\&quot;avatar.png\\&quot;, crop=\\&quot;fill\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;).image(width=150, height=150, gravity=\\&quot;face\\&quot;, radius=30, effect=\\&quot;saturation:50\\&quot;, default_image=\\&quot;avatar.png\\&quot;, crop=\\&quot;fill\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Python&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;php_2&quot;,&quot;framework&quot;:&quot;php_2&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;(new ImageTag(&#039;j6ayuxwr76qwvyjioq7b.jpg&#039;))\\n\\t-&gt;resize(Resize::fill()-&gt;width(150)\\n-&gt;height(150)\\n\\t-&gt;gravity(\\n\\tGravity::focusOn(\\n\\tFocusOn::face()))\\n\\t)\\n\\t-&gt;roundCorners(RoundCorners::byRadius(30))\\n\\t-&gt;adjust(Adjust::saturation()-&gt;level(50))\\n\\t-&gt;delivery(Delivery::defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;(new ImageTag(&#039;j6ayuxwr76qwvyjioq7b.jpg&#039;))\\n\\t-&gt;resize(Resize::fill()-&gt;width(150)\\n-&gt;height(150)\\n\\t-&gt;gravity(\\n\\tGravity::focusOn(\\n\\tFocusOn::face()))\\n\\t)\\n\\t-&gt;roundCorners(RoundCorners::byRadius(30))\\n\\t-&gt;adjust(Adjust::saturation()-&gt;level(50))\\n\\t-&gt;delivery(Delivery::defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;, array(\\&quot;width\\&quot;=&gt;150, \\&quot;height\\&quot;=&gt;150, \\&quot;gravity\\&quot;=&gt;\\&quot;face\\&quot;, \\&quot;radius\\&quot;=&gt;30, \\&quot;effect\\&quot;=&gt;\\&quot;saturation:50\\&quot;, \\&quot;default_image\\&quot;=&gt;\\&quot;avatar.png\\&quot;, \\&quot;crop\\&quot;=&gt;\\&quot;fill\\&quot;))&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;, array(\\&quot;width\\&quot;=&gt;150, \\&quot;height\\&quot;=&gt;150, \\&quot;gravity\\&quot;=&gt;\\&quot;face\\&quot;, \\&quot;radius\\&quot;=&gt;30, \\&quot;effect\\&quot;=&gt;\\&quot;saturation:50\\&quot;, \\&quot;default_image\\&quot;=&gt;\\&quot;avatar.png\\&quot;, \\&quot;crop\\&quot;=&gt;\\&quot;fill\\&quot;))&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().width(150).height(150).gravity(\\&quot;face\\&quot;).radius(30).effect(\\&quot;saturation:50\\&quot;).defaultImage(\\&quot;avatar.png\\&quot;).crop(\\&quot;fill\\&quot;)).imageTag(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().width(150).height(150).gravity(\\&quot;face\\&quot;).radius(30).effect(\\&quot;saturation:50\\&quot;).defaultImage(\\&quot;avatar.png\\&quot;).crop(\\&quot;fill\\&quot;)).imageTag(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;, width: 150, height: 150, gravity: \\&quot;face\\&quot;, radius: 30, effect: \\&quot;saturation:50\\&quot;, default_image: \\&quot;avatar.png\\&quot;, crop: \\&quot;fill\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;, width: 150, height: 150, gravity: \\&quot;face\\&quot;, radius: 30, effect: \\&quot;saturation:50\\&quot;, default_image: \\&quot;avatar.png\\&quot;, crop: \\&quot;fill\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;csharp&quot;,&quot;framework&quot;:&quot;csharp&quot;,&quot;language&quot;:&quot;csharp&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.Transform(new Transformation().Width(150).Height(150).Gravity(\\&quot;face\\&quot;).Radius(30).Effect(\\&quot;saturation:50\\&quot;).DefaultImage(\\&quot;avatar.png\\&quot;).Crop(\\&quot;fill\\&quot;)).BuildImageTag(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.Transform(new Transformation().Width(150).Height(150).Gravity(\\&quot;face\\&quot;).Radius(30).Effect(\\&quot;saturation:50\\&quot;).DefaultImage(\\&quot;avatar.png\\&quot;).Crop(\\&quot;fill\\&quot;)).BuildImageTag(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;.NET&quot;,&quot;packageName&quot;:&quot;CloudinaryDotNet&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;dart&quot;,&quot;framework&quot;:&quot;dart&quot;,&quot;language&quot;:&quot;dart&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;j6ayuxwr76qwvyjioq7b.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().width(150)\\n.height(150)\\n\\t.gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t)\\n\\t.roundCorners(RoundCorners.byRadius(30))\\n\\t.adjust(Adjust.saturation().level(50))\\n\\t.delivery(Delivery.defaultImage(\\&quot;avatar.png\\&quot;)));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;j6ayuxwr76qwvyjioq7b.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().width(150)\\n.height(150)\\n\\t.gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t)\\n\\t.roundCorners(RoundCorners.byRadius(30))\\n\\t.adjust(Adjust.saturation().level(50))\\n\\t.delivery(Delivery.defaultImage(\\&quot;avatar.png\\&quot;)));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Dart&quot;,&quot;packageName&quot;:&quot;cloudinary_dart&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;swift&quot;,&quot;framework&quot;:&quot;swift&quot;,&quot;language&quot;:&quot;swift&quot;,&quot;rawCodeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setWidth(150).setHeight(150).setGravity(\\&quot;face\\&quot;).setRadius(30).setEffect(\\&quot;saturation:50\\&quot;).setDefaultImage(\\&quot;avatar.png\\&quot;).setCrop(\\&quot;fill\\&quot;)).generate(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;codeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setWidth(150).setHeight(150).setGravity(\\&quot;face\\&quot;).setRadius(30).setEffect(\\&quot;saturation:50\\&quot;).setDefaultImage(\\&quot;avatar.png\\&quot;).setCrop(\\&quot;fill\\&quot;)).generate(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;iOS&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;5.x&quot;},{&quot;sdkId&quot;:&quot;android&quot;,&quot;framework&quot;:&quot;android&quot;,&quot;language&quot;:&quot;android&quot;,&quot;rawCodeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().width(150).height(150).gravity(\\&quot;face\\&quot;).radius(30).effect(\\&quot;saturation:50\\&quot;).defaultImage(\\&quot;avatar.png\\&quot;).crop(\\&quot;fill\\&quot;)).generate(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().width(150).height(150).gravity(\\&quot;face\\&quot;).radius(30).effect(\\&quot;saturation:50\\&quot;).defaultImage(\\&quot;avatar.png\\&quot;).crop(\\&quot;fill\\&quot;)).generate(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Android&quot;,&quot;packageName&quot;:&quot;cloudinary-android&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;flutter&quot;,&quot;framework&quot;:&quot;flutter&quot;,&quot;language&quot;:&quot;flutter&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;j6ayuxwr76qwvyjioq7b.jpg&#039;).transformation(Transformation()\\n\\t.addTransformation(\\&quot;w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;j6ayuxwr76qwvyjioq7b.jpg&#039;).transformation(Transformation()\\n\\t.addTransformation(\\&quot;w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Flutter&quot;,&quot;packageName&quot;:&quot;cloudinary_flutter&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;kotlin&quot;,&quot;framework&quot;:&quot;kotlin&quot;,&quot;language&quot;:&quot;kotlin&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n\\t resize(Resize.fill() { width(150)\\n height(150)\\n\\t gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t })\\n\\t roundCorners(RoundCorners.byRadius(30))\\n\\t adjust(Adjust.saturation() { level(50) })\\n\\t delivery(Delivery.defaultImage(\\&quot;avatar.png\\&quot;)) \\n}.generate()&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n\\t resize(Resize.fill() { width(150)\\n height(150)\\n\\t gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t })\\n\\t roundCorners(RoundCorners.byRadius(30))\\n\\t adjust(Adjust.saturation() { level(50) })\\n\\t delivery(Delivery.defaultImage(\\&quot;avatar.png\\&quot;)) \\n}.generate()&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Kotlin&quot;,&quot;packageName&quot;:&quot;kotlin-url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;jquery&quot;,&quot;framework&quot;:&quot;jquery&quot;,&quot;language&quot;:&quot;jquery&quot;,&quot;rawCodeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;, {width: 150, height: 150, gravity: \\&quot;face\\&quot;, radius: 30, effect: \\&quot;saturation:50\\&quot;, default_image: \\&quot;avatar.png\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;codeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;, {width: 150, height: 150, gravity: \\&quot;face\\&quot;, radius: 30, effect: \\&quot;saturation:50\\&quot;, default_image: \\&quot;avatar.png\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;jQuery&quot;,&quot;packageName&quot;:&quot;cloudinary-jquery&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_native&quot;,&quot;framework&quot;:&quot;react_native&quot;,&quot;language&quot;:&quot;react_native&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;j6ayuxwr76qwvyjioq7b.jpg\\&quot;)\\n  .resize(\\n    fill()\\n      .width(150)\\n      .height(150)\\n      .gravity(focusOn(face()))\\n  )\\n  .roundCorners(byRadius(30))\\n  .adjust(saturation().level(50))\\n  .delivery(defaultImage(\\&quot;avatar.png\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React Native&quot;,&quot;packageName&quot;:&quot;cloudinary-react-native&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;}]\"\n      parsed-url=\"{&quot;url&quot;:&quot;https:\\\/\\\/res.cloudinary.com\\\/demo\\\/image\\\/upload\\\/w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png\\\/j6ayuxwr76qwvyjioq7b.jpg&quot;,&quot;cloud_name&quot;:&quot;demo&quot;,&quot;host&quot;:&quot;res.cloudinary.com&quot;,&quot;type&quot;:&quot;upload&quot;,&quot;resource_type&quot;:&quot;image&quot;,&quot;transformation&quot;:[{&quot;width&quot;:&quot;150&quot;,&quot;height&quot;:&quot;150&quot;,&quot;crop_mode&quot;:&quot;fill&quot;,&quot;gravity&quot;:&quot;face&quot;,&quot;radius&quot;:&quot;30&quot;,&quot;effect&quot;:&quot;saturation:50&quot;,&quot;default_image&quot;:&quot;avatar.png&quot;}],&quot;transformation_string&quot;:&quot;w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png&quot;,&quot;url_suffix&quot;:&quot;&quot;,&quot;version&quot;:&quot;&quot;,&quot;secure&quot;:true,&quot;public_id&quot;:&quot;j6ayuxwr76qwvyjioq7b.jpg&quot;,&quot;extension&quot;:&quot;jpg&quot;,&quot;format&quot;:&quot;jpg&quot;,&quot;format_code&quot;:true,&quot;url_code&quot;:false,&quot;signature&quot;:&quot;&quot;,&quot;private_cdn&quot;:false,&quot;result_asset_type&quot;:&quot;image&quot;}\"\n      with-url=\"true\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png\/j6ayuxwr76qwvyjioq7b.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png\/j6ayuxwr76qwvyjioq7b.jpg\" alt=\"150x150 face detection based cropped thumbnail\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"150\" height=\"150\"\/><\/a><\/p>\n<p><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png\/gsgaqfqs8gpoa54iketw.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png\/gsgaqfqs8gpoa54iketw.jpg\" alt=\"Another face thumbnail\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"150\" height=\"150\"\/><\/a><\/p>\n<p><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png\/omjisa17oaih05me4k4h.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/w_150,h_150,c_fill,g_face,r_30,e_saturation:50,d_avatar.png\/omjisa17oaih05me4k4h.jpg\" alt=\"Placeholder thumbnail of a rejected image\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"150\" height=\"150\"\/><\/a><\/p>\n<h2>Implementing pre\/post-publishing moderation with Cloudinary<\/h2>\n<p>Does moderation need to occur before an image is published on the site, or can the image be published and visible in the meantime? The answer will determine your moderation workflow.<\/p>\n<p>Post-publishing moderation is easier to implement, but can sometimes result in users seeing inappropriate or even problematic images until they are moderated.<\/p>\n<p>Pre-publishing moderation is safer, but comes at the cost of users having to wait for their images to appear, and a higher cost of manpower, because moderation needs to happen urgently as images are uploaded.<\/p>\n<p>With Cloudinary, you can choose the workflow that is most appropriate to your website.<\/p>\n<h3>Pre-publishing moderation<\/h3>\n<p>To implement pre-publishing moderation, it is recommended to use Cloudinary\u2019s randomly-generated public IDs. As you can see in the response code above, Cloudinary returns a long URL with a random ID which is difficult to guess. This URL is publically-accessible, and you can use it to show the uploaded image to the user who uploaded the photo.<\/p>\n<p>As for other visitors of your site, you can simply code your backend so it doesn\u2019t display an image until it is set as \u201cmoderated\u201d, and they won\u2019t stumble upon it accidentally due to the long \u2018unguessable\u2019 URL.<\/p>\n<p>If you want to completely hide images while they are under moderation, you can use our private images feature, detailed in <a href=\"https:\/\/cloudinary.com\/blog\/how_to_quickly_build_a_stock_photo_site_using_cloudinary\">this blog post<\/a>.<\/p>\n<h3>Post-publishing moderation<\/h3>\n<p>To implement post-publishing moderation, you can simply take the publically-available URL returned by Cloudinary (or specify a more friendly URL) and display the image on the relevant page of your site.<\/p>\n<p>When your moderators rejects and image, you\u2019ll be able to catch this event and handle it accordingly.<\/p>\n<h2>Build your own image moderation interface<\/h2>\n<p>Do you want to build your own image moderation interface, or already have one in place? You can use Cloudinary\u2019s Admin API to easily integrate your custom interface with Cloudinary\u2019s image upload, storage, CDN and moderation workflow.<\/p>\n<p>The following sample code calls Cloudinary\u2019s Admin API for listing all pending images waiting for manual moderation:<\/p>\n<cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;list = Cloudinary::Api.resources_by_moderation(\\&quot;manual\\&quot;, \\&quot;pending\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;list = Cloudinary::Api.resources_by_moderation(\\&quot;manual\\&quot;, \\&quot;pending\\&quot;)&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;rawCodeSnippet&quot;:&quot;$api = new \\\\Cloudinary\\\\Api();\\n$list = $api-&gt;resources(\\&quot;manual\\&quot;, \\&quot;pending\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;$api = new \\\\Cloudinary\\\\Api();\\n$list = $api-&gt;resources(\\&quot;manual\\&quot;, \\&quot;pending\\&quot;);&quot;},{&quot;sdkId&quot;:&quot;python&quot;,&quot;framework&quot;:&quot;python&quot;,&quot;language&quot;:&quot;python&quot;,&quot;displayName&quot;:&quot;Python&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;list = cloudinary.api.resources_by_moderation(\\&quot;manual\\&quot;, \\&quot;pending\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;list = cloudinary.api.resources_by_moderation(\\&quot;manual\\&quot;, \\&quot;pending\\&quot;)&quot;},{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;javascript&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.api. resources_by_moderation(\\&quot;manual\\&quot;, \\&quot;pending\\&quot;,\\n  function(result) { console.log(result) });&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.api. resources_by_moderation(\\&quot;manual\\&quot;, \\&quot;pending\\&quot;,\\n  function(result) { console.log(result) });&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;Cloudinary cloudinary = new Cloudinary(config);\\n\\nApiResponse result = cloudinary.api(). resourcesByModeration(\\n  \\&quot;manual\\&quot;, \\&quot;pending\\&quot;,  Cloudinary.emptyMap());&quot;,&quot;codeSnippet&quot;:&quot;Cloudinary cloudinary = new Cloudinary(config);\\n\\nApiResponse result = cloudinary.api(). resourcesByModeration(\\n  \\&quot;manual\\&quot;, \\&quot;pending\\&quot;,  Cloudinary.emptyMap());&quot;}]\"\n      parsed-url=\"[]\"\n      with-url=\"false\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget>\n<p>Here\u2019s a sample output result:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">    {<span class=\"hljs-string\">\"resources\"<\/span>=&gt;\n     &#91;{\n     \u00a0\u00a0<span class=\"hljs-string\">\"public_id\"<\/span>=&gt;<span class=\"hljs-string\">\"omjisa17oaih05me4k4h\"<\/span>, <span class=\"hljs-string\">\"format\"<\/span>=&gt;<span class=\"hljs-string\">\"jpg\"<\/span>, \u00a0\n     \u00a0\u00a0<span class=\"hljs-string\">\"version\"<\/span>=&gt;<span class=\"hljs-number\">1398848978<\/span>,\n     \u00a0\u00a0<span class=\"hljs-string\">\"resource_type\"<\/span>=&gt;<span class=\"hljs-string\">\"image\"<\/span>, <span class=\"hljs-string\">\"type\"<\/span>=&gt;<span class=\"hljs-string\">\"upload\"<\/span>, \n     \u00a0\u00a0<span class=\"hljs-string\">\"created_at\"<\/span>=&gt;<span class=\"hljs-string\">\"2014-04-30T09:09:38Z\"<\/span>,\n     \u00a0\u00a0<span class=\"hljs-string\">\"bytes\"<\/span>=&gt;<span class=\"hljs-number\">87932<\/span>, <span class=\"hljs-string\">\"width\"<\/span>=&gt;<span class=\"hljs-number\">849<\/span>, <span class=\"hljs-string\">\"height\"<\/span>=&gt;<span class=\"hljs-number\">565<\/span>, <span class=\"hljs-string\">\"backup\"<\/span>=&gt;<span class=\"hljs-keyword\">true<\/span>,\n     \u00a0\u00a0<span class=\"hljs-string\">\"url\"<\/span>=&gt;<span class=\"hljs-string\">\"https:\/\/...\/image\/upload\/v1398848978\/omjisa17oaih05me4k4h.jpg\"<\/span>,\n     \u00a0\u00a0<span class=\"hljs-string\">\"secure_url\"<\/span>=&gt;<span class=\"hljs-string\">\"https:\/\/...\/image\/upload\/v1398848978\/omjisa17oaih05me4k4h.jpg\"<\/span>\n     \u00a0}, \n     {\n     \u00a0\u00a0<span class=\"hljs-string\">\"public_id\"<\/span>=&gt;<span class=\"hljs-string\">\"j6ayuxwr76qwvyjioq7b\"<\/span>, <span class=\"hljs-string\">\"format\"<\/span>=&gt;<span class=\"hljs-string\">\"jpg\"<\/span>, \n     \u00a0\u00a0<span class=\"hljs-string\">\"version\"<\/span>=&gt;<span class=\"hljs-number\">1398848970<\/span>, \n     \u00a0\u00a0<span class=\"hljs-string\">\"resource_type\"<\/span>=&gt;<span class=\"hljs-string\">\"image\"<\/span>, <span class=\"hljs-string\">\"type\"<\/span>=&gt;<span class=\"hljs-string\">\"upload\"<\/span>,\n     \u00a0\u00a0<span class=\"hljs-string\">\"created_at\"<\/span>=&gt;<span class=\"hljs-string\">\"2014-04-30T09:09:30Z\"<\/span>,\n     \u00a0\u00a0<span class=\"hljs-string\">\"bytes\"<\/span>=&gt;<span class=\"hljs-number\">43214<\/span>, <span class=\"hljs-string\">\"width\"<\/span>=&gt;<span class=\"hljs-number\">390<\/span>, <span class=\"hljs-string\">\"height\"<\/span>=&gt;<span class=\"hljs-number\">500<\/span>, <span class=\"hljs-string\">\"backup\"<\/span>=&gt;<span class=\"hljs-keyword\">true<\/span>,\n     \u00a0\u00a0<span class=\"hljs-string\">\"url\"<\/span>=&gt;<span class=\"hljs-string\">\"https:\/\/...\/image\/upload\/v1398848970\/j6ayuxwr76qwvyjioq7b.jpg\"<\/span>, \u00a0\u00a0\u00a0\u00a0\n     \u00a0\u00a0<span class=\"hljs-string\">\"secure_url\"<\/span>=&gt;<span class=\"hljs-string\">\"https:\/\/...\/image\/upload\/v1398848970\/j6ayuxwr76qwvyjioq7b.jpg\"<\/span>\n     \u00a0}, \n     \u00a0...\n    ]}\n<\/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<p>You can then use the Admin\u2019s API <code>update<\/code> method to approve or reject images. The following sample code shows an approval request of a pending image with ID <code>j6ayuxwr76qwvyjioq7b<\/code>:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">Cloudinary::Api.update(<span class=\"hljs-string\">\"j6ayuxwr76qwvyjioq7b\"<\/span>, :<span class=\"hljs-function\"><span class=\"hljs-params\">moderation_status<\/span> =&gt;<\/span> <span class=\"hljs-string\">\"approved\"<\/span>)\n<\/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<p>Same goes for the rejection of pending images:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">Cloudinary::Api.update(<span class=\"hljs-string\">\"uznjsi2nzcbwqzacym7c\"<\/span>, :<span class=\"hljs-function\"><span class=\"hljs-params\">moderation_status<\/span> =&gt;<\/span> <span class=\"hljs-string\">\"rejected\"<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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<p>A notification callback (HTTP post) will be sent to your web application for each approval or rejection event, if you specified the <code>notification_url<\/code> while uploading images using the API.<\/p>\n<p>You can also use the API to list images that were approved or rejected. The output of these methods has the same format as the pending queue listing shown above. You can allow moderators to revisit their decision regarding the approved or rejected images, and you can call the <code>update<\/code> method again for the same images, based on their <code>public_id<\/code> value, to change their moderation status.<\/p>\n<p>The following sample code shows how to list approved and rejected images:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">approved_list = Cloudinary::Api.resources_by_moderation(<span class=\"hljs-string\">\"manual\"<\/span>, <span class=\"hljs-string\">\"approved\"<\/span>)\n \nrejected_list = Cloudinary::Api.resources_by_moderation(<span class=\"hljs-string\">\"manual\"<\/span>, <span class=\"hljs-string\">\"rejected\"<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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<h2>Summary<\/h2>\n<p>Moderation of user contributed content can be critical for modern websites and mobile applications. Cloudinary\u2019s image management solution makes it easy to implement an image moderation workflow on your service, while optimizing storage and delivery of images, and enabling easy on-the-fly transformation of images as well. We also showed how Cloudinary\u2019s powerful Admin API can be used to create a custom image moderation interface.<\/p>\n<p>In this post we covered manual moderation by trained staff, which can ensure almost 100% accuracy, but might be time consuming. Cloudinary also supports automatic image moderation &#8211; stay tuned for an upcoming blog post discussing this feature.<\/p>\n<p>The image moderation features discussed in this post, including the user interface and all API methods, are available for all Cloudinary plans, including the free tier. Try it out now by <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">creating a free account<\/a>. If you have any feedback or ideas on our manual image moderation, you\u2019re most welcome to <a href=\"https:\/\/cloudinary.com\/contact\">contact us<\/a>, or add a comment at the bottom of this post.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":23392,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[25,91,176,203,214,229,257],"class_list":["post-21231","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-asset-management","tag-django","tag-java","tag-moderation","tag-node","tag-php","tag-ruby-on-rails"],"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>Image moderation made easy using cloud-based UI &amp; API<\/title>\n<meta name=\"description\" content=\"Challenges of manually moderating images to keep out offensive or inappropriate content, and how to do it easily in the cloud with Cloudinary.\" \/>\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\/image_moderation_made_easy_using_cloud_based_ui_and_api\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Image moderation made easy using cloud-based UI and Cloudinary API\" \/>\n<meta property=\"og:description\" content=\"Challenges of manually moderating images to keep out offensive or inappropriate content, and how to do it easily in the cloud with Cloudinary.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-05-16T13:27:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-30T19:32:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1647048349\/56_image_moderation\/56_image_moderation-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=\"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\/image_moderation_made_easy_using_cloud_based_ui_and_api#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Image moderation made easy using cloud-based UI and Cloudinary API\",\"datePublished\":\"2014-05-16T13:27:11+00:00\",\"dateModified\":\"2025-03-30T19:32:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api\"},\"wordCount\":10,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647048349\/56_image_moderation\/56_image_moderation.jpg?_i=AA\",\"keywords\":[\"Asset Management\",\"Django\",\"Java\",\"Moderation\",\"Node\",\"PHP\",\"Ruby on Rails\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2014\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api\",\"url\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api\",\"name\":\"Image moderation made easy using cloud-based UI & API\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647048349\/56_image_moderation\/56_image_moderation.jpg?_i=AA\",\"datePublished\":\"2014-05-16T13:27:11+00:00\",\"dateModified\":\"2025-03-30T19:32:59+00:00\",\"description\":\"Challenges of manually moderating images to keep out offensive or inappropriate content, and how to do it easily in the cloud with Cloudinary.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647048349\/56_image_moderation\/56_image_moderation.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647048349\/56_image_moderation\/56_image_moderation.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Image moderation made easy using cloud-based UI and Cloudinary API\"}]},{\"@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\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Image moderation made easy using cloud-based UI & API","description":"Challenges of manually moderating images to keep out offensive or inappropriate content, and how to do it easily in the cloud with Cloudinary.","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\/image_moderation_made_easy_using_cloud_based_ui_and_api","og_locale":"en_US","og_type":"article","og_title":"Image moderation made easy using cloud-based UI and Cloudinary API","og_description":"Challenges of manually moderating images to keep out offensive or inappropriate content, and how to do it easily in the cloud with Cloudinary.","og_url":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api","og_site_name":"Cloudinary Blog","article_published_time":"2014-05-16T13:27:11+00:00","article_modified_time":"2025-03-30T19:32:59+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1647048349\/56_image_moderation\/56_image_moderation-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api"},"author":{"name":"","@id":""},"headline":"Image moderation made easy using cloud-based UI and Cloudinary API","datePublished":"2014-05-16T13:27:11+00:00","dateModified":"2025-03-30T19:32:59+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api"},"wordCount":10,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647048349\/56_image_moderation\/56_image_moderation.jpg?_i=AA","keywords":["Asset Management","Django","Java","Moderation","Node","PHP","Ruby on Rails"],"inLanguage":"en-US","copyrightYear":"2014","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api","url":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api","name":"Image moderation made easy using cloud-based UI & API","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647048349\/56_image_moderation\/56_image_moderation.jpg?_i=AA","datePublished":"2014-05-16T13:27:11+00:00","dateModified":"2025-03-30T19:32:59+00:00","description":"Challenges of manually moderating images to keep out offensive or inappropriate content, and how to do it easily in the cloud with Cloudinary.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647048349\/56_image_moderation\/56_image_moderation.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647048349\/56_image_moderation\/56_image_moderation.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/image_moderation_made_easy_using_cloud_based_ui_and_api#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Image moderation made easy using cloud-based UI and Cloudinary API"}]},{"@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":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1647048349\/56_image_moderation\/56_image_moderation.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21231","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\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21231"}],"version-history":[{"count":7,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21231\/revisions"}],"predecessor-version":[{"id":37319,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21231\/revisions\/37319"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/23392"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}